JMS从同步到异步

时间:2016-06-15 09:30:05

标签: spring asynchronous apache-camel jms

我能够使用JMS创建同步服务总线,但我无法将其转换为异步。 我尝试异步发送服务请求,因此如果服务已关闭,我希望JMS队列保留请求消息,当服务启动时,它会将消息传递给服务并返回响应。

这是我的代码

<exception>

1 个答案:

答案 0 :(得分:1)

问题是您在不使用事务的情况下访问JMS队列 - 所以只要您收到消息,它就会从队列中消失。您需要使用事务,并且只有在完成处理后才提交(或回滚)消息消耗。

相关的企业集成模式是transactional clientJMS component documentation还提供了有关交易的一些信息。最后,Camel in Action的第9章(第二版第12章)专门用于交易(我不能推荐它!)。

你需要:

  • 获取JMS事务管理器(您使用的事务管理器可能取决于您的特定用例)
  • 配置Camel JMS组件以使用事务管理器
  • 使用事务策略配置路由的事务行为(或者只将路由标记为事务处理,并使用默认策略)

配置可能类似于:

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