このテキストはNigel Dikin による記事の始まりの無料翻訳です。 このテキストは、関心のある読者が新しいAPIに慣れ親しむことを目的としています。
JMS 1.1 APIは動作するために多くのコードを必要としますが、うまく証明できたため、2002年以降変更されていません。 JMS 2.0では、新しいAPIはJMSメッセージの送受信を簡単にするように設計されています。 以前のAPIは廃止されておらず、新しいAPIとともに引き続き機能します。
JMS 2.0 APIには、JMSContext、JMSProducer、およびJMSConsumerという新しいインターフェースが登場しました。
- JMSContextは、従来のJMS APIの接続とセッションを置き換えます
- JMSProducerは、メソッドのチェーン( Builderパターン )を呼び出すことにより、メッセージ配信設定、ヘッダー、プロパティを設定できる軽量のMessageProducerの代替品です。
- JMSConsumerはMessageConsumerを置き換え、同じ原則で使用されます。
JMS送信
比較のため。 JMS 1.1:
public void sendMessageJMS11(ConnectionFactory connectionFactory, Queue queue, String text) { try { Connection connection = connectionFactory.createConnection(); try { Session session =connection.createSession(false,Session.AUTO_ACKNOWLEDGE); MessageProducer messageProducer = session.createProducer(queue); TextMessage textMessage = session.createTextMessage(text); messageProducer.send(textMessage); } finally { connection.close(); } } catch (JMSException ex) { // handle exception (details omitted) } }
JMS 2.0:
public void sendMessageJMS20(ConnectionFactory connectionFactory, Queue queue, String text) { try (JMSContext context = connectionFactory.createContext();){ context.createProducer().send(queue, text); } catch (JMSRuntimeException ex) { // handle exception (details omitted) } }
- バージョン2.0では、JavaSE 7のtry-with-resourcesを使用します
- Session.AUTO_ACKNOWLEDGEパラメーターは、デフォルトでJMSContextに設定されています。 別の値(CLIENT_ACKNOWLEDGEまたはDUPS_OK_ACKNOWLEDGE)を設定する場合、別のパラメーターとして渡されます
- ConnectionおよびSessionオブジェクトの代わりにJMSContextによって使用されます
- TextMessageを作成するには、行をsendメソッドに渡すだけです
新しいAPIの特徴は、チェック済みのJMSExceptionではなく、RuntimeException-JMSRuntimeExceptionをスローすることです。 これにより、オプションでJMS例外を処理できなくなります。
同期JMS検索
メッセージを同期的に受信する場合の違いを比較します。
JMS 1.1:
public String receiveMessageJMS11(ConnectionFactory connectionFactory,Queue queue){ String body=null; try { Connection connection = connectionFactory.createConnection(); try { Session session =connection.createSession(false,Session.AUTO_ACKNOWLEDGE); MessageConsumer messageConsumer = session.createConsumer(queue); connection.start(); TextMessage textMessage = (TextMessage)messageConsumer.receive(); body = textMessage.getText(); } finally { connection.close(); } } catch (JMSException ex) { // handle exception (details omitted) } return body; }
JMS 2.0:
public String receiveMessageJMS20(ConnectionFactory connectionFactory,Queue queue){ String body=null; try (JMSContext context = connectionFactory.createContext();){ JMSConsumer consumer = context.createConsumer(queue); body = consumer.receiveBody(String.class); } catch (JMSRuntimeException ex) { // handle exception (details omitted) } return body; }
- try-with-resourcesが接続を自動的に閉じるために使用します
- ConnectionおよびSessionオブジェクトの代わりにJMSContextによって使用されます
- AUTO_ACKNOWLEDGEはデフォルトで設定されています
- JMS 1.1のJMSExceptionの代わりに、処理されない可能性のあるJMSRuntimeExceptionによって処理される
- connection.start()が自動的に実行されます
- 文字列は、Messageオブジェクトを受信してTextMessageにキャストし、getTextメソッドを呼び出す代わりに、consumer.receiveBody(String.class)メソッドを介して自動的に取得されます。
非同期JMSの取得
JavaSEでは、メッセージを非同期的に受信するために、JMS 1.1で次のコードが使用されます。
MessageConsumer messageConsumer = session.createConsumer(queue); messageConsumer.setMessageListener(messageListener); connection.start();
JMS 2.0では、次のようになります。
JMSConsumer consumer = context.createConsumer(queue); consumer.setMessageListener(messageListener);
MessageConsumerの代わりに-JMSConsumer。 接続が自動的に開始されます。
Java EE WebまたはEJBアプリケーションでは、以前と同様に、setMessageListenerメソッドの代わりにメッセージ駆動型Beanを使用する必要があります
JMSContextオブジェクトをJava EEアプリケーションに挿入する
Java EEアプリケーションでは、Injectアノテーションを使用してJMSContextを挿入できます。 挿入後、JMSContextはアプリケーションサーバーによって管理されます。
次のコードスニペットにより、JMSContextをセッションBeanまたはサーブレットに埋め込むことができます。
@Inject @JMSConnectionFactory( "jms/connectionFactory") private JMSContext context; @Resource(lookup = "jms/dataQueue") private Queue dataQueue; public void sendMessageJavaEE7(String body) { context.send(dataQueue, body); }
JMSContextのクローズは、アプリケーションサーバーによって自動的に行われます。 JTAトランザクションがリクエスト中に実行される場合、JMSContextはコミット後に自動的に閉じます;トランザクションがない場合、リクエストの最後に閉じられます。
これで私はやめることにした。 慣れて始めるには、この情報で十分です。 多くの詳細と追加情報はこちら:
JMS 2.0の新機能、パート1:使いやすさ
JMS 2.0の新機能、パート2 —新しいメッセージング機能