We have our clients in an extranet based environment that need to connect to our JMS queues. Should they be able to just lookup our queues and connectionFactories in the JNDI space. I mean what is the recommended and scalable approach...
1 に答える
初期化中、クライアント アプリケーションはConnectionFactory
and (とDestination
の両方の基本型) オブジェクトにアクセスする必要があります。このようなタイプは総称して管理対象オブジェクトと呼ばれ、JMS 仕様では、およびインターフェースを実装する必要があると規定されています。Queue
Topic
javax.naming.Referenceable
java.io.Serializable
これは、ネーミング サービスだけでなく、他のメカニズムを介しても、クライアントが管理対象オブジェクトを利用できるようにすることができることを意味します。たとえば、管理対象オブジェクトをシリアル化してファイルに保存したり、シリアル化されたオブジェクトを電子メール メッセージの添付ファイルとして送信したり、.jso
(Java シリアル化オブジェクト) ファイルを Web/FTP サーバーで使用できるようにしたりすることができます。このようなアプローチは、エクストラネット クライアントが内部ネーム サービスの連絡先の詳細を知らないという懸念がある場合に役立ちます。
しかし、これは、JMS クライアントが管理対象オブジェクトを使用できるようにするための最適なテクノロジはどれかという質問の答えにはなりません。ネームサービス?共有ファイル システム上のシリアライズされたオブジェクト ファイル? Web サーバーまたは FTP サーバーですか? データベース?答えは、「普遍的に最良の」方法はないということです。1 つのテクノロジを使用して標準化する組織もあれば、別のテクノロジを使用することを好む組織もあります。多くの組織で使用される JMS クライアントを作成している場合は、クライアントが管理対象オブジェクトにアクセスする方法を柔軟にすることができます。これを行うには、次のようなシグネチャを持つメソッドを実装します。
public Object importObject(String instructions);
そのメソッドの実装ではinstructions
、オブジェクトの取得に使用するテクノロジを判断するために、の先頭を確認する必要があります。例えば:
obj1 = importObject("naming#path/in/naming/service");
obj2 = importObject("file#path/to/file.jso");
obj3 = importObject("exec#command to execute");
(実際には、指示は、アプリケーションにハードコーディングするのではなく、たとえばコマンドライン引数または構成ファイルから取得する必要があります。)
上記のバリアントを使用すると、Web または FTP サーバー (おそらくcurlを使用)、データベース、またはユーザーにとって最も便利なものからファイル"exec#..."
を取得できる任意のシェル コマンドを実行できます。何年も前に、私は別のミドルウェア テクノロジ (CORBA) 用に似たタイプのユーティリティ関数を書きましたが、それが提供する柔軟性は非常に有用であることが判明しました。ここで、私の CORBA ユーティリティ関数について少し読むことができます。.jso
注意すべきもう 1 つの問題 (および @skaffman がコメントで言及した問題) は、JMS 仕様は API を定義していますが、オンザワイヤ プロトコルを定義していないことです。このため、通常、異なる JMS 製品間の相互運用性はありません。したがって、企業内の JMS アプリケーションが製品 X で構築されている場合、企業外部の JMS クライアントも製品 X で構築する必要があります。製品 X で使用される通信プロトコルを使用してから、製品 Y の通信プロトコルを使用してメッセージを再送信します。これは、異なる JMS 製品間の相互運用性を提供する 1 つの方法です。
免責事項: この回答の冗長さにだまされて、私が JMS の専門家であると思わないでください。私は実際に JMS を使用した経験が非常に限られているため、誰かが私のアドバイスに欠陥があるというコメントを追加したとしても、その人はおそらく正しいでしょう。