习使用嵌入式ActiveMQ配置Spring Boot应用程序,以便在JMSTemplate 的帮助下发送和接收JMS消息。
项目结构
请在 Eclipse 中创建一个 Maven 应用程序并创建下面给定的文件夹结构。
要运行该示例,运行时需要 Java 1.8。
Maven 配置
pom.xml
使用 Spring Boot 和 ActiveMQ 依赖项更新文件。此外,我们将需要Jackson进行对象到 JSON 的转换。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd;">
<modelVersion>4.0.0</modelVersion>
<groupId>com.howtodoinjava.demo</groupId>
<artifactId>SpringJMSTemplate</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>SpringJMSTemplate</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-broker</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
</project>
@EnableJms 和 JmsListenerContainerFactory 配置
通过使用注释对其进行@SpringBootApplication
注释来创建 Spring Boot 应用程序类。在类中添加此代码。
import javax.jms.ConnectionFactory;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.support.converter.MappingJackson2MessageConverter;
import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.jms.support.converter.MessageType;
@SpringBootApplication
@EnableJms
public class JMSApplication
{
@Bean
public JmsListenerContainerFactory<?> myFactory(
ConnectionFactory connectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer)
{
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
// This provides all boot's default to this factory, including the message converter
configurer.configure(factory, connectionFactory);
// You could still override some of Boot's default if necessary.
return factory;
}
@Bean
public MessageConverter jacksonJmsMessageConverter()
{
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
converter.setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName("_type");
return converter;
}
}
@SpringBootApplication
annotation 等价于 using@Configuration
,@EnableAutoConfiguration
以及@ComponentScan
它们的默认属性。使用注解配置轻松配置 spring 应用程序是一种快捷方式。@EnableJms
启用@JmsListener
由JmsListenerContainerFactory
.- 该
JmsListenerContainerFactory
负责创建负责特定端点侦听容器。作为 的典型实现DefaultJmsListenerContainerFactory
提供了底层MessageListenerContainer
. MappingJackson2MessageConverter
用于将 a 的有效负载Message
从序列化形式转换为类型化对象,反之亦然。- 我们已经配置了
MessageType.TEXT
. 此消息类型可用于传输基于文本的消息。当客户端收到 时TextMessage
,它处于只读模式。如果此时客户端尝试写入消息,MessageNotWriteableException
则会抛出 a。
带有 @JmsListener 的 JMS 消息接收器
消息接收器类是非常简单的类,具有带注释的单一方法@JmsListener
。@JmsListener
允许您将托管 bean 的方法公开为 JMS 侦听器端点。
因此,每当配置的队列上有任何消息可用时(在此示例中,队列名称为“jms.message.endpoint”),receiveMessage
将调用带注释的方法(即)。
@JmsListener
是一个可重复的注释,因此您可以在同一方法上多次使用它来将多个 JMS 目标注册到同一方法。
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
@Component
public class MessageReceiver {
@JmsListener(destination = "jms.message.endpoint")
public void receiveMessage(Message msg)
{
System.out.println("Received " + msg );
}
}
该Message
班是简单的POJO类。
import java.io.Serializable;
import java.util.Date;
public class Message implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String content;
private Date date;
public Message() {
}
public Message(Long id, String content, Date date) {
super();
this.id = id;
this.content = content;
this.date = date;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "Message [id=" + id + ", content=" + content + ", date=" + date + "]";
}
}
使用 JmsTemplate 发送消息
要发送 JMS 消息,您将需要JmsTemplate
来自 spring 容器的 bean 类的引用。调用它的convertAndSend()
方法来发送消息。
import java.util.Date;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.jms.core.JmsTemplate;
public class Main
{
public static void main(String[] args)
{
// Launch the application
ConfigurableApplicationContext context = SpringApplication.run(JMSApplication.class, args);
//Get JMS template bean reference
JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);
// Send a message
System.out.println("Sending a message.");
jmsTemplate.convertAndSend("jms.message.endpoint", new Message(1001L, "test body", new Date()));
}
}
演示
执行上述Main
类的 main() 方法。这将启动 Spring boot 应用程序,然后向 queue 发送消息jms.message.endpoint
。MessageReceiver.receiveMessage()
已经在监听这个队列地址。所以消息将通过此方法接收,可以通过将其打印到控制台来验证。
在控制台中,输出将是这样的:
发送消息。
收到的消息 [id=1001, content=test body, date=Fri Jul 07 14:19:19 IST 2017]
显然,消息已成功发送和接收。这就是带有嵌入式 ActiveMQ的Spring JMSTemplate快速示例的全部内容。
原创文章,作者:254126420,如若转载,请注明出处:https://blog.ytso.com/243850.html