Как удалить сообщение из очереди JMS - PullRequest
10 голосов
/ 02 марта 2012

Существует ли API для удаления сообщения из очереди JMS без использования инструмента администратора мониторинга.

Ответы [ 5 ]

8 голосов
/ 02 марта 2012

Нет прямого API для удаления сообщения. Вы можете вызвать метод queueReceiver.receive (), чтобы удалить сообщение из очереди. QueueBrowser не будет удалять сообщения из очереди.

4 голосов
/ 14 апреля 2015

Мне пришлось дополнительно позвонить session.commit(), чтобы потребитель удалил сообщения.

Кроме того, API receivenowait не работает;вместо этого вызовите receive(1000).

Вот рабочий код, который я написал и который работал над jboss:

try {
  connection = connectionFactory.createConnection();
  session = connection.createSession(true,-1);
  Queue queue = (Queue) QueueConnectionFactory.getInitialContext().lookup("/queue/DLQ");
  QueueBrowser browser = session.createBrowser(queue);
  Enumeration<?> enum1 = browser.getEnumeration();

  while(enum1.hasMoreElements()) {
    TextMessage msg = (TextMessage)enum1.nextElement();
    MessageConsumer consumer = session.createConsumer(queue, "JMSMessageID='" +  msg.getJMSMessageID()  + "'");
    //You can try starting the connection outside while loop as well, I think I started it inside while loop by mistake, but since this code worked I am hence letting you know what worked  
    connection.start();
    Message message = consumer.receive(1000) ;
    if ( message != null ) {
        //do something with message
    }
  }
} 
finally {
  session.commit();
  consumer.close();
  browser.close();
  session.close();
  connection.close();
}
4 голосов
/ 14 июня 2013

Вот что я мог бы получить на работе:

Я предполагаю, что вы хотите удалить сообщение, соответствующее определенным критериям.

Queue destination = session.createQueue("your_q");

QueueBrowser browser = session.createBrowser(destination);

Enumeration<?> enum1 = browser.getEnumeration();

while(enum1.hasMoreElements())
{
   TextMessage msg = (TextMessage)enum1.nextElement();
   if(msg.getStringProperty("any_prop").equals("some_prop"))
   {
       MessageConsumer consumer = session.createConsumer(destination, "id='" +   msg.getStringProperty("id") + "'");
      consumer.receive(1000);
   }
}
1 голос
/ 02 декабря 2013

Это то, что я на самом деле успешно проверил на weblogic:

destinationJNDI должен содержать JNDI-имя очереди, например «CommonJmsServer1@jms.jndi.dq.NL_Notifications.NLNotificationReprocessQ».

ctx должен быть действительным InitialContext, например:

 
  Properties env = new Properties();
  env.put(javax.naming.Context.PROVIDER_URL, PROVIDER_URL);
  env.put(Context.SECURITY_PRINCIPAL, WL_USER);
  env.put(Context.SECURITY_CREDENTIALS, WL_PASSWORD);
  env.put(Context.INITIAL_CONTEXT_FACTORY, WL_INITIAL_CONTEXT_FACTORY);
  InitialContext ctx = new InitialContext(env);


idlist должен быть CSV-списком идентификаторов сообщений, которые вы хотите удалить

это код:

 

  javax.jms.Queue queue = (javax.jms.Queue) ctx.lookup(destinationJNDI.toString());

  // lookup the queue connection factory
  QueueConnectionFactory queueConnFactory = (QueueConnectionFactory) ctx.lookup(WEBLOGIC_JMS_XA_CONNECTION_FACTORY);
  // create a queue connection
  QueueConnection queueConn = queueConnFactory.createQueueConnection();
  queueConn.start();

  // create a queue session
  Session queueSession = queueConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
  for (String id : idlist.split(",")) {
      if (id.startsWith("ID:") ) {
        MessageConsumer consumer = queueSession.createConsumer(queue, " JMSMessageID='" +   id + "'");
        Message message = consumer.receive(1000);
        out.write("message = " + message + " ");
        out.write("deleted ID " + id + " ");
      }
  }
  queueSession.close();
  queueConn.close();



1 голос
/ 02 марта 2012

Возможно, вам нужен объект QueueBrowser. Я думаю, что у него есть метод удаления (или аналогичный)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...