gpt4 book ai didi

java - WebSphere 7 中的消息驱动 bean (EJB3)、XA 事务、错误处理

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:53:44 25 4
gpt4 key购买 nike

我是 EJB 的新手。背景:我有一个 MDB 使用 WebSphere 默认消息传递提供程序接收 MapMessages,它有一个 java.sql.DataSource 来做一些工作,使用准备语句、jdbc 事务等。我在 ibm-ejb-bnd.xml 中设置了 MDB 和ejb-jar.xml 使用具有激活规范和目标名称的 JCA 适配器。我在 ejb-jar 和 ibm-ejb-jar-bind 中添加了一个 java.sql.DataSource。我还在 MessageListener 中添加了带有 @Resource 注释的 DataSource。

我无法理解的 2 个场景(第一个场景已修复,请参阅更新)...

容器管理的 MDB:DataSource 驱动程序与 XA 不兼容,因此我在 WebSphere 中启用了“Last Participant Support”。尽管如此,当 MDB 事务类型设置为 Container 时,我在提交时收到错误:

[11/28/11 10:56:10:988 MST] 0000002e RegisteredRes E   WTRN0063E: An illegal attempt to commit a one phase capable resource with existing two phase capable resources has occurred.

也许这是因为在 DataSource 提交后,返回到 MessageListener,后者提交使其成为最后一个参与者?我相信 WAS 7 中的默认消息传递提供程序是 XA 兼容的,尽管我还没有看到任何明确说明的文档。

消息在第一个错误后立即重新运行 4 次(尽管根据 WebSphere 中的 ActivationSpec 应该有 30 秒的延迟)。每次都抛出相同的错误。根据 MessageListener,它没有错误地完成,所以这个错误是美妙的隐形容器管理事务的一部分。我认为我不需要 XA 全局事务,因为除了 JMS 之外只有一个数据源,我以编程方式处理事务回滚。还有 JMS 消息,MDB 是异步的,AUTO-ACKNOWLEDGE。一旦收到消息,就可以对其进行确认。

如果我引入了一个应用程序错误,所以出现了异常,我会立即看到这个错误 5 次(没有延迟):

[11/28/11 10:16:18:857 MST] 0000002b LocalExceptio E   CNTR0020E: EJB threw an unexpected (non-declared) exception during invocation of method "onMessage" on bean...

所以我切换到......

Bean 管理的 MDB:提交在没有 XA 错误的情况下工作,并且只发生一次。然而,错误处理仍然没有像我预期或想要的那样表现!在 MessageListener 类中,捕获的异常抛出一个 EJB 异常,我认为这应该导致 MDB 具有我想要的行为:异常的原因对我来说并不重要,当 MDB 抛出捕获的异常时,不应该MDB 是否根据 WebSphereActivationSpec 中的属性重试? 相反,该消息会立即转到 MessageListener 5 次,并立即抛出与容器管理的 MDB 相同的错误:“EJB 抛出意外(未声明)的异常...”

如果我抛出 RuntimeException,“unexpeded (non-declared) expecetion”消息不会发生,但消息仍会立即重试 4 次,而不是等待重试延迟。

感谢阅读,非常感谢任何帮助或见解!

更新:我最终通过将数据源切换为 XA 兼容解决了 XA 兼容性问题。在 WAS 管理控制台中:Resources->JDBC Providers->DB2 Universal JDBC Driver Provider->Change implementation class name to: com.ibm.db2.jcc.DB2XADataSource

虽然消息失败,但我仍然遇到同样的问题。它会立即重试,而不是根据 WAS 中的 ActivationSpec。

最佳答案

我相信激活规范中的重试间隔是关于关闭的连接,而不是失败的消息。

您应该在 SIB Destination 中定义您想要的间隔

巴士 > 巴士 > 目的地 > 目的地

查看异常目的地

每条消息的最大失败传递是消息在宣布失败之前将被发送多少次(默认为 5,这就是为什么你会再得到 4 次)

当消息失败时,它将移动到异常目标队列,或者如果设置为 None 将在一定时间后重试,该时间是在总线级别设置的,但可以为每个目标覆盖(请参阅覆盖消息引擎阻塞默认重试超时)

关于java - WebSphere 7 中的消息驱动 bean (EJB3)、XA 事务、错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8300009/

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