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

Java 我可以在WebSphere中设置非事务性JMS连接工厂吗?,java,jms,websphere,Java,Jms,Websphere,工厂将基于默认的消息传递提供程序 这样做的原因是我有一个模拟MDB来代替外部系统,通常通过WebSphereMQ连接。模拟和测试的应用程序安装在同一台服务器上,因此我需要确保 request -> mock listener -> mock reply -> response 请求和回复是两个独立的事务 我在控制台中看不到任何将工厂从事务管理器的监督中删除的选项。您不能从ejb-jar.xml中执行此操作吗 <enterprise-beans> <m

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

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

request -> mock listener -> mock reply -> response
请求
回复
是两个独立的事务


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

您不能从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>

MDB
com.myapp.listener.MDB
javax.jms.MessageListener
容器
javax.jms.Queue
MDB
onMessage
javax.jms.Message
从未

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

  • 客户端发送消息
  • 侦听器拾取消息并发送回复
  • 客户收到了回复
  • 在这种情况下,客户机需要发送并提交消息,然后侦听器才能让它发送回复。侦听器可以在一个事务中接收和回复,但客户端需要两个事务。我进一步假设客户机是一个EJB

    一个解决方案是使用bean管理的事务。在这种情况下,您可以手动开始事务并在1左右提交,然后在3左右再次提交。这将导致发送消息


    另一个解决方案是使用RequiresNew在一个EJB方法中发送,使用RequiresNew在另一个EJB方法中接收。然后,客户端调用发送EJB方法,然后调用接收EJB方法,每个方法都有自己的事务。

    这甚至不接近连接工厂-它定义了一个MDB并给它一个事务属性。在应用服务器中创建ConnectionFactory资源是另一回事。谢谢。您的假设非常接近,只是没有EJB,而是Spring的DefaultMessageListenerContainers,所以接近MDB。我已经尝试了您的解决方案,不幸的是,我仍然无法摆脱封闭的事务。过几天我会再打给你。我决定问另一个问题: