Что произойдет, если подтверждение клиента не будет выполнено?

У меня есть:

  • Автономный сервер hornetq-2.2.14-final.
  • Клиентское приложение C1, которое отправляет сообщения в очередь A
  • Клиентское приложение C2, которое использует сообщения из очереди A.

C1 использовать jmstemplate для отправки сообщений в режиме CLIENT_ACKNOWLEDGE:

<bean name="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="connectionFactory" />
    <property name="sessionAcknowledgeModeName" value="CLIENT_ACKNOWLEDGE" />
    <property name="sessionTransacted" value="true" />
</bean>

поэтому C2 должен подтверждать сообщения вручную:

@Override
@Transactional
public void onMessage(Message message) 
{
    try 
    {
        messageHandlerService.handleReceivedMessage(message);
        message.acknowledge();
    } 
    catch (DeserializeXmlException e) 
    {
        // TODO log
        e.printStackTrace();
    }   
    catch (InvalidMessageException e) 
    {
        //TODO log
        e.printStackTrace();
    }
    catch (JMSException e) 
    {
        //TODO log
        e.printStackTrace();
    }   
}

Мои вопросы:

  • Что произойдет с сообщением, когда клиент C2 получил это сообщение, но падает, не подтвердив его?
  • Есть ли механизм тайм-аута? если да, то какое время ожидания по умолчанию для подтверждения? как я могу изменить его?

person Arya    schedule 06.03.2013    source источник


Ответы (1)


Любое неподтвержденное сообщение будет отправлено обратно в очередь после закрытия или отката клиента.

В случае сбоя сервера сообщение будет доставлено повторно, если оно непостоянно, как будто ничего не произошло.

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

Время ожидания подтверждения настраивается путем изменения callTimeout в фабрике соединений.

Обратите внимание, что если у вас есть два ресурса для обновления и вы хотите гарантировать единую фиксацию между подтверждением и вставкой в ​​базу данных (или что-то еще, что вы делаете дальше), вам необходимо выполнить транзакции XA, чтобы гарантировать, что обе ветки будут зафиксированы.

Сообщение будет повторно отправлено после сбоя. Вам нужен XA, если вам нужна 100% гарантия получения.

person Clebert Suconic    schedule 06.03.2013
comment
Как насчет тайм-аута для подтверждения? Могу ли я изменить его (из hornetq или клиента)? - person Arya; 06.03.2013
comment
Что мне делать, если сервер упал до того, как ack достиг сервера? (выдает ли message.acnknowledge() исключение подтверждения?) - person Arya; 06.03.2013
comment
Не могу найти blockingCallTimeout! это callTimeout? (Я нашел это в HornetQConnectionFactory) - person Arya; 09.03.2013
comment
Это верно. Этот параметр будет использоваться как blockingCallTimeout вниз по иерархии, и я использовал внутреннюю переменную, когда отвечал на вопрос. сейчас отредактирую - person Clebert Suconic; 13.03.2013