我可以在WebSphere中设置非事务性JMS连接工厂吗?

时间:2011-10-12 14:07:51

标签: java jms websphere

工厂将基于默认消息提供程序

这样做的原因是我有一个模拟MDB代替外部系统,通常通过Websphere MQ连接。模拟和测试的应用程序安装在同一台服务器上,因此我需要确保在循环中

request -> mock listener -> mock reply -> response

requestreply是两个独立的交易。

我无法在控制台中看到任何从事务管理器监督中删除工厂的选项。

2 个答案:

答案 0 :(得分:3)

您的观察结果是正确的,JMS连接工厂无法配置为不在当前事务中登记。我有点不确定你想在这里做什么,但我会做出以下假设:

  1. 客户端发送消息
  2. 听众收听留言并发送回复
  3. 客户接听回复
  4. 在这种情况下,客户端需要在侦听器将其发送回复之前发送和提交消息。监听器可以在一个事务中接收和回复,但客户端需要两个。我还假设客户端是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>