0

JMS をトランスポートとして使用する 2 つの CXF エンドポイントがあります。1 つはコンシューマーとして使用され、もう 1 つはプロデューサーとして使用されます。これは非常にトリミングされたセットアップです。

<camelcxf:cxfEndpoint xmlns:i="http://inbound.com/inbound"
                      id="myInboundEndpoint"
                      endpointName="i:InboundService"
                      serviceName="i:InboundService"
                      address="camel://direct:my-inbound-route"
                      serviceClass="com.InboundService"
                      bus="cxf"
                      wsdlURL="classpath:META-INF/wsdl/inbound.wsdl">
    <camelcxf:properties>
        <entry key="dataFormat" value="POJO"/>
    </camelcxf:properties>
</camelcxf:cxfEndpoint>

<camelcxf:cxfEndpoint xmlns:o="http://outbound.com/outbound"
                      id="myOutboundEndpoint"
                      endpointName="o:OutboundService"
                      serviceName="o:OutboundService"
                      address=""jms://"" 
                      serviceClass="com.OutboundService"
                      bus="cxf"
                      wsdlURL="classpath:META-INF/wsdl/outbound.wsdl">
    <camelcxf:properties>
        <entry key="dataFormat" value="POJO"/>
    </camelcxf:properties>
    <camelcxf:features>
        <bean class="org.apache.cxf.transport.jms.JMSConfigFeature">
            <property name="jmsConfig" ref="jmsConfig" />
        </bean>
    </camelcxf:features>
</camelcxf:cxfEndpoint>

<bean id="jmsConfig" class="org.apache.cxf.transport.jms.JMSConfiguration">
    <property name="connectionFactory" ref="pooledConnectionFactory" />
    <property name="targetDestination" value="some-queue" />
</bean>

<camelContext>
    <route id="inQueue">
        <from uri="activemq:inbound-queue" />
        <to uri="direct:my-inbound-route" />
    </route>
    <route id="inVm">
        <from uri="direct:in-vm" />
        <to uri="direct:my-inbound-route" />
    </route>
    <route id="serviceProxy">
        <from uri="cxf:bean:myInboundEndpoint?synchronous=true" />
        <setHeader headerName="operationName"><constant>myOtherOperation</constant></setHeader>
        <to uri="cxf:bean:outboundEndpoint?synchronous=true" />
    </route>        
</camelContext>

しかし、2 番目のルートが呼び出されると、CXF コンポーネントまたは camel は、この交換のためだけに別の一時応答キューを作成するのではなく、応答キューを含む元のインバウンド メッセージからすべての JMS 構成を再利用しようとします。これは、メッセージ内のヘッダーから取得されたようです。

純粋な JMS を使用し、CXF を方程式から外した場合、camel はルートの内側の部分に新しいキューを正しく作成しますが、CXF を引き続き使用する必要があります。

jms:// + JMSConfig スタイルと camel:// スタイルの両方を使用してみました。

現在、jaxws:client アプローチを使用しており、bean:myBean?method=myMethod を使用して参照しているだけですが、元のインバウンド メソッドから SOAP ヘッダーを伝播することはできないため、代わりに cxf:endpoint を使用するように切り替えています。

CXF を使用して SOAP over JMS を使用している例を見つけようとしましたが、具体的な例はないようです。

質問は....プロデューサーのために行う必要がある追加の構成はありますか、それともCXFを使用してJMSを介してSOAPを実行し、元のメッセージ/ラクダ交換からいくつかのヘッダーを伝播/設定できる方法はありますか?

4

1 に答える 1

1

inMessage から replyTo のヘッダーをフィルタリングする必要があると思います。

SOAP over JMS を使用する場合は、JMSConfiguration をハッキングすることなく、アドレスにすべての JMS 関連の設定を指定できます。例として取り上げることができるドキュメントを次に示します。

于 2014-03-19T08:48:33.910 に答える