2

I hear that java service run faster than using flow service. But when I tried to change my flow service into java service, I only got the same process time. Here's the capture :

Before Java Service

After using Java Service

And here's my code of the java service

try{

String dateTime = "";
String SCDataFound = "";
String  startDate = "";
String  endDate = "";
IData output = null;
IDataCursor outputCursor = null;
IData input = IDataFactory.create();
IDataCursor inputCursor = input.getCursor();
// pipeline
IDataCursor pipelineCursor = pipeline.getCursor();
        startDate = IDataUtil.getString( pipelineCursor, "startDate" );
        endDate = IDataUtil.getString( pipelineCursor, "endDate" );
pipelineCursor.destroy();

if(startDate==null&&endDate==null){
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date date = new Date();
    String theDate = dateFormat.format(date);
    SCDataFound = "";
    dateTime = "and b.document_date ='" +theDate+"'";
}else{
    String startTimeClause = "and b.create_date>=to_date('"+startDate+"' 00:00:00','yyyyMMdd HH24:MI:SS')";
    String endTimeClause = "and b.create_date<=to_date('"+endDate+"' 23:59:59','yyyyMMdd HH24:MI:SS')";
    dateTime = startTimeClause.concat(endTimeClause); 
}

IDataUtil.put( inputCursor,  "dateTime", dateTime);
IDataUtil.put( inputCursor,  "procStatus", "('4', '1', '5')");
IDataUtil.put( inputCursor,  "providerCd", "c.provider_code='SPN02' and B.TRXTYPE='1' and");
IDataUtil.put( inputCursor,  "legStatus", "SC");
IDataUtil.put( inputCursor,  "tableResponse", "SPAN_HOST_SC_RESPONSE");
IDataUtil.put( inputCursor,  "addClause", "and b.BATCHID=d.BATCHID");
inputCursor.destroy();
output = wmDoInvoke("mandiri.span.db.service", "getSPANSummaries", input);

outputCursor = output.getCursor();
IData[] summariesDatas = IDataUtil.getIDataArray( outputCursor, "SPANSummaries" );
IData[] newSummariesDatas = new IData[summariesDatas.length];
outputCursor.destroy(); 
if ( summariesDatas != null)
    {
        for ( int i = 0; i < summariesDatas.length; i++ )
        {
            newSummariesDatas [i] = IDataFactory.create();
            IDataCursor newSummariesDatasCursor = newSummariesDatas[i].getCursor();
            IDataCursor summariesDatasCursor  = summariesDatas[i].getCursor();
            IDataUtil.put( newSummariesDatasCursor, "FILE_NAME",IDataUtil.getString( summariesDatasCursor, "FILE_NAME" ));
            IDataUtil.put( newSummariesDatasCursor, "RETRY_STATUS_L1", IDataUtil.getString( summariesDatasCursor, "RETRY_STATUS" ) );
            IDataUtil.put( newSummariesDatasCursor, "RETUR_STATUS", IDataUtil.getString( summariesDatasCursor, "RETUR_STATUS" ) );
            IDataUtil.put( newSummariesDatasCursor, "SUCCESS_STATUS_L1", IDataUtil.getString( summariesDatasCursor, "SUCCESS_STATUS" ) );
            IDataUtil.put( newSummariesDatasCursor, "TOTAL_AMOUNT", IDataUtil.getString( summariesDatasCursor, "TOTAL_AMOUNT" ) );
            IDataUtil.put( newSummariesDatasCursor, "TOTAL_RECORD", IDataUtil.getString( summariesDatasCursor, "TOTAL_RECORD" ) );
            IDataUtil.put( newSummariesDatasCursor, "PROC_STATUS", IDataUtil.getString( summariesDatasCursor, "PROC_STATUS" ) );
            IDataUtil.put( newSummariesDatasCursor, "BATCHID", IDataUtil.getString( summariesDatasCursor, "BATCHID" ) );
            IDataUtil.put( newSummariesDatasCursor, "UPDATE_DATE", IDataUtil.getString( summariesDatasCursor, "UPDATE_DATE" ) );
            IDataUtil.put( newSummariesDatasCursor, "CREATE_DATE", IDataUtil.getString( summariesDatasCursor, "CREATE_DATE" ) );
            IDataUtil.put( newSummariesDatasCursor, "TOTAL_PROCESS", IDataUtil.getString( summariesDatasCursor, "TOTAL_PROCESS" ) );
            IDataUtil.put( newSummariesDatasCursor, "FORCED_ACK", IDataUtil.getString( summariesDatasCursor, "FORCED_ACK" ) );
            IDataUtil.put( newSummariesDatasCursor, "LEGSTATUS", IDataUtil.getString( summariesDatasCursor, "LEGSTATUS" ) );
            IDataUtil.put( newSummariesDatasCursor, "DOCUMENT_DATE", IDataUtil.getString( summariesDatasCursor, "DOCUMENT_DATE" ) );
        }
}

IDataUtil.put( inputCursor,  "dateTime", dateTime);
IDataUtil.put( inputCursor,  "procStatus", "('4', '1', '5')");
IDataUtil.put( inputCursor,  "providerCd", "c.provider_code='SPN02' and B.TRXTYPE='1' and");
IDataUtil.put( inputCursor,  "legStatus", "SC");
IDataUtil.put( inputCursor,  "tableResponse", "SPAN_HOST_RESPONSE");
IDataUtil.put( inputCursor,  "addClause", "");
inputCursor.destroy();
output = wmDoInvoke("mandiri.span.db.service", "getSPANSummaries", input);
outputCursor = output.getCursor();
IData[] summariesDatas1 = IDataUtil.getIDataArray( outputCursor, "SPANSummaries" );
IData[] newSummariesDatas1 = new IData[summariesDatas1.length];
outputCursor.destroy(); 
if ( summariesDatas1 != null)
    {
        for ( int i = 0; i < summariesDatas1.length; i++ )
        {
            newSummariesDatas1 [i] = IDataFactory.create();
            IDataCursor newSummariesDatasCursor1 = newSummariesDatas1[i].getCursor();
            IDataCursor summariesDatasCursor1  = summariesDatas1[i].getCursor();
            IDataUtil.put( newSummariesDatasCursor1, "FILE_NAME",IDataUtil.getString( summariesDatasCursor1, "FILE_NAME" ));
            IDataUtil.put( newSummariesDatasCursor1, "RETRY_STATUS_L1", IDataUtil.getString( summariesDatasCursor1, "RETRY_STATUS" ) );
            IDataUtil.put( newSummariesDatasCursor1, "RETUR_STATUS", IDataUtil.getString( summariesDatasCursor1, "RETUR_STATUS" ) );
            IDataUtil.put( newSummariesDatasCursor1, "SUCCESS_STATUS_L1", IDataUtil.getString( summariesDatasCursor1, "SUCCESS_STATUS" ) );
            IDataUtil.put( newSummariesDatasCursor1, "TOTAL_AMOUNT", IDataUtil.getString( summariesDatasCursor1, "TOTAL_AMOUNT" ) );
            IDataUtil.put( newSummariesDatasCursor1, "TOTAL_RECORD", IDataUtil.getString( summariesDatasCursor1, "TOTAL_RECORD" ) );
            IDataUtil.put( newSummariesDatasCursor1, "PROC_STATUS", IDataUtil.getString( summariesDatasCursor1, "PROC_STATUS" ) );
            IDataUtil.put( newSummariesDatasCursor1, "BATCHID", IDataUtil.getString( summariesDatasCursor1, "BATCHID" ) );
            IDataUtil.put( newSummariesDatasCursor1, "UPDATE_DATE", IDataUtil.getString( summariesDatasCursor1, "UPDATE_DATE" ) );
            IDataUtil.put( newSummariesDatasCursor1, "CREATE_DATE", IDataUtil.getString( summariesDatasCursor1, "CREATE_DATE" ) );
            IDataUtil.put( newSummariesDatasCursor1, "TOTAL_PROCESS", IDataUtil.getString( summariesDatasCursor1, "TOTAL_PROCESS" ) );
            IDataUtil.put( newSummariesDatasCursor1, "FORCED_ACK", IDataUtil.getString( summariesDatasCursor1, "FORCED_ACK" ) );
            IDataUtil.put( newSummariesDatasCursor1, "LEGSTATUS", IDataUtil.getString( summariesDatasCursor1, "LEGSTATUS" ) );
            IDataUtil.put( newSummariesDatasCursor1, "DOCUMENT_DATE", IDataUtil.getString( summariesDatasCursor1, "DOCUMENT_DATE" ) );
        }
}

IDataUtil.put( inputCursor,  "dateTime", dateTime);
IDataUtil.put( inputCursor,  "procStatus", "('4', '1', '5')");
IDataUtil.put( inputCursor,  "providerCd", "c.provider_code='SPN02' and B.TRXTYPE='1' and");
IDataUtil.put( inputCursor,  "legStatus", "L2");
IDataUtil.put( inputCursor,  "tableResponse", "SPAN_HOST_RESPONSE");
IDataUtil.put( inputCursor,  "addClause", "");
inputCursor.destroy();
output = wmDoInvoke("mandiri.span.db.service", "getSPANSummaries", input);
outputCursor = output.getCursor();
IData[] summariesDatas2 = IDataUtil.getIDataArray( outputCursor, "SPANSummaries" );
IData[] newSummariesDatas2 = new IData[summariesDatas2.length];
outputCursor.destroy(); 
if ( summariesDatas2 != null)
    {
        for ( int i = 0; i < summariesDatas2.length; i++ )
        {
            newSummariesDatas2 [i] = IDataFactory.create();
            IDataCursor newSummariesDatasCursor2 = newSummariesDatas2[i].getCursor();
            IDataCursor summariesDatasCursor2  = summariesDatas2[i].getCursor();
            IDataUtil.put( newSummariesDatasCursor2, "FILE_NAME",IDataUtil.getString( summariesDatasCursor2, "FILE_NAME" ));
            IDataUtil.put( newSummariesDatasCursor2, "RETRY_STATUS_L2", IDataUtil.getString( summariesDatasCursor2, "RETRY_STATUS" ) );
            IDataUtil.put( newSummariesDatasCursor2, "RETUR_STATUS", IDataUtil.getString( summariesDatasCursor2, "RETUR_STATUS" ) );
            IDataUtil.put( newSummariesDatasCursor2, "SUCCESS_STATUS_L2", IDataUtil.getString( summariesDatasCursor2, "SUCCESS_STATUS" ) );
            IDataUtil.put( newSummariesDatasCursor2, "TOTAL_AMOUNT", IDataUtil.getString( summariesDatasCursor2, "TOTAL_AMOUNT" ) );
            IDataUtil.put( newSummariesDatasCursor2, "TOTAL_RECORD", IDataUtil.getString( summariesDatasCursor2, "TOTAL_RECORD" ) );
            IDataUtil.put( newSummariesDatasCursor2, "PROC_STATUS", IDataUtil.getString( summariesDatasCursor2, "PROC_STATUS" ) );
            IDataUtil.put( newSummariesDatasCursor2, "BATCHID", IDataUtil.getString( summariesDatasCursor2, "BATCHID" ) );
            IDataUtil.put( newSummariesDatasCursor2, "UPDATE_DATE", IDataUtil.getString( summariesDatasCursor2, "UPDATE_DATE" ) );
            IDataUtil.put( newSummariesDatasCursor2, "CREATE_DATE", IDataUtil.getString( summariesDatasCursor2, "CREATE_DATE" ) );
            IDataUtil.put( newSummariesDatasCursor2, "TOTAL_PROCESS", IDataUtil.getString( summariesDatasCursor2, "TOTAL_PROCESS" ) );
            IDataUtil.put( newSummariesDatasCursor2, "FORCED_ACK", IDataUtil.getString( summariesDatasCursor2, "FORCED_ACK" ) );
            IDataUtil.put( newSummariesDatasCursor2, "LEGSTATUS", IDataUtil.getString( summariesDatasCursor2, "LEGSTATUS" ) );
            IDataUtil.put( newSummariesDatasCursor2, "DOCUMENT_DATE", IDataUtil.getString( summariesDatasCursor2, "DOCUMENT_DATE" ) );
        }
}

IDataUtil.put( inputCursor,  "dateTime", dateTime);
IDataUtil.put( inputCursor,  "procStatus", "('4', '1', '5')");
IDataUtil.put( inputCursor,  "providerCd", "c.provider_code='SPN02' and B.TRXTYPE='1' and");
IDataUtil.put( inputCursor,  "legStatus", "L1");
IDataUtil.put( inputCursor,  "tableResponse", "SPAN_HOST_RESPONSE");
IDataUtil.put( inputCursor,  "addClause", "");
inputCursor.destroy();
output = wmDoInvoke("mandiri.span.db.service", "getSPANSummaries", input);
outputCursor = output.getCursor();
IData[] summariesDatas3 = IDataUtil.getIDataArray( outputCursor, "SPANSummaries" );
IData[] newSummariesDatas3 = new IData[summariesDatas3.length];
outputCursor.destroy(); 
if ( summariesDatas3 != null)
    {
        for ( int i = 0; i < summariesDatas3.length; i++ )
        {
            newSummariesDatas3 [i] = IDataFactory.create();
            IDataCursor newSummariesDatasCursor3 = newSummariesDatas3[i].getCursor();
            IDataCursor summariesDatasCursor3  = summariesDatas3[i].getCursor();
            IDataUtil.put( newSummariesDatasCursor3, "FILE_NAME",IDataUtil.getString( summariesDatasCursor3, "FILE_NAME" ));
            IDataUtil.put( newSummariesDatasCursor3, "RETRY_STATUS_L1", IDataUtil.getString( summariesDatasCursor3, "RETRY_STATUS" ) );
            IDataUtil.put( newSummariesDatasCursor3, "RETUR_STATUS", IDataUtil.getString( summariesDatasCursor3, "RETUR_STATUS" ) );
            IDataUtil.put( newSummariesDatasCursor3, "SUCCESS_STATUS_L1", IDataUtil.getString( summariesDatasCursor3, "SUCCESS_STATUS" ) );
            IDataUtil.put( newSummariesDatasCursor3, "TOTAL_AMOUNT", IDataUtil.getString( summariesDatasCursor3, "TOTAL_AMOUNT" ) );
            IDataUtil.put( newSummariesDatasCursor3, "TOTAL_RECORD", IDataUtil.getString( summariesDatasCursor3, "TOTAL_RECORD" ) );
            IDataUtil.put( newSummariesDatasCursor3, "PROC_STATUS", IDataUtil.getString( summariesDatasCursor3, "PROC_STATUS" ) );
            IDataUtil.put( newSummariesDatasCursor3, "BATCHID", IDataUtil.getString( summariesDatasCursor3, "BATCHID" ) );
            IDataUtil.put( newSummariesDatasCursor3, "UPDATE_DATE", IDataUtil.getString( summariesDatasCursor3, "UPDATE_DATE" ) );
            IDataUtil.put( newSummariesDatasCursor3, "CREATE_DATE", IDataUtil.getString( summariesDatasCursor3, "CREATE_DATE" ) );
            IDataUtil.put( newSummariesDatasCursor3, "TOTAL_PROCESS", IDataUtil.getString( summariesDatasCursor3, "TOTAL_PROCESS" ) );
            IDataUtil.put( newSummariesDatasCursor3, "FORCED_ACK", IDataUtil.getString( summariesDatasCursor3, "FORCED_ACK" ) );
            IDataUtil.put( newSummariesDatasCursor3, "LEGSTATUS", IDataUtil.getString( summariesDatasCursor3, "LEGSTATUS" ) );
            IDataUtil.put( newSummariesDatasCursor3, "DOCUMENT_DATE", IDataUtil.getString( summariesDatasCursor3, "DOCUMENT_DATE" ) );
        }
}



//

/*IData[] mergedArray1= (IData[]) ArrayUtils.addAll(newSummariesDatas,newSummariesDatas1); 
IData[] mergedArray2 = (IData[]) ArrayUtils.addAll(mergedArray1,newSummariesDatas2);
IData[] mergedArray3 = (IData[]) ArrayUtils.addAll(mergedArray2,newSummariesDatas3);
*/

IData[] mergedArray1= combine(newSummariesDatas,newSummariesDatas1); 
IData[] mergedArray2 = combine(mergedArray1,newSummariesDatas2);
IData[] mergedArray3 = combine(mergedArray2,newSummariesDatas3);


IDataCursor pipelineCursor_1 = pipeline.getCursor();
IDataUtil.put( pipelineCursor_1, "SPANSummaries", mergedArray3 );
pipelineCursor_1.destroy();


//

}catch(Exception e){
e.printStackTrace();
}

How can I get faster flow service?

Anthon
  • 69,918
  • 32
  • 186
  • 246
Ahmad asy'ary
  • 77
  • 2
  • 9

2 Answers2

2

I would venture to suggest that all the real work is being done (and hence time being spent) in the mandiri.span.db.service:getSPANSummaries service. Your flow service and equivalent Java services are merely orchestrating calls to that in between some simple mapping steps. If you need more speed, I would look at that service.

Also, apart from calling getSPANSummaries, most of what your Java service is doing involves retrieving and storing values from/to the pipeline via IDataUtil, which is pretty much what the Flow does and so will use equivalent time.

Often WM applications are I/O bound - typically JDBC or HTTP calls over the wire - and in those cases the difference between Flow and Java is probably too small to measure, or too insignificant to bother about. But Flow is executed by an interpreter running on top of another interpreter (JVM). It also has more restricted ways of operating e.g. all pipeline/variable/document accesses involve potentially nested IData/Hashmap/ArrayList accesses, and it can take several Flow steps to do what could be done in a single Java statement. Consequently, pure Java can be faster for problems that are not I/O bound. But not, I suspect, in this particular service.

Michael Lemaire
  • 746
  • 1
  • 6
  • 18
2

I think you have created the Java service by Generating code of a current flow service. Java service runs much faster than a Flow service in scenarios where there are more processing steps for example nested loops.

Adhiraj
  • 81
  • 1
  • 6