Очередь JMS получает сообщение? - PullRequest
7 голосов
/ 13 декабря 2011

В документе JMS API сказано:

public Message receive() throws JMSException

Получает следующее сообщение производится для этого сообщения потребителем. Этот вызов блокирует на неопределенный срок пока сообщение не будет создано или пока это сообщение не будет закрыто.

Если этот прием осуществляется в рамках транзакции, потребитель сохраняет сообщение до тех пор, пока транзакция не завершится.

Здесь у меня три вопроса: 1. в коде нам нужен цикл while для получения сообщения? как:

while(true){
    Message msg = queue.receive();
    ....
}
  1. что такое настройка транзакции? как совершить транзакцию? как это:

    boolean transacted = false;
    session = connection.createQueueSession(transacted, Session.AUTO_ACKNOWLEDGE);
    
  2. receiveNoWait () поддерживает транзакции? как это использовать?

Спасибо

1 Ответ

3 голосов
/ 13 декабря 2011
  1. Если вы собираетесь использовать прием, вам понадобится какой-то цикл для продолжения приема сообщений после получения первого.Помните, что вы также можете настроить прослушиватель сообщений и получать асинхронные принятые сообщения с помощью метода обратного вызова и не должны блокировать.

  2. Транзакция, как правило, по умолчанию имеет значение AUTO_ACKNOWLEDGE, что означает, что в ближайшее времяпоскольку сообщение взято из очереди, оно исчезает и не может быть откачено.Если вы хотите настроить транзакцию, вам нужно установить сеанс на транзакцию и метод SESSION_TRANSACTED.Когда вы вызываете commit () в сеансе, сообщения будут подтверждены в очереди.

  3. receiveNoWait () может иметь поддержку транзакций, если вы правильно настроили режим подтверждения и используете commit ()и rollback () в сеансе.

Если бы я был вами, я бы создал MessageListener, и мне не пришлось бы беспокоиться о вращении потока для опроса методов приема.Помните, что неявная транзакция запускается после создания сеанса.

public class JmsAdapter implements MessageListener, ExceptionListener
{
    private ConnectionFactory connFactory = null;
    private Connection conn = null;
    private Session session = null;

    public void receiveMessages() 
    {
        try
        {
            this.session = this.conn.createSession(true, Session.SESSION_TRANSACTED);

            this.conn.setExceptionListener(this);

            Destination destination = this.session.createQueue("SOME_QUEUE_NAME");

            this.consumer = this.session.createConsumer(destination);

            this.consumer.setMessageListener(this);

            this.conn.start();
        } 
        catch (JMSException e) 
        {
            //Handle JMS Exceptions Here
        }
    }

    @Override
    public void onMessage(Message message) 
    {
        try
        {
            //Do Message Processing Here

            //Message sucessfully processed...  Go ahead and commit the transaction.
            this.session.commit();
        }
        catch(SomeApplicationException e)
        {
            //Message processing failed.
            //Do whatever you need to do here for the exception.

            //NOTE: You may need to check the redelivery count of this message first
            //and just commit it after it fails a predefined number of times (Make sure you
            //store it somewhere if you don't want to lose it).  This way you're process isn't
            //handling the same failed message over and over again.
            this.session.rollback()
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...