Apache Camel:具有不同端点的InOut

时间:2014-06-12 11:22:47

标签: spring request apache-camel ibm-mq reply

目前我正在使用apache camel来编写和读取Websphere MQ。

在我的项目中,我有2个WMQ:1个用于写入(Queue.W),1个用于读取(Queue.R)。以下是我配置应用的方式:

<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:mobako.sender.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" pattern="InOnly"/>
            <to uri="direct:result" pattern="InOut"/>
        </route>
        <route>
            <from uri="jms:queue:Queue.R"/>
            <marshal ref="xmljson"/>
            <to uri="direct:result"/>
        </route>

    </camelContext>

</beans>

我想要做的是:在第一次流程中将读取队列(Queue.R)的响应发送回http端点。

为了实现这一点,我尝试使用InOut模式。但是,似乎InOut模式仅在我具有相同端点时才起作用(例如,如果我的第一个流上的出站是Queue.W,那么我的第二个流上的入站也应该是Queue.W)。但是,由于我使用不同的WMQ进行写入和读取,我无法使其工作。

从我的配置中可以看出,我尝试通过在我的Queue.W中添加inOnly模式然后添加

来解决它
<to uri="direct:result" pattern="InOut"/>

在我的第二个流程之后,我尝试通过添加

从Queue.R发送回来
<to uri="direct:result"/>

但它也没用!而且,在我这样做之后,我得到了以下错误:

  

org.apache.camel.component.direct.DirectConsumerNotAvailableException:   端点上没有可用的消费者:端点[direct:// result]。   交流[消息:http://security.fraport.de/zks-eap/uebermittleAusweisdaten urn:uuid:ID-FRA000000085404-64407-1402571267690-0-2esbp://services.fraport.de/lsmh/mobakoesbp://services.fraport.de/lsmh/zks-eapesbp ://services.fraport.de/lsmh/mobako12.1]     在   org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:47)     在   org.apache.camel.processor.SendProcessor.process(SendProcessor.java:113)     在   org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72)     在   org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398)     在   org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)     在org.apache.camel.processor.Pipeline.process(Pipeline.java:118)at   org.apache.camel.processor.Pipeline.process(Pipeline.java:80)at   org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)     在   org.apache.camel.component.jetty.CamelContinuationServlet.service(CamelContinuationServlet.java:149)     在javax.servlet.http.HttpServlet.service(HttpServlet.java:668)at   org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)     在   org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1496)     在   org.eclipse.jetty.servlets.MultiPartFilter.doFilter(MultiPartFilter.java:136)     在   org.apache.camel.component.jetty.CamelFilterWrapper.doFilter(CamelFilterWrapper.java:44)     在   org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1467)     在   org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499)     在   org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)     在   org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428)     在   org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)     在   org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)     在   org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)     在org.eclipse.jetty.server.Server.handle(Server.java:370)处   org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)     在   org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)     在   org.eclipse.jetty.server.AbstractHttpConnection $ RequestHandler.headerComplete(AbstractHttpConnection.java:1033)     在org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644)     在   org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)     在   org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)     在   org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:667)     在   org.eclipse.jetty.io.nio.SelectChannelEndPoint $ 1.run(SelectChannelEndPoint.java:52)     在   org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)     在   org.eclipse.jetty.util.thread.QueuedThreadPool $ 3.run(QueuedThreadPool.java:543)     在java.lang.Thread.run(未知来源)

有关如何解决我的问题的任何消息?非常感谢。非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我不知道InOut模式是否设计用于direct:路由。

如您所述,InOut旨在与(例如,使用JMS消息)一起使用,您可以从同一端点(例如,JMS队列)发送和解析响应。

对于带有JMS消息的InOut,有很多关于相关ID的功能,以便使其工作 - 这就是我无法看到的原因如何使用direct:xyz端点干净地工作。

相反,为什么不将两条路线分开,如果你需要同步它们(以便你确认得到了回应),请使用完成超时的第三条路线。

    <route>
        <from uri="jetty:http://localhost:8888/uebermittleAusweisdaten"/>
        <!-- ... -->
        <to uri="jms:queue:Queue.W" pattern="InOnly"/>
        <!-- set Body or Property with some unique ID to indicate request -->
        <to uri="direct:responseChecker"/>
    </route>
    <route>
        <from uri="jms:queue:Queue.R"/>
        <marshal ref="xmljson"/>
        <!-- set Body or Property with some unique ID to indicate response -->
        <to uri="direct:responseChecker"/>
    </route>
    <route>
        <from uri="direct:responseChecker"/>
        <!-- check request vs response, use a bean / aggregator with a completion timeout -->
    </route>

我希望这有帮助!祝你好运。