LoginSignup
2
6

More than 5 years have passed since last update.

【使い方】JMS(Java Message Service)

Posted at

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); // メッセージ送信
    }
}
2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6