我能够使用JMS创建同步服务总线,但我无法将其转换为异步。 我尝试异步发送服务请求,因此如果服务已关闭,我希望JMS队列保留请求消息,当服务启动时,它会将消息传递给服务并返回响应。
这是我的代码
<exception>
答案 0 :(得分:1)
问题是您在不使用事务的情况下访问JMS队列 - 所以只要您收到消息,它就会从队列中消失。您需要使用事务,并且只有在完成处理后才提交(或回滚)消息消耗。
相关的企业集成模式是transactional client。 JMS component documentation还提供了有关交易的一些信息。最后,Camel in Action的第9章(第二版第12章)专门用于交易(我不能推荐它!)。
你需要:
配置可能类似于:
<!-- Import JMS connection factory -->
<osgi:reference id="jmsConnectionPool" interface="javax.jms.ConnectionFactory" />
<!-- We create a Spring JmsTransactionManager (our transaction manager could also be an
imported OSGi service, like we do for the connection factory; for example an XA transaction
manager) -->
<bean id="jmsTxManager" class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="jmsConnectionPool"/>
</bean>
<!-- We configure the JMS component to use the transaction manager-->
<bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory" ref="jmsConnectionPool" />
<property name="transacted" value="true"/>
<property name="transactionManager" ref="jmsTxManager"/>
</bean>
<!-- Here's an example of a transaction policy -->
<bean id="requiresNew" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
<property name="transactionManager" ref="jtaTransactionManager"/>
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRES_NEW"/>
</bean>
这是一条交易路线:
<route id="myRoute">
<from uri="jms://..." />
<transacted/>
...
</route>
如果我们想要,路线可以使用特定的交易政策:
<route id="myRoute">
<from uri="jms://..." />
<transacted ref="requiresNew" />
...
</route>