Message Detail using Flat file with a custom processor
This provides an example of enabling MessageDetail for a Custom InboundInterface with a processor.
Create an inbound interface with Custom format.
Provide processor name in Processor tab which will do all the inbound data handling.
Since this is a custom interface(for Flat files) we need to create new MessageQueue, MessageSource and MessageSourcePoll configuration. This is detailed under Integration -> Message and Message Queues.
External reference configuration for the queue + interface combination will be like below. (New queue in above step is created with name inbox/Flat for ProgressiveRetailer enterprise)
#* Ref Type,* External Value,Local ValuePLT.MessageDetail:Enable,100~inbox/Flat~ProgressiveRetailer~PTA.TestFlatFile_ORDER_IB~1.0,AllRecords,Message Detail enabledforall recordsThe sample flat file with 2 records that will be processed is as below:
TEST_ORDER_001CC DF0090016100Q000000SKU-9921RC-MIOL+BAL.3/4ASS 00900165002GRA 2MGB2016042523595920160504000000201605042359592016082409050020160824123000000000864.000110000000432RFR LR15AT49 CON-S-0130P1303908012016082906000020160829071500 00900161000000000001CON-S-0130LR1585MJ GPITEST_ORDER_002CC DF0090016100Q000000SKU-992260-MIOL+BAL.5¸ KYOWA00900165002GRA 2MGB2016042523595920160504000000201605042359592016082409050020160824123000000001890.000110000000630RFR LR15AT4A CON-S-0130P1303908012016082906000020160829071500 00900161000000000001CON-S-0130LR1585MJ GPISample code to Create and Save message detail records for both Success and error scenarios is as below. Raw data is formed while iterating the file and saved. After the DB write operation, the error and success records and fetched and message detail is created. Save is done in the finally block so that even when there are exceptions message detail is updated and saved.
// InitializationsModelDataService mds = Services.get(ModelDataService.class);MessageDetailServiceImpl objmesDetailServiceImpl =newMessageDetailServiceImpl();List<MessageDetail> messageDetails =newArrayList<>();com.onenetwork.platform.data.model.ModelList<Order> modelListMsg =null;HashMap mapTxnNoRawData =newHashMap<String, JSONArray>();// Iterating through file recordstry{while((flatFileRow = reader.nextRow()) !=null) {Order order =newOrder();OrderLineItem orderLineItem =newOrderLineItem();/*Logic to parse flat file records and populate order object goes here*/alstOrders.add(order);// Forming raw dataJSONArray arr =newJSONArray();arr.put(flatFileRow.getRawData());mapTxnNoRawData.put(order.getOrderNumber(), arr);}modelListMsg =newcom.onenetwork.platform.data.model.ModelList<Order>();modelListMsg.setCustomModelName(Order.STANDARD_MODEL_NAME);modelListMsg.setValueChainId(pltUserContext.getValueChainId());modelListMsg.setActionName("PLT.InsertOrUpdate");modelListMsg.getModels().addAll(alstOrders);String strProcessingErrors ="";intcounter =0;com.onenetwork.platform.data.model.ModelList<Order> modelList = mds.write(modelListMsg, pltUserContext);for(inti =0; i < modelListMsg.getModels().size(); i++) {strProcessingErrors =null;for(intj =0; j < modelList.getErrors().size(); j++) {if(modelListMsg.getModels().get(i).getOrderNumber().equals(modelList.getModels().get(j).getOrderNumber())) {strProcessingErrors = modelList.getErrors().get(j).toString();break;}}counter++;objmesDetailServiceImpl.createMessageDetail(""+ counter,strProcessingErrors,modelListMsg.getModels().get(i).getOrderNumber(),modelListMsg.getModels().get(i).getModelType().toString(),mapTxnNoRawData.get(modelListMsg.getModels().get(i).getOrderNumber()).toString(),message,messageDetails,pltUserContext);}}catch(Exception e) {if(modelListMsg !=null&& modelListMsg.getModels().size() >0) {updateMessgeDetailsWithError(messageDetails, modelListMsg, e.toString(), message, pltUserContext);}result = TaskResult.FAIL;thrownewRuntimeException("Exception while processing Order(s).. "+ e.toString());}finally{TransactionSupport.callWithNewTransaction(newjava.util.concurrent.Callable<Object>() {@OverridepublicObject call()throwsException {objmesDetailServiceImpl.saveMessageDetails(messageDetails, pltUserContext);returnnull;}});if(result ==null) {result = TaskResult.SUCCEED;}}privatevoidupdateMessgeDetailsWithError(List<MessageDetail> messageDetails,ModelList<Order> modelListMsg,String error,Message message,PlatformUserContext pltUserContext) {for(inti =0; i < modelListMsg.getModels().size(); i++) {objmesDetailServiceImpl.createMessageDetail(""+ i +1,error,modelListMsg.getModels().get(i).getOrderNumber(),modelListMsg.getModels().get(i).getModelType().toString(),mapTxnNoRawData.get(modelListMsg.getModels().get(i).getOrderNumber()).toString(),message,messageDetails,pltUserContext);}}}}}MessageDetailReport when added to the UIMM will be visible on UI under Message Queues menu (MessageQueues-Order-Flatfile)
Actual MessgeDetail report will look like: