【问题标题】:Return bean-type transaction to queue将 bean 类型的事务返回到队列
【发布时间】:2012-12-28 13:18:27
【问题描述】:

我们有一个应用程序部署到带有 MDB 的 glassfish 服务器,由于其他原因,它必须使用 Bean 类型的事务 (TransactionManagementType.BEAN)。

在某些情况下,在 onMessage() 方法中,我们希望能够查看消息并拒绝它。 “拒绝”是指将消息放回队列中,稍后再发送。

我搜索了一下,但我发现的所有似乎都表明我应该将事务类型更改为 Container 并调用 setRollbackOnly()。但是,正如我上面所说,由于其他限制,这不是一个选择。

有什么办法吗?

【问题讨论】:

  • 你试过抛出异常吗?
  • 被拉到一边,还没来得及看,但下次有机会我会尝试例外...
  • 抛出异常也不会将其放回队列中。
  • 然后我建议打破你的逻辑,并使用 CMT 创建一个新的 MDB - 就像一个包装器,onMessage() 就足够了。您仍然可以从 MDB 调用当前 EJB 中的业务逻辑。

标签: java glassfish jms java-ee-6


【解决方案1】:

虽然 MDB 可能会抛出异常并回滚当前事务,从而强制调用者重新发送消息,但 bean 托管事务方法无法加入现有事务。我认为要实现这种行为,您应该在发送方和接收方 MDB 之间实现通信协议,使用数据存储来建模消息队列。

【讨论】:

  • 这不是真的,如果你使用CMT,并且标记事务为回滚,它会将消息“返回”到队列中,并且稍后会尝试重新传递。这来自事务行为。问题是,如果没有正在进行的交易,他如何“返回”消息。
  • 其实问题是delivery(onMessage()call)不在事务中。如果是,它可能已经被回滚了。
【解决方案2】:

看看这个:

http://www.datadisk.co.uk/html_docs/ejb/ejb3_mdb.htm

它说 Client-acknowledge 模式在 MDB 中不受支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多