java-ee
Java Messaging Service(JMS)
サーチ…
前書き
Java Message Serviceは、アプリケーションがメッセージの作成、送信、受信、および読み取りを可能にするJava APIです。 JMS APIは、Javaプログラミング言語で書かれたプログラムが他のメッセージング実装と通信できるようにする、共通のインターフェースセットと関連するセマンティクスを定義します。 JMSを使用すると、疎結合ではなく、非同期で信頼性の高い通信が可能になります。
備考
Java Message Service(JMS)は、アプリケーションが非同期にメッセージを作成、送信、受信、および読み取ることを可能にする標準のJava APIです。
JMSは、アプリケーションが他のメッセージプロバイダとやりとりすることを可能にするインタフェースとクラスの一般的なセットを定義します。
JMSはJDBCと似ています。JDBCは異なるデータベース(Derby、MySQL、Oracle、DB2など)に接続し、JMSはさまざまなプロバイダ(OpenMQ、MQSeries、SonicMQなど)に接続します。
JMSリファレンスの実装はOpen Message Queue(OpenMQ)です。これはオープンソースプロジェクトであり、スタンドアロンアプリケーションで使用することも、アプリケーションサーバーでビルドすることもできます。これは、GlassFishに統合されたデフォルトのJMSプロバイダです。
ConnectionFactoryの作成
接続ファクトリは、アプリケーションがConnection
オブジェクトを作成してプロバイダに接続できるようにする管理オブジェクトです。 javax.jms.ConnectionFactory
は、管理者が定義した構成パラメータをカプセル化するインタフェースです。
ConnectionFactory
クライアントを使用するには、JNDIルックアップ(またはインジェクションを使用)を実行する必要があります。次のコードはJNDI InitialContext
オブジェクトを取得し、JNDI名でConnectionFactory
オブジェクトを検索するために使用しInitialContext
。
Context ctx = new InitialContext();
ConnectionFactory connectionFactory =
(ConnectionFactory) ctx.lookup("jms/javaee7/ConnectionFactory");
このインターフェイスで利用可能な方法があるcreateConnection()
を返すメソッドConnection
オブジェクトと新しいJMS 2.0 createContext()
を返すメソッドJMSContext
。
Connection
またはJMSContext
をデフォルトのユーザIDで作成することも、ユーザ名とパスワードを指定することもできます。
public interface ConnectionFactory {
Connection createConnection() throws JMSException;
Connection createConnection(String userName, String password) throws JMSException;
JMSContext createContext();
JMSContext createContext(String userName, String password);
JMSContext createContext(String userName, String password, int sessionMode);
JMSContext createContext(int sessionMode);
}
ActiveMQライブラリーをメッセージングに使用する(activemq jmsプロバイダー固有の実装)
セットアップActiveMQ
- activemq.apache.orgからActiveMQディストリビューションをダウンロードし、どこかに解凍してください
- スクリプトbin / activemqを使用して、ローカルホスト上でセキュリティ保護されていない状態でサーバをすぐに起動することができます
- 実行中は、 http:// localhost:8161 / admin /にあるローカルサーバーのコンソールにアクセスできます。
- conf / activemq.xmlを変更して設定します
- タイトルは、ユーザーのactivemq jmsプロバイダ固有の実装例を示しているため、classpathにactivemq-all.jarを追加する必要があります。
スタンドアロンクライアント経由でメッセージを送信する
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
public class JmsClientMessageSender {
public static void main(String[] args) {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // ActiveMQ-specific
Connection con = null;
try {
con = factory.createConnection();
Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE); // non-transacted session
Queue queue = session.createQueue("test.queue"); // only specifies queue name
MessageProducer producer = session.createProducer(queue);
Message msg = session.createTextMessage("hello queue"); // text message
producer.send(msg);
} catch (JMSException e) {
e.printStackTrace();
} finally {
if (con != null) {
try {
con.close(); // free all resources
} catch (JMSException e) { /* Ignore */ }
}
}
}
}
メッセージのポーリング
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class JmsClientMessagePoller {
public static void main(String[] args) {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // ActiveMQ-specific
Connection con = null;
try {
con = factory.createConnection();
Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE); // non-transacted session
Queue queue = session.createQueue("test.queue"); // only specifies queue name
MessageConsumer consumer = session.createConsumer(queue);
con.start(); // start the connection
while (true) { // run forever
Message msg = consumer.receive(); // blocking!
if (!(msg instanceof TextMessage))
throw new RuntimeException("Expected a TextMessage");
TextMessage tm = (TextMessage) msg;
System.out.println(tm.getText()); // print message content
}
} catch (JMSException e) {
e.printStackTrace();
} finally {
try {
con.close();
} catch (JMSException e) {/* Ignore */ }
}
}
}
MessageListenerの使用
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class JmsClientMessageListener {
public static void main(String[] args) {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // ActiveMQ-specific
Connection con = null;
try {
con = factory.createConnection();
Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE); // non-transacted session
Queue queue = session.createQueue("test.queue"); // only specifies queue name
MessageConsumer consumer = session.createConsumer(queue);
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message msg) {
try {
if (!(msg instanceof TextMessage))
throw new RuntimeException("no text message");
TextMessage tm = (TextMessage) msg;
System.out.println(tm.getText()); // print message
} catch (JMSException e) {
System.err.println("Error reading message");
}
}
});
con.start(); // start the connection
Thread.sleep(60 * 1000); // receive messages for 60s
} catch (JMSException e1) {
e1.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
try {
con.close(); // free all resources
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
メッセージングにjndiベースのルックアップを使用する(実装以外の例ではない)
この方法では、実装に依存しないコードを複数のjmsプラットフォームにわたって記述してデプロイすることができます。以下の基本例は、activemq jms serverに接続し、メッセージを送信します。
import java.util.Properties;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class JmsClientJndi {
public static void main(String[] args) {
Properties jndiProps = new Properties();
// Following two could be set via a system property for flexibility in the code.
jndiProps.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
jndiProps.setProperty(Context.PROVIDER_URL, "tcp://localhost:61616");
QueueConnection conn = null;
QueueSession session = null;
QueueSender sender = null;
InitialContext jndi = null;
try {
jndi = new InitialContext(jndiProps);
QueueConnectionFactory factory = (QueueConnectionFactory) jndi.lookup("ConnectionFactory");
conn = factory.createQueueConnection();
conn.start();
session = conn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = (Queue) jndi.lookup("dynamicQueues/test.queue");
sender = session.createSender(queue);
TextMessage msg = session.createTextMessage();
msg.setText("Hello worlds !!!!! ");
sender.send(msg);
} catch (NamingException e) {
e.printStackTrace();
} catch (JMSException e) {
e.printStackTrace();
} finally {
try {
if (sender != null)
sender.close();
if (session != null)
session.close();
if (conn != null)
conn.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}