--- 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対応が行われました。
どこよりも早い Spring Boot 1.2 解説 #渋谷Java from Toshiaki Maki
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プログラミングも超簡単です。
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug from Toshiaki Maki
ちょっとしたサンプルのソースコードは以下で全量です。 ``` 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 message = MessageBuilder .withPayload("Hello!") .build(); messagingTemplate.send("hoge", message); return "Hello World!"; } @JmsListener(destination = "hoge") void handleMessage(Message 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`の設定は不要!!)