Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@mr-hisa-child

【使い方】JMS(Java Message Service)

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); // メッセージ送信
    }
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
4
Help us understand the problem. What are the problem?