2011-01-12 9 views
1

シナリオ:私は、Java EEとの経験がほとんどないにもかかわらずのJava EE/GlassFishの - スレッドと接続

私は、スレッドなどと協力して、かなりの時間のためのJava SEを使用してきました。

私はサードパーティ製のJavaライブラリを使用して、リモートサーバー(サードパーティ製の会社)に接続しています。ライブラリはいくつかのスレッドを作成し、接続自体を維持しています。 (ライブラリの新しいインスタンスを作成して)新しい接続を何度も開くことはできません。私はいつも接続を維持するライブラリの同じインスタンスを維持する必要があります。

これはJava SEアプリケーションでは非常に簡単です。

私は、社内でこのライブラリの機能をその接続で使用できるようにするために、Webサービス(おそらくGlassFishなどを使用)を作成したいと考えています。 つまり、要求インスタンス間で有効に保たれるカスタムリモート接続(コードによって作成されていないか、自分のコードで管理されていない)が必要です。

質問: これは実現可能ですか?もしそうなら、どの技術を見てみるべきですか?

+0

あなたはDB接続を意味しますか? –

+0

いいえ、サードパーティ製の独自のソケット接続です。私はJDBCなどを使用することはできません。 –

答えて

2

あなたは接続プールを使用してこれを行うことができます。リモートサーバに接続する必要がある場合は、毎回インスタンス化するのではなく、このプールから接続を取得してください。これはメモリフットプリントと効率を向上させるのに役立ちます。使用時間が長くなると、接続をプールに戻すことができます。

+0

まあ、私は接続を作成していません。独自のライブラリはスレッドを作成して接続を開きます。私が不明な場合は申し訳ありません。 –

+1

これが当てはまる場合は、そのライブラリ内のメソッドを呼び出すことができますが、ライブラリ内のメソッドへの呼び出しがsingleton.whatであることを確認して、そのライブラリオブジェクトへの参照を取得し、そうであれば、同じ接続を返します(または遠隔呼び出しの必要はありません)。新しい接続を行ってください。そうすれば、そのライブラリを効率的に使用できます。ここで接続プールについて話していません。 – UVM

+1

実際に試しました始めるのに似た何か、しかしそれはうまくいかなかった。スレッドは稼働し続けましたが、コードの入力ミスが原因で機能しませんでした。私はそれを見つけ、静的なシングルトンとしてライブラリを維持することは実際に働く!ライブラリ自体はスレッドセーフであり、初期にライブラリを作成するためのファクトリメソッドを同期しました。他の読者のために、これはリソースを共有するための最適な解決策ではありません。私の場合には機能しますが、たとえば、複数のアプリケーションサーバーを持ち、それらの間でデータを共有したい場合には、これは機能しません。 –

1

最近サーブレットコンテナとしてTomcat、JAX-WS実装としてMetro 2.0を使用して同様のシステムを実装しました。私のサービスはバックエンドコンポーネント(C++で実装されています)へのソケット接続を維持し、独自のネットワークプロトコルを使用してそれらと通信します。

コンポーネントとの高レベルの通信(接続確立、ハンドシェイクなど)とコンポーネントとの実際の通信を管理する「ネットワークセレクタ」スレッドを管理するために、「Component Manager」スレッドを使用しました。この「ネットワークセレクタ」は、Java Socket Selectorファミリーのクラスを使用する非同期ノンブロッキングソケットを使用していました.Socket Selectorクラスとのやりとりに単一のスレッドを使用することは、複数のスレッドが使用されているJavaプラットフォームのバグを示す重要なポイントです。

これまでのところうまくいきましたので、確かに可能だと言えます。何か明確化が必要な場合は、ここに投稿するか、私に電子メールを送ってください(私のプロフィールを参照)。

+0

あなたの信じられないほど迅速な答えをありがとう!しかし、私は自分自身の接続を制御することはできません。独自のライブラリはスレッドを作成して接続を開きます。実際には、これらのスレッドは要求インスタンス間で動作し続けているようですが、ライブラリのインスタンスへの参照をどのようにシリアライズせずに共有できるかわかりません。 –

+0

ああ、これは簡単かもしれません。おそらく、これらの接続スレッドを管理するために「マネージャスレッド」が必要になるかもしれません。要点は、初期化中に要求/応答ワークフローとは独立してバックエンドリソースを管理するスレッドを作成する必要があることです。 – trojanfoe

+0

あなたの優れた答えに感謝します。 –

0

たとえば、JDBC接続プールと同じ方法でJNDIを通じて提供する必要があります。

次に、接続がファクトリに戻されていることを確認してから、アプリケーションサーバーのライフサイクルに統合して、プログラマチックにプルアップ/プルダウンする必要があります。

注意しないと、ここには厄介なクラスローダーの問題が潜んでいることに注意してください。あなたはファクトリとクライアントの共通のクラスを持っていなければなりません。標準のランタイムライブラリにないクラスであれば、リフレクションを使用してメソッドにアクセスしない限り、正しく共有する方法を見つけ出す必要があります。

+0

こんにちはThorbjørn!ファクトリを静的参照として保持するのではなく、JNDIとファクトリを共有する利点は何ですか?現在のところ、これは正常に動作するようです。 ContextがServletContextListenerで初期化/破棄されたときに、サードパーティ製のファクトリに接続の作成/削除を指示しています。 –

+0

あなたのコードが実行されているのと同じクラスローダーにプールが存在することが期待できるかどうかによって決まります。 –

関連する問題