通常、Tomcat でホストされているアプリケーション内でポート リスナーを実行することはありません。通常は、この 2 つを分離しておくのが最善です。基本的に、Web サーバーは、制御外で個別の実行スレッドを実行することを意図していません。
Spring Integration、JBossESB、Apache Camel などを使用してメッセージを受信し、Tomcat がホストする Web アプリケーションを操作できるデータベース、ファイル フォルダー (またはその他のもの) に処理することを検討できます。ESB コンテナーは、Tomcat と同じ JVM プロセスでホストできますが、私自身はそのアプローチを取りません。別のコンテナーでメッセージ処理を行い、別のコンテナーで webapp を実行します。
「単一のアプリケーション」が本当に必要な場合は、例に従ってリスナーを開始し、組み込みバージョンの Tomcat を起動する Java アプリケーションを作成することを検討できます。
本当にTomcat内で実行したい場合は、Webアプリケーション自体の一部として、リスニングを行うクラスを作成し、それをWebアプリケーションのアプリケーションコンテキストにロードすることができます. 自動ロードされたサーブレット内の appl コンテキストにそのインスタンスを追加することでこれを行うことができます -<load-on-startup>1</load-on-startup>
サーブレット定義内で使用します。サーブレットをコーディングして、新しいインスタンスを追加する前にコンテキスト内にインスタンスが既に存在するかどうかを確認するか (偶然手動で呼び出された可能性があります)、Spring コンテナー ルートをたどってこのオブジェクトをシングルトンとして管理します。
* 編集: 20120114T004300Z *
Apache Camelは、 Apache ServiceMix などのEnterprise Service Bus (ESB)で使用される可能性のあるルーティング エンジンの例です。これにより、メッセージを交換することで複数のアプリケーションが相互運用できるようになります。このアプリで利用できる機能のほんの一部しか使用しないでしょう。たとえば、あなたがやっていることについては、Spring に埋め込まれた Camel 機能を使用できるかもしれません。
本質的に、ESB は「アダプター」(またはエンドポイント) を実行します。その 1 つは、ここで説明するソケットの「リスナー」によって実行されるか、ファイルが到着するフォルダーを監視するか、行が表示されるようにデータベース テーブルをポーリングする可能性があります。 、またはJMSキューで待機中など。トランスポート(「メッセージ」(この場合はHL7ファイル)が到着する手段は、アプリケーション自体の機能から抽象化されます。アダプターはメッセージをチャネルに配置します。途中でメッセージを変換するように設定できます. Camel には実際にHL7 コンポーネントが同梱されています.これは HL7 ファイル形式を理解し、それを HL7 モデルにアンマーシャリングできます.(必要なリスナー/アダプターも提供します.)そのモデルを「コンシューマ」に渡すように ESB でルーティングを設定する必要なことは何でも実行する Java クラス。
「標準」のトランスポート、プロトコル、およびメッセージ タイプを扱っている場合、ファイルの受信、解析、およびルーティングのほとんどは、コーディングではなく、ESB の宣言的な構成によって処理されます。
Tomcat Web アプリケーションは、このメッセージ処理に対して完全に自律的に実行できます。前述のように、これをどのように正確に行うかについては、さまざまな展開オプションがあります。必要に応じて、Web アプリケーションによって Tomcat でホストされている Spring コンテナー内に Camel をロードすることも含まれます。
これが少しふざけている場合はお詫び申し上げます。HL7 が標準であることを考えると、Web 上の主題を読むのに少し時間を取ってください。おそらく、基本的なファイル処理を再実装するのに多くの時間を節約できる多くのコード/コンポーネントがすでにそこにあることに気付くでしょう。友人のための付加価値 Web アプリに集中できます。