第15章 使用済みの接続の検出


この章では、接続 Time-to-Live (TTL) について説明し、HornetQ が、クラッシュしたクライアントおよび終了したクライアントをリソースを正常にクローズせずにどのように扱うかについても説明します。

15.1. サーバーで使用済みの接続リソースをクリーンアップ

HornetQ クライアントアプリケーションが終了する前に、そのリソースをfinally ブロックを使用してクローズする必要があります。

例15.1 正常に動作するコアクライアントアプリケーション

以下に、セッションとセッションファクトリーを finally ブロックでクローズする、正常に動作するコアクライアントアプリケーションの例を示します。
ClientSessionFactory sf = null;
ClientSession session = null;

try
{
   sf = HornetQClient.createClientSessionFactory(...);
   session = sf.createSession(...);   
   ... do some stuff with the session...
}
finally
{
   if (session != null)
   {
      session.close();
   }
   
   if (sf != null)
   {
      sf.close();
   }
}
Copy to Clipboard Toggle word wrap

例15.2 正常に動作する JMS クライアントアプリケーション

これは、正常に動作する JMS クライアントアプリケーションの例です。
Connection jmsConnection = null;

try
{
   ConnectionFactory jmsConnectionFactory = HornetQJMSClient.createConnectionFactory(...);

   jmsConnection = jmsConnectionFactory.createConnection();

   ... do some stuff with the connection...
}
finally
{
   if (connection != null)
   {
      connection.close();
   }
}
Copy to Clipboard Toggle word wrap
クライアントがクラッシュすると、セッションのようなサーバーサイドリソースはサーバーに残ったままになることがあります。これにより、時間が経つとリソースリークが発生し、サーバーでメモリーや他のリソースが足りなくなることがあります。
残ったクライアントリソースをクリーンアップする要件は HornetQ クライアント接続サポートで満たされます。クライアントとサーバー間のネットワークは失敗し、リブートされることがあり、クライアントは再接続できます。リソースが消去された場合は、リブートが失敗します。
リソースがクライアントのクラッシュ時に消去されるようにするために (リブート時間の間は許可)、connection TTL は設定可能です。各 ClientSessionFactory は定義された connection TTL を持ちます。TTL は、クライアントから到着するデータが存在しない場合に、サーバーがe接続を保持する時間を決定します。
クライアントは、サーバーがクローズしないよう ping パケットを自動的に送信します。サーバーが接続 TTL 時間の間、接続でパケットを受け取らない場合は、その接続に関連するすべてのセッションがサーバーでクローズされます。
この機能は以下の方法で、クライアントサイドまたはサーバーサイドで設定できます。
  • クライアントサイドで、HornetQConnectionFactory インスタンス (JBOSS_DIST/jboss-as/server/PROFILE/deploy/jms-ra.rar/META-INF/ra.xml) の ConnectionTTL 属性を指定します。
  • 接続ファクトリーインスタンスが JNDI に直接デプロイされるサーバーサイドで、JBOSS_DIST/jboss-as/server/PROFILE/deploy/hornetq/hornetq-jms.xml ファイルの <connection-factory> ディレクティブに対して connection-ttl パラメーターを指定します。
ConnectionTTL のデフォルト値は 60000 (ミリ秒) です。ConnectionTTL 属性の値が -1 の場合は、サーバーサイドでサーバーの接続がタイムアウトしません。
クライアントで独自の接続 TTL を指定することを回避するために、他のすべての値を上書きするグローバル値をサーバーサイドで設定できます。これを行うには、JBOSS_DIST/jboss-as/server/PROFILE/deploy/hornetq/hornetq-jms.xml ファイルで connection-ttl-override 属性を指定します。connection-ttl-override のデフォルト値は、-1 であり、クライアントは接続 TTL に対して独自の値を設定できます。

15.1.1. クローズに失敗したコアセッションまたは JMS 接続をクローズ

すべてのコアクライアントセッションと JMS 接続が終了時に常に finally ブロックで明示的にクローズされることが重要です。
セッションまたは接続が finally ブロックでクローズされない場合は、HornetQ がガベージ コレクション時にこれを検出し、ログに次のような警告を記録します (JMS を使用している場合、警告はクライアントセッションではなく JMS 接続に関係します)。
[Finalizer] 20:14:43,244 WARNING [org.hornetq.core.client.impl.DelegatingSession]  
  I'm closing a ClientSession you left open. Please make sure you close all ClientSessions 
  explicitly before letting them go out of scope!
[Finalizer] 20:14:43,244 WARNING [org.hornetq.core.client.impl.DelegatingSession]  
The session you did not close was created here: 
java.lang.Exception
  at org.hornetq.core.client.impl.DelegatingSession.<init>(DelegatingSession.java:83)
  at org.acme.yourproject.YourClass (YourClass.java:666)
Copy to Clipboard Toggle word wrap
HornetQ は、次に接続/クライアントセッションをクローズします。
ログはクローズされなかった JMS 接続/クライアントセッションが作成されたユーザーコードの行も出力します。これにより、エラーを特定し、適切に修正できるようになります。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat