gpt4 book ai didi

java - 使用 spring jee-jndi 查找注入(inject)的 JMS XA 连接工厂的行为与 Weblogic 12c 上的 @Resource 注入(inject)不同

转载 作者:行者123 更新时间:2023-12-01 10:50:22 27 4
gpt4 key购买 nike

我最近有一个 MDB 应用程序移植到 Weblogic 12c。我使用 spring 3.1 注入(inject)数据源和 jms 资源,但是发现消息队列的传递不成功(没有错误),尽管没有明显的回滚,但似乎没有参与 XA 事务。此后我创建了一个测试应用程序来隔离问题。此测试应用程序包含:

  1. session 计时器 bean 将消息放入 testQueue1
  2. MDB1 更新数据源并将消息从 testQueue1 移动到 testQueue2。

我的 Spring 配置:

<jee:jndi-lookup id="jdbcDS" expected-type="javax.sql.DataSource" jndi-name="jdbc/test_OraclePool" />
<jee:jndi-lookup id="jmsCF" jndi-name="jms/test_ConnectionFactory" />
<jee:jndi-lookup id="jmsTestQueue1" jndi-name="jms/testQueue1"/>
<jee:jndi-lookup id="jmsTestQueue2" jndi-name="jms/testQueue2"/>
<bean id="transactionManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager">
<property name="transactionManagerName" value="javax.transaction.TransactionManager"/>
</bean>

连接工厂和队列驻留在同一子部署中,并以 Weblogic 12c 上的同一 JMS 服务器为目标。

所以我发现,如果我通过 ejb @Resource 注入(inject)注入(inject)连接工厂,一切都会正常,但是由于我无法控制的原因,更改我们的应用程序以注入(inject)连接工厂不是一个选项。另一个有趣的区别是容器在每种情况下返回的具体工厂类有所不同:@Resource 返回 - weblogic.deployment.jms.PooledConnectionFactorySpring jndi 注入(inject) - weblogic.jms.client.JMSXAConnectionFactory。

有谁知道我缺少什么(如果有的话)?

最佳答案

在 Spring 配置的实例中,您正在对 JMS 连接工厂进行直接 JNDI 查找。使用 @Resource 时,WebLogic 会在同一个工厂周围注入(inject) JMS 包装器。除此之外,包装器负责自动事务登记(否则外国 JMS 提供程序不会自动登记)。欲了解更多详细信息,请看这里:http://docs.oracle.com/cd/E24329_01/web.1211/e24387/j2ee.htm#JMSPG366在这里 https://docs.oracle.com/cd/E24329_01/web.1211/e24387/interop.htm#JMSPG555

虽然 WebLogic 从 8.1 版本开始就支持 JMS 包装器,但没有公共(public) API(我最后检查过)可以在 Java 中使用这些包装器,因此很难为 Spring 等库搭载它们。几年前有一个对此创建的增强请求(错误 20062862),但您需要询问 Oracle 他们的进展情况。

如果不使用外部 JMS 提供程序的包装器,您需要自己处理登记,这是不幸的。

关于java - 使用 spring jee-jndi 查找注入(inject)的 JMS XA 连接工厂的行为与 Weblogic 12c 上的 @Resource 注入(inject)不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33957719/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com