Announcement Announcement Module
Collapse
No announcement yet.
Spring Integration - Chain Processing Issue Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • Spring Integration - Chain Processing Issue

    Hi,

    I have following spring configuration :

    Code:
    <chain input-channel="customer.validate.insert" output-channel="avm.getApplicableAVM">
    		<header-enricher>
    			<header name="ERROR_CODE" ref="customerEngine" method="checkDuplicateRecord"
    				overwrite="true" />
    		</header-enricher>
    		<filter
    			expression="headers['ERROR_CODE'] == T(jatis.avantrade.foundation.model.constant.ReturnCode).DATA_NOT_EXISTS"
    			discard-channel="error" />
    
    		<header-enricher>
    			<header name="ERROR_CODE" ref="customerEngine" method="checkDuplicatePendingRecord"
    				overwrite="true" />
    		</header-enricher>
    		<filter
    			expression="headers['ERROR_CODE'] == T(jatis.avantrade.foundation.model.constant.ReturnCode).CODE_AVAILABLE"
    			discard-channel="error" />
    			<header-enricher>
    			<header name="ERROR_CODE" ref="customerEngine" method="checkAvailableIntegrity"
    				overwrite="true" />
    		</header-enricher>
    		<filter
    			expression="headers['ERROR_CODE'] == T(jatis.avantrade.foundation.model.constant.ReturnCode).VALID_REFERENTIAL_INTEGRITY"
    			discard-channel="error" />	
    	</chain>
    AND

    Code:
    <chain input-channel="fi.transaction.validate.submit.sell"
    		output-channel="avm.getApplicableAVM">
    		<header-enricher>
    			<header name="ERROR_CODE" ref="FITransactionEngine" method="checkRemainingFaceValue"
    				overwrite="true" />
    		</header-enricher>
    		<filter
    			expression="headers['ERROR_CODE'] == T(jatis.avantrade.foundation.model.constant.ReturnCode).FI_TRANSACTION_REMAINING_FACE_VALUE_VALID"
    			discard-channel="error" />
    
    		<header-enricher>
    			<header name="ERROR_CODE" ref="FITransactionEngine" method="checkSellType"
    				overwrite="true" />
    		</header-enricher>
    		<filter
    			expression="headers['ERROR_CODE'] == T(jatis.avantrade.foundation.model.constant.ReturnCode).FI_TRANSACTION_SELL_VALUE_VALID"
    			discard-channel="error" />
    	</chain>
    Question : is there is possible for chain processing jump to another chain accidentally?
    The reason i ask that is i have a problem with my spring configuration.
    For example when my payload going to customer.validate.insert, it will execute checkDuplicateRecord method, then checkDuplicatePendingRecord, and then normally it's must go to checkAvailableIntegrity.
    But sometimes it's process like this : checkDuplicateRecord, checkDuplicatePendingRecord, then jump to fi.transaction.validate.submit.sell channel to method checkRemainingFaceValue.
    So it's generate exception :

    Code:
    Caused by: org.springframework.integration.MessagingException: failed to transform message headers
    	at org.springframework.integration.transformer.HeaderEnricher.transform(HeaderEnricher.java:107)
    	at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:67)
    	... 153 more
    Caused by: org.springframework.integration.MessageHandlingException: org.springframework.expression.spel.SpelEvaluationException: EL1004E:(pos 8): Method call: Method checkRemainingFaceValue(jatis.avantrade.foundation.model.domain.Customer) cannot be found on jatis.avantrade.fi.model.engine.TransactionEngine$$EnhancerByCGLIB$$b6781c49 type
    	at org.springframework.integration.handler.MethodInvokingMessageProcessor.processMessage(MethodInvokingMessageProcessor.java:76)
    	at org.springframework.integration.transformer.HeaderEnricher$MethodInvokingHeaderValueMessageProcessor.processMessage(HeaderEnricher.java:215)
    	at org.springframework.integration.transformer.HeaderEnricher.transform(HeaderEnricher.java:99)
    	... 154 more
    Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1004E:(pos 8): Method call: Method checkRemainingFaceValue(jatis.avantrade.foundation.model.domain.Customer) cannot be found on jatis.avantrade.fi.model.engine.TransactionEngine$$EnhancerByCGLIB$$b6781c49 type
    	at org.springframework.expression.spel.ast.MethodReference.findAccessorForMethod(MethodReference.java:185)
    	at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:107)
    	at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:57)
    	at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:102)
    	at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:102)
    	at org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:114)
    	at org.springframework.integration.util.MessagingMethodInvokerHelper.processInternal(MessagingMethodInvokerHelper.java:220)
    	at org.springframework.integration.util.MessagingMethodInvokerHelper.process(MessagingMethodInvokerHelper.java:120)
    	at org.springframework.integration.handler.MethodInvokingMessageProcessor.processMessage(MethodInvokingMessageProcessor.java:73)
    	... 156 more
    This strange behavior is not only happen in this chain. Another chain sometime behave like this.
    Also, sometime it's process normally.

    Why this can happen ? is it's wrong in my configuration ? or it is bug in SI chain?

    Thanks!!

  • #2
    What you showing and explaining is absolutely impossible and I think we've already been through this, so asking the same question differently without trying any recommendations that I've provided will not get it solved any faster.
    You have one chain
    Code:
    <chain input-channel="customer.validate.insert" output-channel="avm.getApplicableAVM">
    which defines a clear path from 'customer.validate.insert' channel to 'avm.getApplicableAVM' channel, plus there is a possibility of a Message going to ErrorChannel ('error')

    Another chain defines a whole different input-channel. Unless you are doing manual bridging from 'avm.getApplicableAVM' or 'error' channel to 'fi.transaction.validate.submit.sell' channel, there is absolutely no way the message flow can jump from one chain to another.

    Please go through the process of elimination to determine what's wrong. First I would trace the state of the Message going into 'fi.transaction.validate.submit.sell' channel.

    Comment


    • #3
      Hi, thanks for your reply.

      I have check MessageHandlerChain code. Yes, you are right, jump to another chain is absolutely impossible, but this really happen now.

      ErrorChannel only redirect to one transformers.

      Code:
      <transformer input-channel="error" method="getErrorCode"
      		output-channel="reply" ref="HeaderUnwrapper">				
      </transformer>
      I am not doing manual bridging from 'avm.getApplicableAVM' or 'error' channel to 'fi.transaction.validate.submit.sell' channel.

      I have try your recommendation to inspect every message in my SI.

      Code:
      <gateway id="avantradeGateway"
      		service-interface="jatis.avantrade.foundation.model.integration.AvantradeGateway"
      		default-request-channel="request" default-reply-channel="reply" />
      
      	<channel id="request">
      		<interceptors>
      			<wire-tap channel="logger"/>
      			<ref bean="JatisChannelInterceptor"/>
      		</interceptors>
      	</channel>	
      	
      	<channel id="reply">
      		<interceptors>
      			<wire-tap channel="logger"/>
      			<ref bean="JatisChannelInterceptor"/>
      		</interceptors>
      	</channel>
      	
      	<channel id="error">
      		<interceptors>
      			<wire-tap channel="logger"/>
      			<ref bean="JatisChannelInterceptor"/>
      		</interceptors>
      	</channel>		
      	<logging-channel-adapter id="logger" level="DEBUG" log-full-message="true"/>
      I print every payload and message header using interceptor 'JatisChannelInterceptor'

      Code:
      public class JatisChannelInterceptor extends ChannelInterceptorAdapter {
      
      	private static final Logger logger = LogManager
      			.getLogger(JatisChannelInterceptor.class);
      
      	@Override
      	public Message<?> preSend(Message<?> message, MessageChannel channel) {
      		logger.info("start interceptor (preSend) at : " + new Date());
      		logger.info("preSend message : " + parseMessage(message));
      		logger.info("preSend channel : " + channel);
      		return super.preSend(message, channel);
      	}
      
      	@Override
      	public void postSend(Message<?> message, MessageChannel channel,
      			boolean sent) {
      		logger.info("start interceptor (postSend) at : " + new Date());
      		logger.info("postSend message : " + parseMessage(message));
      		logger.info("postSend channel : " + channel);
      		super.postSend(message, channel, sent);
      	}
      
      	@Override
      	public boolean preReceive(MessageChannel channel) {
      		logger.info("start interceptor (preReceive) at : " + new Date());
      		logger.info("preReceive channel : " + channel);
      		return super.preReceive(channel);
      	}
      	
      	@Override
      	public Message<?> postReceive(Message<?> message, MessageChannel channel) {
      		logger.info("start interceptor (postReceive) at : " + new Date());
      		logger.info("postReceive message : " + parseMessage(message));
      		logger.info("postReceive channel : " + channel);
      		return super.postReceive(message, channel);
      	}
      
      	private String parseMessage(Message<?> message) {
      		StringBuilder sb = new StringBuilder();
      		sb.append("payload : " + message.getPayload());
      		sb.append("message header : " + message.getHeaders());
      		return sb.toString();
      	}
      }
      Also, I put interceptor in my customerContext.xml :
      Code:
      <channel id="customer.validate.insert">
      		<interceptors>			
      			<ref bean="JatisChannelInterceptor" />
      		</interceptors>
      	</channel>
      	<channel id="customer.validate.delete">
      		<interceptors>			
      			<ref bean="JatisChannelInterceptor" />
      		</interceptors>
      	</channel>
      <chain input-channel="customer.validate.delete" output-channel="avm.getApplicableAVM">
      		<header-enricher>
      			<header name="ERROR_CODE" ref="customerEngine" method="checkDataVersion"
      				overwrite="true" />
      		</header-enricher>
      		<filter
      			expression="headers['ERROR_CODE'] == T(jatis.avantrade.foundation.model.constant.ReturnCode).VALID_DATA_VERSION"
      			discard-channel="error" />
      		<header-enricher>
      			<header name="ERROR_CODE" ref="customerEngine" method="checkPendingRecord"
      				overwrite="true" />
      		</header-enricher>
      		<filter
      			expression="headers['ERROR_CODE'] == T(jatis.avantrade.foundation.model.constant.ReturnCode).DATA_NOT_EXISTS_IN_PENDING_APPROVAL"
      			discard-channel="error" />
      		<header-enricher>
      			<header name="ERROR_CODE" ref="customerEngine" method="checkReferensialIntegrity"
      				overwrite="true" />
      		</header-enricher>
      		<filter
      			expression="headers['ERROR_CODE'] == T(jatis.avantrade.foundation.model.constant.ReturnCode).DATA_NOT_REFERENCED"
      			discard-channel="error" />
      	</chain>
      Last day, this problem is happen again when I delete the customer.

      Code:
      2011-07-05 09:30:30,884 INFO  [jatis.avantrade.foundation.model.integration.JatisChannelInterceptor] [t] - start interceptor (preSend) at : Tue Jul 05 09:30:30 WIT 2011
      2011-07-05 09:30:30,884 INFO  [jatis.avantrade.foundation.model.integration.JatisChannelInterceptor] [t] - preSend message : payload : jatis.avantrade.foundation.model.domain.Customer@31dd31ddmessage header : {MESSAGE_HEADER=[email protected]10, timestamp=1309833030715, replyChannel=org.springframework.integration.core.MessagingTemplate$TemporaryReplyChannel@4f244f24, id=cf46a551-5408-4af1-a014-3181238c7eaf, errorChannel=org.springframework.integration.core.MessagingTemplate$TemporaryReplyChannel@4f244f24, TRX_TYPE=DELETE_CUSTOMER}
      2011-07-05 09:30:30,884 INFO  [jatis.avantrade.foundation.model.integration.JatisChannelInterceptor] [t] - preSend channel : customer.validate.delete
      2011-07-05 09:30:30,885 INFO  [jatis.avantrade.foundation.model.engine.CustomerEngine] [t] - check version date
      2011-07-05 09:30:30,885 DEBUG [java.sql.Connection ] [t] - ooo Connection Opened
      2011-07-05 09:30:30,885 DEBUG [java.sql.PreparedStatement] [t] - ==>  Executing: select LAST_VERSION_DATE from MST_CUSTOMERS where CUSTOMER_ID = ? 
      2011-07-05 09:30:30,885 DEBUG [java.sql.PreparedStatement] [t] - ==> Parameters: [B@4fc84fc8(byte[])
      2011-07-05 09:30:30,886 DEBUG [java.sql.ResultSet  ] [t] - <==    Columns: LAST_VERSION_DATE
      2011-07-05 09:30:30,886 DEBUG [java.sql.ResultSet  ] [t] - <==        Row: 2011-04-26 11:29:11.64
      2011-07-05 09:30:30,886 DEBUG [java.sql.Connection ] [t] - xxx Connection Closed
      2011-07-05 09:30:30,886 DEBUG [jatis.avantrade.foundation.model.dao.CustomerDAO] [t] - [getCustomerVersionDate] customerId:3fa523aa-f55a-4ebe-a97d-e55d5a138761 result:Tue Apr 26 11:29:11 WIT 2011
      2011-07-05 09:30:30,886 INFO  [jatis.avantrade.foundation.model.engine.CustomerEngine] [t] - date : Tue Apr 26 11:29:11 WIT 2011 prVersionDate : Tue Apr 26 11:29:11 WIT 2011
      // this is checkPendingRecord log
      2011-07-05 09:30:30,887 DEBUG [java.sql.Connection ] [t] - ooo Connection Opened
      2011-07-05 09:30:30,887 DEBUG [java.sql.PreparedStatement] [t] - ==>  Executing: select count(DATA_ID) from COM_RESERVED_CODES where DATA_ID = ? and ROWNUM = 1 
      // this should be checkReferensialIntegrity
      2011-07-05 09:30:30,912 ERROR [jatis.avantrade.foundation.model.engine.CustomerEngine] [t] - org.springframework.integration.MessagingException: failed to transform message headers
      org.springframework.integration.transformer.MessageTransformationException: org.springframework.integration.MessagingException: failed to transform message headers
      	at org.springframework.integration.transformer.MessageTransformingHandler.handleRequestMessage(MessageTransformingHandler.java:73)
      .......// truncated
      
      Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1004E:(pos 8): Method call: Method checkRemainingInventory(jatis.avantrade.foundation.model.domain.Customer) cannot be found on jatis.avantrade.fi.model.engine.IPOOrderEngine$$EnhancerByCGLIB$$13daefe4 type
      	at org.springframework.expression.spel.ast.MethodReference.findAccessorForMethod(MethodReference.java:185)
      It's jump to another chain :
      Code:
      <channel id="fi.transaction.validate.submit.ipo">
      		<interceptors>			
      			<ref bean="JatisChannelInterceptor" />
      		</interceptors>
      	</channel>
      <chain input-channel="fi.transaction.validate.submit.ipo"
      		output-channel="avm.getApplicableAVM">
      
      		<header-enricher>
      			<header name="ERROR_CODE" ref="IPOOrderEngine" method="checkOfferingPeriod"
      				overwrite="true" />
      		</header-enricher>
      		<filter
      			expression="headers['ERROR_CODE'] == T(jatis.avantrade.foundation.model.constant.ReturnCode).FI_IPO_IN_OFFERING_PERIOD"
      			discard-channel="error" />		
      
      		<header-enricher>
      			<header name="ERROR_CODE" ref="IPOOrderEngine" method="checkRemainingInventory"
      				overwrite="true" />
      		</header-enricher>
      		<filter
      			expression="headers['ERROR_CODE'] == T(jatis.avantrade.foundation.model.constant.ReturnCode).FI_TRANSACTION_REMAINING_INVENTORY_VALID"
      			discard-channel="error" />
      	</chain>
      No log for 'fi.transaction.validate.submit.ipo' channel because it seem 'customer.validate.delete' jump to checkRemainingInventory directly.

      For this suggestion : trace the state of the Message going into 'fi.transaction.validate.submit.sell' channel.
      Any suggestion how can I do that ?
      I have no idea to trace message in that channel because from my explanation above, it's jump to another chain (no logger from my interceptor for that channel)
      customer.validate.insert => checkDuplicateRecord => checkDuplicatePendingRecord => checkRemainingFaceValue
      not
      customer.validate.insert => checkDuplicateRecord => checkDuplicatePendingRecord => fi.transaction.validate.submit.sell => checkRemainingFaceValue

      Thanks!

      Comment


      • #4
        Is there any chance you could create a minimal *failing* unit test with supporting code in order to reproduce this in the simplest possible form and in isolation? That would be most helpful for us.

        Thanks,
        Mark

        Comment


        • #5
          Hi Mark,

          Thanks for your reply.

          Sadly, I can not find the way to reproduce this problem, so I can't post something like unit test that you want.
          Until now, i see this problem as an 'unpredictable' problem. It's occur in random time and random SI chain.

          I will post that if i have find the way to reproduce this problem.

          Please give me another suggestion for this problem, since the application has been deployed to production environment.
          If this problem happen, i must restart the server (sound not good).

          Btw, until now, I never find this problem when i run this application and use apache tomcat as a server.
          This problem is occured in IBM WAS. Is there any issue if i running SI in IBM WAS ?

          FYI, I am using spring integration 2.0.0.

          Thanks!

          Comment


          • #6
            If you cannot isolate the problem by removing the extraneous components from your code, then it's nearly impossible for us to do so. Nobody else has ever reported an issue like this, so I think *you* reproducing it in a unit test is essential for us to know that there is a problem in our code and not yours. Until we have such a unit test, there's really not much we can do. Hopefully that makes sense.

            Any chance that you have multiple different versions (ie. WARs) running in the new environment?

            Regards,
            -Mark

            Comment


            • #7
              Yes, I agree with you. It's difficult to trace this problem if I can't reproduce this problem in an unit test.
              Again, I will give you if I have find it.

              For now, maybe I will try to change every chain in my configuration to simple endpoint and see if the problem is happen again.

              There is two WAR deployed in one server. But only one is started.

              Thanks!

              Comment


              • #8
                I still think you are chasing the wrong problem. As I said before, nothing in your stack trace from this or previous posts shows any channel resolution problem. However what I do see is attempt to call IPOOrderEngine.checkRemainingInventory(jatis.avant rade.foundation.model.domain.Customer) method which you already stated does not exists. So assuming that checkRemainingInventory(..) method takes the payload of the Message my question is why and how does it get the Message wit the wrong payload. It certainly not 'jumping' from the other chain. My guess is that there is a router at some point which does not properly route message. That's why I would trace every Message coming into that chain. You can also enable MessageHistory to see the full path of the Message: http://static.springsource.org/sprin...essage-history

                Comment


                • #9
                  Yes, method checkRemainingInventory(jatis.avantrade.foundation .model.domain.Customer) is not exists.
                  The signature for this method is :
                  Code:
                  public ReturnCode checkRemainingInventory(jatis.avantrade.fi.model.domain.OrderIPO order)
                  			throws JatisException {
                  }
                  See my logger output above. I pass jatis.avantrade.foundation.model.domain.Customer payload. So it's a correct payload.. If it's incorrect payload, the exception must be occured in checkDuplicateRecord and checkDuplicatePendingRecord method.
                  It' also correct to execute checkDuplicateRecord and checkDuplicatePendingRecord method.
                  But suddenly it's execute checkRemainingInventory with jatis.avantrade.foundation.model.domain.Customer payload so it's generate an exception.

                  Based on this stacktrace, I assume this problem is occured in chain processing.
                  Yes there is a router in 'avm.getApplicableAVM' channel. But is this relevant for this problem ? Since the problem is occured before my payload (jatis.avantrade.foundation.model.domain.Customer) go to 'avm.getApplicableAVM' channel.

                  For your reference, this is 'avm.getApplicableAVM channel configuration:
                  Code:
                  <beans:bean id="avmAdapter"
                  		class="jatis.avantrade.foundation.model.adapter.AVMAdapter" />
                  			
                  	<!-- AVM Gateway -->
                  
                  	<gateway id="avmGateway"
                  		service-interface="jatis.avantrade.foundation.model.integration.AVMGateway"
                  		default-request-channel="avm.action" default-reply-channel="reply" />
                  
                  	<channel id="avm.getApplicableAVM">
                  		<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>
                  		</interceptors>
                  	</channel>
                  
                  	<channel id="avm.setUpAVMRouter">
                  			<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.setUpAVMMaintenance" >
                  			<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.submit.router">
                  			<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.update.router">
                  			<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>
                  		</interceptors>
                  	</channel>
                  
                  	<channel id="avm.unlock.router">
                  			<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.approve.router">
                  			<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.approve.process">
                  			<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>
                  		</interceptors>
                  	</channel>
                  
                  	<channel id="avm.lastApproval.router">
                  			<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.lastApprovalMaintenance.process">
                  		<interceptors>			
                  			<ref bean="JatisChannelInterceptor"/>	
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.lastApprovalTransaction.process">
                  		<interceptors>			
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  
                  	<channel id="avm.reject">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.reject.begin.router">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.reject.end.router">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.reject.audit">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.rejectMaintenance.process">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.rejectTransaction.process">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.rejectTransaction.router">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  
                  	<channel id="avm.lock.router">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.action">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.approveTransaction">
                  	<interceptors>			
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.rejectTransaction">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.cancelTransaction">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.cancel.maintenance">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.cancel.transaction">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.cancel.transaction.router">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.submitTransaction">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  
                  	<channel id="avm.resubmit.entry">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.resubmit.insert.router">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.resubmit.update.router">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.resubmit.insert.check">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.resubmit.insert">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.resubmit.insert.process">		
                  	</channel>
                  
                  	<channel id="avm.resubmit.update.maintenance.process">		
                  	</channel>
                  
                  	<channel id="avm.resubmit.update.transaction.process">		
                  	</channel>
                  
                  	<channel id="avm.resubmit.update.transaction.router">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  
                  	<channel id="avm.resubmitTransaction">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.submit.noworkflow">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  
                  	<channel id="avm.setUpAVMTransaction">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.transaction.pending.router">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  	<channel id="avm.transaction.submit.router">
                  	<interceptors>
                  			<ref bean="JatisChannelInterceptor"/>				
                  		</interceptors>
                  	</channel>
                  
                  	<!-- common -->
                  	<header-value-router header-name="ACTION_TYPE"
                  		input-channel="avm.action">
                  		<mapping value="APPROVE_TRX" channel="avm.approve.router" />
                  		<mapping value="REJECT_TRX" channel="avm.reject.begin.router" />
                  		<mapping value="CANCEL_TRX" channel="avm.cancel.router" />
                  		<mapping value="RESUBMIT_TRX" channel="avm.resubmit.entry" />
                  	</header-value-router>
                  
                  <header-value-router header-name="TRX_TYPE"
                  		input-channel="avm.lock.router">
                  
                  <mapping value="CREATE_CUSTOMER" channel="customer.lock.insert" />
                  <mapping value="CREATE_FI_IPO_TRANSACTION" channel="avm.setUpAVMTransaction" />
                  </header-value-router>
                  
                  	<recipient-list-router input-channel="avm.setUpAVMMaintenance">
                  		<recipient channel="avm.submitTransaction" />
                  		<recipient channel="avm.lock.router" />
                  		<recipient channel="audit.submit" />
                  	</recipient-list-router>
                  
                  <recipient-list-router input-channel="avm.setUpAVMTransaction">
                  		<recipient channel="avm.transaction.submit.router" />
                  		<recipient channel="avm.transaction.pending.router" />
                  		<recipient channel="audit.submit" />
                  	</recipient-list-router>
                  
                  <header-value-router header-name="TRX_TYPE"
                  		input-channel="avm.transaction.pending.router">
                  <mapping value="CREATE_FI_IPO_TRANSACTION" channel="fi.transaction.ipo.insert.pending" />
                  </header-value-router>
                  
                  	<header-value-router header-name="TRX_TYPE"
                  		input-channel="avm.transaction.submit.router">
                  <mapping value="CREATE_FI_IPO_TRANSACTION" channel="fi.submit.ipo.splitter" />
                  </header-value-router>
                  
                  	<service-activator ref="avmAdapter" method="setUpAVMTransaction"
                  		input-channel="avm.submitTransaction" output-channel="reply" />
                  
                  <header-value-router header-name="TRX_TYPE"
                  		input-channel="avm.submit.router">
                  
                  <mapping value="CREATE_CUSTOMER" channel="customer.insert" />
                  	<mapping value="CREATE_FI_IPO_TRANSACTION" channel="fi.transaction.ipo.insert.approve.process" />
                  
                  </header-value-router>
                  
                  	<header-value-router header-name="TRX_TYPE"
                  		input-channel="avm.update.router">
                  
                  <mapping value="CREATE_FI_IPO_TRANSACTION" channel="fi.transaction.ipo.update.approve.process" />
                  
                  </header-value-router>
                  
                  	<recipient-list-router input-channel="avm.submit.noworkflow">
                  		<recipient channel="avm.submit.router" />
                  		<recipient channel="audit.submit" />
                  	</recipient-list-router>
                  I will try your suggestion for using MessageHistory to see what happen in my SI configuration

                  Thanks!

                  Comment


                  • #10
                    Hi,

                    Maybe there is a problem in ZK or IBM WAS ?
                    Last edited by issan86; Aug 8th, 2011, 03:27 AM.

                    Comment


                    • #11
                      More Info

                      Hi,

                      Here is how we managed to somehow replicate this issue. You need a WebSphere version 7 fixpack 17 and a cluster with 2 nodes all of this is on AIX with IBM JVM.

                      Your greatest chances of success is to deploy the same application twice with different context, start them both then restart WAS and make sure it starts both of them at startup. It may take a few attempts but it will happen.

                      We managed to connect a remote debuger to the WAS instance and we had a look at MessageHandlerChain.handlers and saw differences in the way the XML looks and how the handlers looked.

                      Example
                      XML
                      <chain>
                      <service-activator 1>
                      <service-activator 2>
                      <service-activator 3>
                      <service-activator 4>
                      </chain>

                      the List<MessageHandler> however had
                      service-activator 1,
                      service-activator 2,
                      service-activator 1,
                      service-activator 4 completely missing sa3 but having the expected number of handlers.

                      What was more interesting is that the ServiceActivatingHandler, MethodInvokingMessageProcessor, and MessagingMethodInvokerHelper were different but the targetObject was the same between sa1 & sa3 causing our flow to go nuts.

                      Hope this helps.

                      Comment


                      • #12
                        So, any idea how to fix it?

                        Comment


                        • #13
                          Jira

                          Created JIRA bug entry for it, also attached code to replicate

                          https://jira.springsource.org/browse/INT-2321

                          Comment


                          • #14
                            @FabianM

                            I replied in JIRA, but you or your friend has sent me the same code over the weekend via email and I've replied to that as well. As of right now the attached test case is not reproducing that's been described here. Please provide more details.

                            Comment

                            Working...
                            X