【问题标题】:What happen if client acknowledgment not done?如果客户没有确认会发生什么?
【发布时间】:2013-02-21 01:06:02
【问题描述】:

我有:

  • hornetq-2.2.14-final 独立服务器
  • 将消息发送到队列 A 的客户端应用程序 C1
  • 使用来自队列 A 的消息的客户端应用程序 C2

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 收到该消息但在确认之前崩溃时,该消息会发生什么情况?
  • 有没有超时机制?如果是,确认的默认超时是多少?如何修改?

【问题讨论】:

    标签: java jms hornetq


    【解决方案1】:

    任何未确认的消息都将在客户关闭或回滚时发送回队列。

    在服务器崩溃的情况下,如果消息不是持久的,则将重新传递,就像什么都没发生一样。

    请注意,系统可能会在您调用 ack 时但在 ack 实际到达服务器之前崩溃。

    通过改变连接工厂的callTimeout来配置ack超时。

    请注意,如果您有两个要更新的资源并希望保证 ack 和数据库插入之间的单个提交(或您接下来要执行的任何操作),那么您需要执行 XA 事务以保证两个分支都将被提交.

    消息将在崩溃后重新发送。如果您需要 100% 保证该收据,则需要 XA。

    【讨论】:

    • 确认超时怎么办?我可以更改它(从 hornetq 或客户端)吗?
    • 服务器在ack到达服务器之前就崩溃了怎么办? (“message.acnknowledge()”会抛出确认异常吗?)
    • 我找不到blockingCallTimeout!是呼叫超时吗? (我在 HornetQConnectionFactory 中找到的)
    • 没错。该参数将用作层次结构中的blockingCallTimeout,我在回答问题时使用了内部变量。我现在就编辑它
    猜你喜欢
    • 2017-04-16
    • 1970-01-01
    • 2011-03-19
    • 2019-09-27
    • 2021-10-04
    • 2021-04-20
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    相关资源
    最近更新 更多