LoginSignup
1

More than 5 years have passed since last update.

LibertyとActiveMQを連携する備忘録

Posted at

前提

  • 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

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
1