---
title: Spring BootでJMSを試すの簡単すぎワロタ
tags: ["JMS", "Java", "Spring", "Spring Boot"]
categories: ["Programming", "Java", "org", "springframework", "boot"]
date: 2015-01-05T14:52:27Z
updated: 2015-01-05T15:29:55Z
---

以前、渋谷Javaで発表しましたが、Spring Boot 1.2でJMS対応が行われました。

<iframe src="//www.slideshare.net/slideshow/embed_code/42665829?startSlide=23" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/makingx/spring-boot12" title="どこよりも早い Spring Boot 1.2 解説 #渋谷Java" target="_blank">どこよりも早い Spring Boot 1.2 解説 #渋谷Java</a> </strong> from <strong><a href="//www.slideshare.net/makingx" target="_blank">Toshiaki Maki</a></strong> </div>

HornetQの場合、依存関係に`org.springframework.boot:spring-boot-starter-hornetq`を追加する。以上です。これで諸々の設定が有効になります。簡単！
そして、組み込みJMSサーバーにも対応しています。HornetQの場合、`org.hornetq:hornetq-jms-server`を依存関係に追加して、`application.yml`に以下を設定します。

``` yaml
spring:
  hornetq:
    mode: embedded
    embedded:
      enabled: true
      queues: hoge
```

これで、Spring Bootアプリケーションを起動するだけでJMSプログラミングが可能になります！

JSUGで発表したSpring 4.1のJMS対応機能を使うとJMSプログラミングも超簡単です。

<iframe src="//www.slideshare.net/slideshow/embed_code/42608374?startSlide=45" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/makingx/springone-2gx-2014-spring-41-jsug" title="SpringOne 2GX 2014 参加報告 &amp; Spring 4.1について #jsug" target="_blank">SpringOne 2GX 2014 参加報告 &amp; Spring 4.1について #jsug</a> </strong> from <strong><a href="//www.slideshare.net/makingx" target="_blank">Toshiaki Maki</a></strong> </div>

ちょっとしたサンプルのソースコードは以下で全量です。

``` java
package demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    private static final Logger log = LoggerFactory.getLogger(App.class);

    @Autowired
    JmsMessagingTemplate messagingTemplate;

    @RequestMapping(value = "/")
    String hello() {
        Message<String> message = MessageBuilder
                .withPayload("Hello!")
                .build();
        messagingTemplate.send("hoge", message);
        return "Hello World!";
    }

    @JmsListener(destination = "hoge")
    void handleMessage(Message<String> message) {
        log.info("received! {}", message);
    }
}
```

http://localhost:8080 にアクセスすると`Hello!`というメッセージを宛先`hoge`に送ります。

`hoge`に送られたメッセージは`@JmsListener(destination = "hoge")`のついたメソッドで非同期にさばかれます。

`App.java`を実行して、

``` bash
$ curl localhost:8080
```

にアクセスすれば、

``` bash
2015-01-05 23:45:19.000  INFO 8542 --- [enerContainer-1] demo.App                                 : received! GenericMessage [payload=Hello!, headers={jms_redelivered=false, jms_deliveryMode=2, JMSXDeliveryCount=1, jms_destination=HornetQQueue[hoge], jms_priority=4, id=90dd5c83-fbb4-5f65-63cf-2b33fedd88bf, jms_timestamp=1420469118999, jms_expiration=0, jms_messageId=ID:780742e5-94e9-11e4-b9be-31fabf5e64db, timestamp=1420469119000}]
```
というログが出力されます。JMSコンテナ側のスレッドになっている点に注目ですね。

短すぎるサンプルコードは[Github](https://github.com/making/jms-demo)へ。

Spring Boot 1.2 + JMS簡単すぎワロタ。


(ちなみにActiveMQのインメモリモードを試す場合は、`org.springframework:spring-jms`+`org.apache.activemq:activemq-broker`を追加でした。`application.yaml`の設定は不要!!)
