IK.AM

@making's tech note


Spring BootでJMSを試すの簡単すぎワロタ

🗃 {Programming/Java/org/springframework/boot}
🏷 JMS 🏷 Java 🏷 Spring 🏷 Spring Boot 
🗓 Updated at 2015-01-05T14:52:27Z  🗓 Created at 2015-01-05T14:52:27Z   🌎 English Page

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

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

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

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

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

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

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を実行して、

$ curl localhost:8080

にアクセスすれば、

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へ。

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

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


✒️️ Edit  ⏰ History  🗑 Delete