2

バックグラウンド

私は医者である友人のために医療記録アプリを書いています。HL7 メッセージを待機するアプリにリスナーを作成するように言われました。そうすれば、病院は HL7 メッセージを送信でき、私のリスナーはそれをキャッチします。そこでHAPIのサイトに来て、この例を見ました。私が理解しているのは、メッセージをリッスンするサーバーを作成しているということです。

Tomcat 7.0 で JSF 2.0 を使用して Eclipse でこれを開発しています。この種のリスナーは、通常、JSF を使用するプロジェクトのどこに配置しますか? この答えをオンラインで検索してみましたが、何も見つかりませんでした。

私の質問

このコードがクラス内にあることは知っています。クラスが呼び出されると、ソケットが「オン」になり、応答を待ちます。そのため、プロジェクトがデプロイされたらすぐにこのクラスを呼び出したいと考えています。それはどのように行われますか?リスナーをオンにするために、(アプリの起動時に) そのクラスを 1 回だけ呼び出すにはどうすればよいですか?

どんな助けでも大歓迎です!そして、私が何かについてはっきりしていない場合は、私に知らせてください!

4

5 に答える 5

4

通常、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 アプリに集中できます。

于 2012-01-13T00:46:02.953 に答える
2

「リスナー」は、開いているポートでリッスンする単なるクラスです。Java では、これは主に Socket API を介して行われますが、目的により適したライブラリが見つかる場合もあります。

Java チュートリアルには、いくつかの例があります: http://docs.oracle.com/javase/tutorial/networking/sockets/index.html

この場合、メッセージを送信する病院システムがクライアントの役割を果たしますが、サーバー (クライアント/サーバー配置のリッスン側) を記述します。

ポートでリッスンすると、HL7 メッセージがプレーン テキストとしてそのソケットの入力ストリームに到着します。メッセージを手動で解析するか (メッセージの 1 つか 2 つの詳細にのみ関心がある場合に実行可能)、または数十種類のメッセージを処理することを計画している場合は、そこにある HL7 解析ライブラリの 1 つを調べることができます。 .

ただし、HL7 メッセージのさまざまな実装者が、微妙に異なる配置でデータを送信する場合があることに注意してください。(残念ながら、多くのユーザーは HL7 を「標準」ではなく「推奨」として扱っています!) 多数の異なるプロバイダーからの多数の異なるフィードをサポートすることを計画している場合は、MirthConnect のようなミドルウェア レイヤーを使用する方がはるかに優れています。アプリケーションが理解できるように設計されたものへのメッセージの解析と翻訳を処理します。

于 2012-01-07T00:15:01.837 に答える
1

1 年以上前のことなので、おそらくすべてを理解していると思いますが、エンタープライズ サービス バス (ESB) は一種のミドルウェアです (ソフトウェアについて考えるとき、バックエンド、つまりデータベース/分析/管理ツールとフロントエンド、つまりアプリがあります) /WebApp/エンドユーザーに表示され、対話する GUI)、ミドルウェアはその間に位置し、タスクの統合または分離/調整を実行するのに役立ちます。Apache ServiceMix (Apache Camel ルーティング エンジンを含む ESB) は、おそらく必要なものであり、「メッセージ ルーティング」(必要なもの) などのさまざまなエンタープライズ統合パターンを実装するために使用できます。

Apache Camel には組み込みの HL7 v2 メッセージ パーサー (HAPI を使用) があり、これは HL7 のタブ区切りバリアントです: http://camel.apache.org/hl7.html

XML 形式の HL7 v3 メッセージについては、v3 ユーティリティで利用可能なツールキットを使用できます: http://www.hl7.org/participate/toolsandresources.cfm?ref=nav

サーバー (メッセージのリッスンと読み取り) とクライアント (メッセージの作成と送信) の両方の例があります。

于 2013-02-15T16:09:17.097 に答える
0

HL7 メッセージ統合エンジンとしてMirth Connect http://www.mirthcorp.com/community/mirth-connectを検討することをお勧めします。内部的には HAPI を利用しています。

于 2012-01-07T04:40:54.133 に答える