1

現在、Websphere MQ から読み書きするために apache camel を使用しています。

私のプロジェクトでは、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 の場合、2 番目のフローの受信も Queue.W である必要があります)。しかし、書き込み用と読み取り用に別の WMQ を使用したため、動作させることができません。

私の構成でわかるように、inOnlyパターンをQueue.Wに追加してから追加することで解決しようとしました

<to uri="direct:result" pattern="InOut"/>

その後、2 番目のフローで、追加して Queue.R からの応答を送り返そうとしました。

<to uri="direct:result"/>

しかし、それもうまくいきませんでした!さらに、そうした後、次のエラーが発生しました。

org.apache.camel.component.direct.DirectConsumerNotAvailableException: エンドポイントで使用できるコンシューマーがありません: エンドポイント[direct://result]。Exchange[メッセージ: http://security.fraport.de/zks-eap/uebermittleAusweisdatenurn: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) で org.apache.camel.processor.Pipeline.process(Pipeline.java:80) で org.apache.camel.processor. CamelInternalProcessor。プロセス (CamelInternalProcessor.java:191) で org.apache.camel.component.jetty.CamelContinuationServlet.service(CamelContinuationServlet.java:149) で javax.servlet.http.HttpServlet.service(HttpServlet.java:668) で 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. org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:) の eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499)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) at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644) at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) at 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. java.lang.Thread.run の util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) (不明なソース)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(不明なソース)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(不明なソース)

私の問題を解決する方法について何か提案はありますか? 本当にありがとう。あなたの助けはとても感謝しています!

4

1 に答える 1

1

InOutパターンがdirect:ルートで使用するように設計されているかどうかはわかりません。

ご指摘のとおりInOut、同じエンドポイント (JMS Queue など) から応答を送信および送信する場所 (JMS メッセージなど) で使用するように設計されています。

JMS メッセージの場合、InOut内部で相関 ID を機能させるための機能がたくさんありdirect:xyzます。

代わりに、2 つのルートを分離しないでください。それらを同期する必要がある場合は (応答があることを確認するために)、完了タイムアウトのある 3 番目のルートを使用してください。

    <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>

これが役立つことを願っています!幸運を。

于 2014-06-12T13:38:26.067 に答える