今回は、Spring Framework 4.3の変更点紹介シリーズの第4回で、JMS関連の変更点を紹介します。
シリーズ
- 第1回:Spring 4.3 DIコンテナ関連の主な変更点
- 第2回:Spring 4.3 データアクセス関連の主な変更点
- 第3回:Spring 4.3 キャッシュ関連の主な変更点
- 第5回:Spring 4.3 Web関連の主な変更点
- 第6回:Spring 4.3 WebSocket関連の主な変更点
- 第7回(最終回):Spring 4.3 テスト関連の主な変更点
動作検証環境
- Spring Framework 4.3.0.RELEASE
- Spring Boot 1.4.0.BUILD-SNAPSHOT (2016/6/11時点)
- Apache ActiveMQ 5.13.3
JMS Improvements
今回は、JMS関連の主な変更点をみていきます。公式リファレンスを見る限りでは、機能追加はないようです。
No | JMS関連の主な変更点 |
---|---|
1 |
@SendTo をクラスレベルに付与することができるようになります。 |
2 |
@JmsListener と@JmsListeners をメタアノテーションとして利用できるようになります。 |
@SendTo
をクラスレベルに付与することができる
Spring 4.3から、@SendTo
をクラスレベルに付与することで、応答メッセージの送信先を各メソッドで共有することができます。
リスナー側
@Component
@SendTo("testReplyQueue") // クラスレベルに指定して、応答先を各メソッドで共有!!
public class JmsTestListeners {
private static final Logger logger = LoggerFactory.getLogger(JmsTestListeners.class);
@JmsListener(destination = "testQueue", selector = "JMSPriority = 9", concurrency = "1-50")
public String receiveHighQuality(String text) {
logger.info(text);
return "HighQuality:" + UUID.randomUUID().toString();
}
@JmsListener(destination = "testQueue", selector = "JMSPriority < 9", concurrency = "1")
public String receiveOtherQuality(String text) {
logger.info(text);
return "OtherQuality:" + UUID.randomUUID().toString();
}
}
クライアント側
@Autowired
ConnectionFactory connectionFactory;
@Test
public void send() throws InterruptedException, JMSException {
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
jmsTemplate.setExplicitQosEnabled(true);
jmsTemplate.setPriority(9);
jmsTemplate.send("testQueue", (s) -> s.createTextMessage("high"));
TextMessage message = (TextMessage) jmsTemplate.receive("testReplyQueue");
logger.info(message.getText());
jmsTemplate.setPriority(4);
jmsTemplate.send("testQueue", (s) -> s.createTextMessage("low"));
message = (TextMessage) jmsTemplate.receive("testReplyQueue");
logger.info(message.getText());
}
ちなみに・・・Spring Bootから提供されているspring-boot-starter-activemq
を利用すれば、特別なBean定義を行わなくても組み込みActive MQを使用したJMSを利用することができます。
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
@JmsListener
と@JmsListeners
をメタアノテーションとして利用できる
Spring 4.3から、@JmsListener
と@JmsListeners
をメタアノテーションとして利用できるようになります。
どういう切り口でカスタムアノテーションを作るかは自由ですが、ここでは、優先度が高いメッセージのみを扱うリスナーであることを表現するカスタムアノテーションを使ってみます。
カスタムアノテーション
package com.example;
import org.springframework.core.annotation.AliasFor;
import org.springframework.jms.annotation.JmsListener;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@JmsListener(destination = "", selector = "JMSPriority = 9", concurrency = "1-50")
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface HighQualityJmsListener {
@AliasFor(annotation = JmsListener.class)
String destination();
}
リスナーメソッド
// @JmsListener(destination = "", selector = "JMSPriority = 9", concurrency = "1-50")
@HighQualityJmsListener(destination = "testQueue") // カスタムアノテーションを利用
public String receiveHighQuality(String text) {
logger.info(text);
return "HighQuality:" + UUID.randomUUID().toString();
}
まとめ
今回は、JMS関連の主な変更点を紹介しました。大きな変更はないようですが、同じような定義を集約できる仕組みの導入はありがたいと思います。次回は、いよいよ「Web関連の主な変更点」を紹介する予定です。