Jboss MDB在同一事务上使用多条消息

Jboss MDB在同一事务上使用多条消息,jboss,transactions,ejb,jms,message-driven-bean,Jboss,Transactions,Ejb,Jms,Message Driven Bean,我有一个高负载、高性能的应用程序 现在,我正在迁移应用程序以使用EJB。我非常担心使用EJB在队列上使用消息,因为事务性会降低性能 现在,我在同一个事务中消费X条消息,但我不知道如何使用MDB实现同样的功能。 是否可以仅使用一个事务使用MDB中的消息块?不能保证同一MDB将处理消息流 我认为,通过使用带有@Asynchronous调用的无状态bean并传递您的消息集,您可以实现您想要的 诸如此类: @Stateless public class AsynchProcessor { @As

我有一个高负载、高性能的应用程序

现在,我正在迁移应用程序以使用EJB。我非常担心使用EJB在队列上使用消息,因为事务性会降低性能

现在,我在同一个事务中消费X条消息,但我不知道如何使用MDB实现同样的功能。
是否可以仅使用一个事务使用MDB中的消息块?

不能保证同一MDB将处理消息流

我认为,通过使用带有
@Asynchronous
调用的无状态bean并传递您的消息集,您可以实现您想要的

诸如此类:

@Stateless
public class AsynchProcessor {

   @Asynchronous
   public void processMessages(Set<MyMessage> messages) {....}

}
@无状态
公共类异步处理器{
@异步的
public void processMessages(设置消息){..}
}
如果有必要,用未来来装饰你的方法,然后在你的客户身上

Set<MyMessage> messages = ...
asynchProcessor.processMessages(messages)
设置消息=。。。
asynchProcessor.processMessages(消息)

如果队列中的项目包含一个集合而不是单个项目,则可以实现同样的效果。在选择MDB和“@异步”时,有很多事情要考虑,即在应用程序崩溃的情况下丢失数据。这也是一种选择。MDB在重新交付时更可靠。这取决于设计是什么。另一个可能的选项是从@Asynchronous调用编程持久计时器。当然这有负面影响要考虑。谢谢你的回复。问题是我需要在单个事务中处理1到2000000条消息,数量取决于客户端。因此,如果aclient向我发送了2000000条消息,我就无法使用list参数在一次调用中管理所有消息。我肯定会有记忆问题。我正在寻找Wildfly,比如Oracle MDB Transaction Batching(),我将继续寻找解决方案,但如果您能帮助我,我将不胜感激。嗯……200000条消息相当多。如果消息不是很大,我能想到的最安全的事情就是将消息保存到数据库并为其分配一个组,然后将消息发送到MDB,该组将进行处理。MDB将完成其余的工作,最近将清理表。除非事务在某个地方引起一些争用(例如执行某种数据库操作和等待锁定),否则消息传递期间的网络延迟将淹没事务内执行的开销。