工厂将基于默认消息提供程序。
这样做的原因是我有一个模拟MDB代替外部系统,通常通过Websphere MQ连接。模拟和测试的应用程序安装在同一台服务器上,因此我需要确保在循环中
request -> mock listener -> mock reply -> response
request
和reply
是两个独立的交易。
我无法在控制台中看到任何从事务管理器监督中删除工厂的选项。
答案 0 :(得分:3)
您的观察结果是正确的,JMS连接工厂无法配置为不在当前事务中登记。我有点不确定你想在这里做什么,但我会做出以下假设:
在这种情况下,客户端需要在侦听器将其发送回复之前发送和提交消息。监听器可以在一个事务中接收和回复,但客户端需要两个。我还假设客户端是EJB。
对此的一个解决方案是使用bean管理的事务。在这种情况下,您可以手动开始一个事务并将其提交到1左右,并在3左右再次提交。这将导致消息被发送。
另一个解决方案是使用RequiresNew在EJB方法中执行send,在另一个使用RequiresNew的EJB方法中执行receive方法。然后客户端调用send EJB方法,然后调用receive EJB方法,每个方法都有自己的事务。
答案 1 :(得分:0)
你能否从ejb-jar.xml中做到这一点?
<enterprise-beans>
<message-driven id="MDB">
<ejb-name>MDB</ejb-name>
<ejb-class>com.myapp.listener.MDB</ejb-class>
<messaging-type>javax.jms.MessageListener</messaging-type>
<transaction-type>Container</transaction-type>
<message-destination-type>javax.jms.Queue</message-destination-type>
</message-driven>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>MDB</ejb-name>
<method-name>onMessage</method-name>
<method-params>
<method-param>javax.jms.Message</method-param>
</method-params>
</method>
<trans-attribute>Never</trans-attribute>
</container-transaction>
</assembly-descriptor>