Transactions 如何从队列中手动读取N条消息,或者如果onmessage()方法中已经过了Y个时间,如何读取?

Transactions 如何从队列中手动读取N条消息,或者如果onmessage()方法中已经过了Y个时间,如何读取?,transactions,jms,mq,Transactions,Jms,Mq,我希望在我的消息驱动bean onmessage方法中实现以下逻辑 读取N条消息或等待Y次,以先发生的为准,然后提交事务 如果我能得到一个实现这个逻辑的代码示例,我将非常感激 T类似于此代码的内容可能是您希望执行的操作。 但是,将侦听器保持为单个使用者,没有并发的、负载平衡的ONCE,否则这将变得棘手。如果您使用的是JEE6,那么您可能希望通过注释注入jms资源。如果没有,接收呼叫将阻止等待Y/N时间 public void onMessage(Message msg) { // So w

我希望在我的消息驱动bean onmessage方法中实现以下逻辑

读取N条消息或等待Y次,以先发生的为准,然后提交事务

如果我能得到一个实现这个逻辑的代码示例,我将非常感激


T

类似于此代码的内容可能是您希望执行的操作。 但是,将侦听器保持为单个使用者,没有并发的、负载平衡的ONCE,否则这将变得棘手。如果您使用的是JEE6,那么您可能希望通过注释注入jms资源。如果没有,接收呼叫将阻止等待Y/N时间

public void onMessage(Message msg) {

  // So we got a message, let's grab the JMS resources
  // Note that these could be injected as well, for convenience

  InitialContext context = new InitialContext();
  ConnectionFactory factory = (ConnectionFactory) context.lookup("java:comp/env/jms/connectionFactory");
  Destination destination = (Destination) context.lookup("java:comp/env/jms/myQueue");
  Connection connection = factory.createConnection();
  connection.start();
  MessageConsumer consumer = session.createConsumer(destination);
  Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
  // TODO: handle msg here

  // So, let's start look for msgs.
  for (int i=0; i<N; i++) {
      Message msg_i = consumer.receive(Y/N);
      // Handle msg_i here.
  }
  consumer.close();
  session.close();
  connection.close();
}
public-void-onMessage(Message-msg){
//我们得到一条消息,让我们抓住JMS资源
//注意,为了方便起见,也可以注射这些药物
InitialContext=新的InitialContext();
ConnectionFactory=(ConnectionFactory)context.lookup(“java:comp/env/jms/ConnectionFactory”);
Destination=(Destination)context.lookup(“java:comp/env/jms/myQueue”);
Connection=factory.createConnection();
connection.start();
MessageConsumer=session.createConsumer(目的地);
会话会话=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
//TODO:在这里处理味精
//那么,让我们开始寻找MSG。

对于(int i=0;iThanks Petter。如果我将多个MDB实例配置为侦听一个队列,那么这种方法是否有效。我正在使用EJB3.0规范和激活规范。在这种情况下,是否有不同的处理方法?您不能在一个事务的范围内真正实现这一点。然后,您还必须使用类似于消息组,以确保消息不会从同一消息组并行使用。这将相当复杂。您试图在更高的级别上实现什么?也许最好在应用程序逻辑中以某种方式处理此问题。MDB有其良好的优点,但在多个消息组中跨不同的托管线程共享状态transactions不是其中之一,我们预计每天大约有1700万个事务。因此,我们希望创建一个小的工作单元,然后进行批处理。在将数据存储到数据库之前,我们对数据进行了某些转换。由于我们希望减少与数据库的频繁连接,我们正在考虑批处理事务。因此,顺序、顺序或消息进入哪个批并不重要?那么这个解决方案可能/应该可以工作,即使是多个MDB实例。我会为此设置一些测试用例,但不是更少。