0

我有两个使用 JMS 作为传输的 CXF 端点;一个用作消费者,第二个用作生产者。这是一个非常精简的设置。

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

但是当调用第二条路由时,CXF 组件或骆驼会尝试重新使用原始入站消息(包括回复队列)中的所有 JMS 配置,而不是仅为此交换创建另一个临时回复队列。这似乎是从 in 消息中获取的标题。

如果您只使用纯 JMS 并将 CXF 排除在等式之外,那么骆驼会正确地为路由的内部创建一个新队列,尽管我需要继续使用 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 的标头。

如果您想在 JMS 上使用 SOAP,您可以在地址上指定所有与 JMS 相关的设置,而无需破解 JMSConfiguration。这是您可以作为示例的文档。

于 2014-03-19T08:48:33.910 回答