JMSとは
Java Message Serviceの略で、Javaでメッセージングサービスを利用するための標準APIのことです。プログラムの疎結合や非同期処理を行う際に用いられます。通信方式には「Point-to-Point」と「Publisher-Subscriber」の2種類があります。
環境
- NetBeans8.2
- Java8
- JavaEE7
- GlassFish4.1
Pub/Sub方式
1つのメッセージを複数の送信先に送ることができる方式です。
JMS(Pub/Sub)で出てくる登場人物は以下の通り。
項目 | 意味 |
---|---|
トピック | 送信先、または受信先 |
Publisher | メッセージ送信者 |
Subscriber | メッセージ受信者 |
ブローカー | メッセージ管理(トピック管理) |
ブローカーの作成
ブローカーはPublisherが送信したメッセージを管理するプロバイダです。
glassfish-resources.xml
<resources>
<admin-object-resource enabled="true" jndi-name="jms/UserTopic" object-type="user" res-adapter="jmsra" res-type="javax.jms.Topic">
<description/>
<property name="Name" value="UserTopic"/>
</admin-object-resource>
</resources>
連携オブジェクトの作成
User.java
@Data
Public class User implements Serializable {
private String name;
}
Publisherの作成
メッセージをトピックと呼ばれる送信先に送信します。
Publisher.java
@Stateless
public class Publisher {
@Inject
private JMSContext context;
@Resource(mappedName = "jms/UserTopic")
private Topic topic;
public void send(String name) throws JMSException {
User user = new User();
user.setName(name);
context.createProducer().send(topic, user);
}
}
Subscriberの作成
登録したトピックからメッセージを受信します。Publiserからメッセージが送信されると、onMessage
メソッドが呼ばれます。
Subscriber.java
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "jms/UserTopic"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic")
})
public class Subscriber implements MessageListener {
@Override
public void onMessage(Message msg) {
try {
User user = msg.getBody(User.class);
System.out.println(user.getName());
} catch (JMSException ex) {
// 例外処理
}
}
}
使い方
JmsResource.java
@RequestScoped
@Path("jms")
public class JmsResource {
@Inject
private Publisher publisher;
@POST
public void send(@FormParam("name") String name){
publisher.send(name); // メッセージ送信
}
}