2012-01-08 12 views
1

非同期JMSはどのように機能しますか?JavaでのJMSの仕組みは?

public class JmsAdapter implements MessageListener, ExceptionListener 
{ 
private ConnectionFactory connFactory = null; 
private Connection conn = null; 
private Session session = null; 

public void receiveMessages() 
{ 
    try 
    { 
     this.session = this.conn.createSession(true, Session.SESSION_TRANSACTED); 

     this.conn.setExceptionListener(this); 

     Destination destination = this.session.createQueue("SOME_QUEUE_NAME"); 

     this.consumer = this.session.createConsumer(destination); 

     this.consumer.setMessageListener(this); 

     this.conn.start(); 
    } 
    catch (JMSException e) 
    { 
     //Handle JMS Exceptions Here 
    } 
} 

@Override 
public void onMessage(Message message) 
{ 
    try 
    { 
     //Do Message Processing Here 

     //Message sucessfully processed... Go ahead and commit the transaction. 
     this.session.commit(); 
    } 
    catch(SomeApplicationException e) 
    { 
     //Message processing failed. 
     //Do whatever you need to do here for the exception. 

     //NOTE: You may need to check the redelivery count of this message first 
     //and just commit it after it fails a predefined number of times (Make sure you 
     //store it somewhere if you don't want to lose it). This way you're process isn't 
     //handling the same failed message over and over again. 
     this.session.rollback() 
    } 
} 

}

しかし、私は、Java & JMSへの新たなんだ。私は、サンプルコードの下にきました。私はおそらくonMessageメソッドでメッセージを消費します。しかし、私は正確にどのように動作するのか分かりません。

JmsAdapterクラスにmainメソッドを追加する必要がありますか? mainメソッドを追加した後、jarを作成して&する必要がありますか?jarを "java -jar abc.jar"として実行しますか?

ご迷惑をおかけして申し訳ありません。

私が知りたいことは、mainメソッドを追加すると、mainでreceiveMessages()を呼び出すだけでいいのですか?そして走った後、リスナーは走り続けますか?メッセージがある場合は、onMessageメソッドで自動的に取得されますか?

また、リスナーが引き続きリスニングしている場合は、CPUを使用しませんか?スレッドの場合、スレッド&をスリープ状態にすると、CPU使用率はゼロになります。リスナーの場合はどのように動作しますか?

注:私はTomcatサーバーしか持っていません&私はどんなjmsサーバーも使用しません。リスナーにJBossなどの特定のjmsサーバーが必要なのかどうかはわかりません。しかし、いずれにしても、私は風穴以外何も持っていないと仮定してください。 ありがとう!

+0

私はあなたの質問がJMSと何をしているかはわかりません。あなたは "Javaでプログラムを実行する方法"を求めているようです。 – skaffman

+0

メインメソッドを作成せずに、サーバーにデプロイすると、クラスが監視しているキューに送信されたメッセージはすべてonMessage()メソッドによって処理されます。 onMessage()には、メッセージがキューに到着したときに実行するロジックが含まれます。 – Logan

+0

JMS実装には何を使用していますか? –

答えて

5

実行を開始する前に歩くことを学ぶ必要があります。

  • Javaプログラミングのチュートリアルを読み、実行します。これは、(とりわけ)コマンドラインからJavaプログラムをコンパイルして実行する方法を説明する必要があります。

  • JMSに関するチュートリアルを読み、実行します。

  • 実行可能ファイルの作成方法については、Oracleの資料を参照してください。

  • デザインあなたのアプリケーションをしようとしています。あなたが示されており、私たちに語ってきたものを見てみると


  • あなたそのクラスにmainメソッドを追加することもできますが、実行 JARファイルを作成するために、メインメソッドでクラスの名前を指定するマニフェストエントリを持つJARファイルを作成しなければなりません。

    • を(少なくとも)あなたが処理するコードを追加

    • をキャッチされた例外をログにコードを追加します。

    • あなたはそのコードが動作する前に行う必要があることを多くのありますメッセージ

    • は、接続ファクトリとの接続が

    オブジェクト初期化するコードを追加します

    私が上記のように、あなたはおそらく何らかのデザインを必要とするので、 "キッチンシンク"クラスのすべてで終わることはありません。私はメインのメソッドを追加した場合


、私は単純にメインでreceiveMessages()を呼び出す必要がありますか?

これは1つのアプローチです。しかし、私が言ったように、あなたは本当にデザインあなたのアプリケーションが必要です。

実行後、リスナーは動作し続けますか?

完全にはっきりしていません。 mainスレッドが存続している間は実行し続ける必要がありますが、mainメソッドが復帰したときにどうなるかはすぐに分かりません。 (これは、JMSスレッドがデーモンスレッドとして作成されているかどうかに依存し、それが指定されていない。)

をし、メッセージが存在する場合、それはonMessageメソッドで自動的に取得するのでしょうか?

は、あなたのonMessageメソッドが呼び出される前に(ソケットから読み込み)それぞれのメッセージが検索されるように思われます。


リスナーが継続的に聞いている場合にも、それはCPUを取りません???

正しく実装されているかどうか。

スレッドの場合、スレッド&をスリープ状態にすると、CPU使用率はゼロになります。リスナーの場合はどのように動作しますか?一定レベルで

、リスナスレッドは、、ネットワークソケットに到着するデータのを待機するシステムコールを行います。私はそれが正確にどのように実装されているのかわかりませんが、このはというネットワークソケットのInoutStreamコールで簡単にとすることができます。ブロッキングシステムコールで待機している間は、スレッドによってCPUは使用されません。

+0

私たちは、(私はチャットでこの議論を続行する)を参照してくださいメイン?そして走った後、リスナーは走り続けますか?メッセージがある場合は、onMessageメソッドで自動的に取得されますか? – Mike

0

このリンクは、Oracle AQを使用した例ではかなり良い場所のようです。サンプルをセットアップして実行する方法を説明するサンプルセクションがあります。うまくいけば、これは助けることができます。

Link to Oracle Advanced Queueing