以前、渋谷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
の設定は不要!!)