4

私は持っている:

  • hornetq-2.2.14-final スタンドアロン サーバー
  • キュー A にメッセージを送信するクライアント アプリケーション C1
  • キュー A からメッセージを消費するクライアント アプリケーション C2

C1 は CLIENT_ACKNOWLEDGE モードでメッセージを送信するために jmstemplate を使用します。

<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 がそのメッセージを受信したが、確認する前にクラッシュした場合、メッセージはどうなりますか?
  • タイムアウトメカニズムはありますか? はいの場合、確認応答のデフォルトのタイムアウトは? どうすれば変更できますか?
4

1 に答える 1

5

確認応答されていないメッセージは、顧客のクローズまたはロールバック時にキューに送り返されます。

サーバーがクラッシュした場合、メッセージが永続的でない場合は、何事もなかったかのように再配信されます。

ack を呼び出した時点で、ack が実際にサーバーに到達する前にシステムがクラッシュする可能性があることに注意してください。

ack タイムアウトは、接続ファクトリーで callTimeout を変更することによって構成されます。

更新するリソースが 2 つあり、ack とデータベースの挿入 (または次に行うこと) の間で単一のコミットを保証したい場合は、両方のブランチがコミットされることを保証するために XA トランザクションを実行する必要があることに注意してください。

メッセージはクラッシュ後に再送信されます。その領収書の 100% 保証が必要な場合は、XA が必要です。

于 2013-03-06T14:29:58.367 に答える