Help us understand the problem. What is going on with this article?

【使い方】JMS(Java Message Service)

More than 3 years have passed since last update.

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); // メッセージ送信
    }
}
mr-hisa-child
自称フルスタックエンジニアです。デザイン(CSS)は苦手ですが、フロントエンドからサーバサイドまで面倒見れます。 Java / SpringBoot / JavaEE / Quarkus / AWS / vuejs / Nuxtjs / AWSソリューションアーキテクトアソシエイト / VSCode / BootStrap / Vuetify / TypeScript
frevoworks
AWSを用いたクラウドアプリケーションの開発・保守を行っています。
https://www.frevo-works.co.jp/
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした