LibertyとActiveMQを連携する備忘録


前提

  • 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」と入力すると次の画面に遷移します

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

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 になっているのがわかります