我有两个使用 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 并从原始消息/骆驼交换中传播/设置一些标头?