Search code examples
httprequestapache-camelibm-mqreply

How to configure Request Reply from 2 Different Routes in Apache Camel?


currently I am working with apache camel. In my application I have 2 routes.

The first route contain HTTP as the input, some processes, and WMQ (this WMQ used for write only)

On the second route, I have WMQ (used for read only) for the from tag and some mapping processes.

What I want to do is sending the response from the WMQ on my second route to my HTTP on my first route.

How to do so?

Here is my configuration so far.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p" default-init-method="init" xmlns:util="http://www.springframework.org/schema/util" xmlns:osgi="http://www.springframework.org/schema/osgi" xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xs http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd http://www.springframework.org/schema/osgi  http://www.springframework.org/schema/osgi/spring-osgi.xsd">

    <import resource="classpath:/META-INF/spring/components.xml"/>

    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">

        <dataFormats>
            <xmljson id="xmljson" forceTopLevelObject="true" skipNamespaces="true" removeNamespacePrefixes="true"/>
        </dataFormats>

        <route>
            <from uri="jetty:http://localhost:8888/uebermittleAusweisdaten"/>
            <process ref="TransformToXML"/>
            <to uri ="xslt:soap-template.xsl"/>
            <setHeader headerName="CamelJmsDestinationName">
                <constant>queue:///Queue.w?targetClient=1</constant>    
            </setHeader>
            <setHeader headerName="JMS_IBM_Character_Set">
                <constant>ISO8859_1</constant>    
            </setHeader>
            <to uri="jms:queue:Queue.w"/>
            <inOut uri="mock:result"/>
        </route>
        <route>
            <from uri="jms:queue:queue.r"/>
            <marshal ref="xmljson"/>
            <setHeader headerName="CamelJmsDestinationName">
                <constant>mock:result</constant>    
            </setHeader>
            <to uri="stream:out"/>
        </route>

    </camelContext>

</beans>

Thanks in advance.


Solution

  • Use the InOut pattern:

    <to uri="jms:queue:LSMH.ZKSEAP.SERVICEBUS" pattern="InOut" />
    

    Using InOut, Camel will send the reply back to the JMSReplyTo queue, see the Camel docs for further infos.

    A simple setup would look as follows:

    <route>
        <from uri="direct:start" />
        <to uri="jms:myQueue" pattern="InOut" />
        <log message="Received body in sending route: ${body}" />
    </route>
    <route>
        <from uri="jms:myQueue" />
        <setBody><simple>${body}, World!</simple></setBody>
    </route>
    

    Sending Hello to direct:start would lead to following log message:

    Received body in sending route: Hello, World!