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」と入力すると次の画面に遷移します
![スクリーンショット 2016-08-08 10.33.46.png](https://qiita-image-store.s3.amazonaws.com/0/110352/810861da-dd22-f990-97c9-a6676b921b23.png "スクリーンショット 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 Enqueued` と `Message Dequeued` が `1` になっているのがわかります
![スクリーンショット 2016-08-08 10.36.41.png](https://qiita-image-store.s3.amazonaws.com/0/110352/363fd303-0ae2-1d47-f43e-1f7006374d2a.png "スクリーンショット 2016-08-08 10.36.41.png")