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

LibertyとActiveMQを連携する備忘録

More than 3 years have passed since last update.

前提

  • Mac OS X
  • WebSphere Liberty

準備

ActiveMQのインストール

brew install apache-activemq

ActiveMQの起動

/usr/local/Cellar/activemq/{version}/bin/activemq start
http://localhost:8161

へアクセスすると管理画面が表示されます

Manage ActiveMQ broker をクリックすると認証を求められますので「admin/admin」と入力すると次の画面に遷移します
スクリーンショット 2016-08-08 10.33.46.png

メッセージ送受信プログラムの作成

Queueの送信プログラム

import java.io.IOException;
import java.io.PrintWriter;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/test")
public class SenderQueue extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            sendMessage(request, response);
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }
    }

    public void sendMessage(HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        PrintWriter out = response.getWriter();

        QueueConnectionFactory cf1 = (QueueConnectionFactory) new InitialContext().lookup("java:comp/env/jndi_JMS_BASE_QCF");
        Queue queue = (Queue) new InitialContext().lookup("java:comp/env/jndi/MDBQ");

        QueueConnection con = cf1.createQueueConnection();
        con.start();
        QueueSession sessionSender = con.createQueueSession(false,
                javax.jms.Session.AUTO_ACKNOWLEDGE);

        QueueSender send = sessionSender.createSender(queue);

        TextMessage msg = sessionSender.createTextMessage();
        msg.setStringProperty("COLOR", "RED");
        msg.setText("Liberty Sample Message");

        send.send(msg);

        if (con != null)
            con.close();
        out.println("SendMessage Completed");

    }
}

Queueの受信プログラム

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.jms.Message;
import javax.jms.MessageListener;

@MessageDriven
public class ReceiverQueue implements MessageListener{
    @Resource
    MessageDrivenContext ejbcontext;

    @PostConstruct
    public void postConstruct() {

    }

    @Override
    public void onMessage(Message message) {
        try {
            System.out.println("Message Received in MDB" + message);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Liberty server.xmlの設定

リソースアダプターの設定

<resourceAdapter id="activemq" location="/your local directory/activemq-rar-5.13.1.rar">
    <properties.activemq serverUrl="tcp://localhost:61616" />
</resourceAdapter>

MDBの接続設定

<jmsActivationSpec id="sample/SampleJMS">
    <properties.activemq destinationRef="MDBQ" destinationType="javax.jms.Queue"/>
</jmsActivationSpec>

<jmsQueue id="MDBQ" jndiName="jndi/MDBQ">
    <properties.activemq physicalName="MDBQ"/>
</jmsQueue>

接続ファクトリーの設定

<jmsQueueConnectionFactory connectionManagerRef="ConMgr6" jndiName="jndi_JMS_BASE_QCF">
    <properties.activemq serverUrl="tcp://localhost:61616" />
</jmsQueueConnectionFactory>

アプリの起動

先ほどの送受信プログラムのwarプロジェクトをサーバーにaddして
起動します

設定したサーブレットへアクセスしSendMessage Completedが表示されたら成功です

ActiveMqの確認

管理画面の Queues を確認すると MDBQ という Queue が作成されて
Messages EnqueuedMessage Dequeued1 になっているのがわかります
スクリーンショット 2016-08-08 10.36.41.png

enzen
元CGクリエイター、元デザイナー、元AD、元バーテン、元営業、で今はフロントエンジニアで、サーバーサイドエンジニアでインフラやAIもちょっとできるなにかです。
http://enzen.hatenablog.com/
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