1
votes

I have three different systems. I am using Spring integration to sync data in all these system.

System 1 calls --- > System 2 via http:inbound gateway

<int-http:inbound-gateway id="gateway"
    path="/save" supported-methods="POST, PUT"
    request-channel="requestChannel" reply-channel="replyChannel"
    request-payload-type="com.model.Request"
    mapped-request-headers="source" error-channel="errorChannel" />

System 2 will call service method to persist data which returns response if request is valid else throws exception

<int:service-activator ref="serviceMethod"
    method="saveIfValid" input-channel="requestChannel"
    output-channel="serviceOutput" />

<int:recipient-list-router id="id1"
    input-channel="serviceOutput">
    <int:recipient channel="system1" />
    <int:recipient channel="system3" />
</int:recipient-list-router>

I need to send service method response to system 1 and system 3 only if operation is successful. After calling service method, based on service method response, request for system 3 will be generated using transformer. After transformer I am putting request in mq queue.

<int:transformer id="transformer1"
    method="convert" input-channel="system3"
    output-channel="jmsInput">
    <bean
        class="com.transformer.System3Transformer" />
</int:transformer> 


<int-jms:outbound-channel-adapter id="adapter"
    channel="jmsInput" destination-name="queueName">
</int-jms:outbound-channel-adapter>

Updated JMS outbound code

<int-jms:outbound-channel-adapter id="jms1"
		channel="jmsIn" destination-name="queueName">
		<int-jms:request-handler-advice-chain>
			<bean
				class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
				 <property name="onSuccessExpression" value="T(Boolean).TRUE" />
				<property name="successChannelName" value="afterSuccessDeleteChannel" />
			    <property name="onFailureExpression" value="T(Boolean).FALSE" />
				<property name="failureChannelName" value="afterFailRenameChannel" />
			</bean>
		</int-jms:request-handler-advice-chain>
	</int-jms:outbound-channel-adapter>

My question is

  • if service class fails I need to send error response and stop the flow
  • if service method successful persisted data, but transformation fails, system 1 should get success response and error should be logged.
  • Here as I am using error channel in outbound adapter, even if error occurs in transformer it is returned to system 1.
  • please suggest how can i handle error without using global error channel and how to handle error in jms outbound adapter.
    • thank you for answering my quesion
1

1 Answers

0
votes

For the first case you should really just rely on the exception propagation - the flow stops and error is sent to the system1 as an HTTP response.

For the second (transformer) case you should take a look into the ExpressionEvaluatingRequestHandlerAdvice and use it with the <request-handler-advice-chain> for the <transformer>.

The same can be applied for the <int-jms:outbound-channel-adapter>, if you should acknowledge to the system1.

http://docs.spring.io/spring-integration/reference/html/messaging-endpoints-chapter.html#expression-advice

https://github.com/spring-projects/spring-integration-samples/tree/master/intermediate/retry-and-more