原题目:Spring 认证指南 - 理解如何应用 JMS 代理公布和订阅音讯(Spring 中国教育管理中心)
Spring 认证指南:理解如何应用 JMS 代理公布和订阅音讯
应用 JMS 进行消息传递
本指南将疏导您实现应用 JMS 代理公布和订阅音讯的过程。
你将建造什么
您将构建一个应用程序,该应用程序应用 SpringJmsTemplate 公布单个音讯并 @JmsListener 应用托管 bean 的正文办法订阅它。
你须要什么
约 15 分钟
最喜爱的文本编辑器或 IDE
JDK 1.8 或更高版本
Gradle 4+ 或 Maven 3.2+
您还能够将代码间接导入 IDE:
弹簧工具套件 (STS)
IntelliJ IDEA
如何实现本指南
像大多数 Spring 入门指南一样,您能够从头开始并实现每个步骤,也能够绕过您曾经相熟的根本设置步骤。无论哪种形式,您最终都会失去工作代码。
要从头开始,请持续[scratch]。
要跳过基础知识,请执行以下操作:
下载并解压本指南的源代码库,或应用 Git 克隆它:git clone https://github.com/spring-gui…
光盘进入 gs-messaging-jms/initial
跳转到从 Spring Initializr 开始。
实现后,您能够对照中的代码查看后果 gs-messaging-jms/complete。
从 Spring Initializr 开始
您能够应用这个事后初始化的我的项目并单击 Generate 下载 ZIP 文件。此我的项目配置为适宜本教程中的示例。
手动初始化我的项目:
导航到 https://start.spring.io。该服务提取应用程序所需的所有依赖项,并为您实现大部分设置。
抉择 Gradle 或 Maven 以及您要应用的语言。本指南假设您抉择了 Java。
单击 Dependencies 并抉择 Spring for Apache ActiveMQ 5。
单击生成。
下载生成的 ZIP 文件,该文件是依据您的抉择配置的 Web 应用程序的存档。
如果您的 IDE 具备 Spring Initializr 集成,您能够从您的 IDE 实现此过程。
你也能够从 Github 上 fork 我的项目并在你的 IDE 或其余编辑器中关上它。
创立音讯接收器
Spring 提供了将音讯公布到任何 POJO(Plain Old Java Object)的办法。
本指南介绍如何通过 JMS 音讯代理发送音讯。首先,创立一个蕴含电子邮件详细信息的简略 POJO。请留神,咱们不会发送电子邮件。咱们将无关要发送什么信息的详细信息从一个中央发送到另一个中央。
src/main/java/hello/Email.java
package hello;
public class Email {
private String to;
private String body;
public Email() {
}
public Email(String to, String body) {
this.to = to;
this.body = body;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
@Override
public String toString() {
return String.format(“Email{to=%s, body=%s}”, getTo(), getBody());
}
}
这个 POJO 非常简单,蕴含两个字段(to 和 body),以及假设的 getter 和 setter 集。
从这里,您能够定义一个音讯接收器:
src/main/java/hello/Receiver.java
package hello;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
@Component
public class Receiver {
@JmsListener(destination = “mailbox”, containerFactory = “myFactory”)
public void receiveMessage(Email email) {
System.out.println(“Received <” + email + “>”);
}
}
Receiver 也称为音讯驱动的 POJO。如代码所示,无需实现任何特定接口或办法具备任何特定名称。此外,该办法能够具备灵便的签名。请特地留神,该类没有 JMS API 的导入。
JmsListener 正文定义了 Destination 此办法应侦听的名称以及对用于创立底层音讯侦听器容器的援用
JmsListenerContainerFactory。严格来说,除非您须要自定义构建容器的形式,否则最初一个属性不是必须的,因为 Spring Boot 会在必要时注册一个默认工厂。
参考文档对此进行了更具体的介绍。
应用 Spring 发送和接管 JMS 音讯
接下来,连贯发送器和接收器。
src/main/java/hello/Application.java
package hello;
import javax.jms.ConnectionFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.context.ConfigurableApplicationContext;
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.core.JmsTemplate;
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 Application {
@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 // Serialize message content to json using TextMessage
public MessageConverter jacksonJmsMessageConverter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
converter.setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName(“_type”);
return converter;
}
public static void main(String[] args) {
// Launch the application
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);
// Send a message with a POJO – the template reuse the message converter
System.out.println(“Sending an email message.”);
jmsTemplate.convertAndSend(“mailbox”, new Email(“info@example.com”, “Hello”));
}
}
@SpringBootApplication 是一个不便的正文,它增加了以下所有内容:
@Configuration: 将类标记为应用程序上下文的 bean 定义源。
@EnableAutoConfiguration:通知 Spring Boot 依据类门路设置、其余 bean 和各种属性设置开始增加 bean。例如,如果 spring-webmvc 位于类门路上,则此正文将应用程序标记为 Web 应用程序并激活要害行为,例如设置 DispatcherServlet.
@ComponentScan: 通知 Spring 在包中查找其余组件、配置和服务 hello,让它找到控制器。
该 main()办法应用 Spring Boot 的 SpringApplication.run()办法来启动应用程序。您是否留神到没有一行 XML?也没有 web.xml 文件。这个 Web 应用程序是 100% 纯 Java,您不用解决任何管道或基础设施的配置。
@EnableJms 触发发现用 正文的办法 @JmsListener,在幕后创立音讯侦听器容器。
为了分明起见,咱们还定义了一个在接收器的正文中 myFactory 援用的 bean。JmsListener 因为咱们应用的
DefaultJmsListenerContainerFactoryConfigurer 是 Spring Boot 提供的基础设施,这
JmsMessageListenerContainer 与 Boot 默认创立的基础设施雷同。
默认 MessageConverter 只能转换根本类型(如 String, Map, Serializable),咱们 Email 不是 Serializable 成心的。咱们想应用 Jackson 并将内容序列化为文本格式的 JSON(即作为 a TextMessage)。Spring Boot 检测到 a 的存在 MessageConverter 并将其与默认值 JmsTemplate 和任何
JmsListenerContainerFactory 由
DefaultJmsListenerContainerFactoryConfigurer.
JmsTemplate 使将音讯发送到 JMS 指标变得简略。在 mainrunner 办法中,启动后,您能够应用 jmsTemplate 发送一个 EmailPOJO。因为咱们的自定义 MessageConverter 曾经主动关联到它,所以 TextMessage 只生成了一个 JSON 文档。
您没有看到定义的两个 bean 是 JmsTemplate 和 ConnectionFactory。这些是由 Spring Boot 主动创立的。在这种状况下,ActiveMQ 代理嵌入运行。
默认状况下,Spring Boot 通过 JmsTemplate 设置为. 也以雷同的形式配置。要笼罩,请通过 Boot 的属性设置(在外部或通过设置环境变量)进行设置。而后确保接管容器具备雷同的设置。
pubSubDomainfalseJmsMessageListenerContainerspring.jms.isPubSubDomain=trueapplication.properties
SpringJmsTemplate 能够通过它的办法间接接管音讯 receive,但这只能同步工作,这意味着它会阻塞。这就是为什么咱们建议您应用侦听器容器,例如
DefaultMessageListenerContainer 基于缓存的连贯工厂,这样您就能够异步应用音讯并以最大的连贯效率。
构建一个可执行的 JAR
您能够应用 Gradle 或 Maven 从命令行运行应用程序。您还能够构建一个蕴含所有必要依赖项、类和资源的单个可执行 JAR 文件并运行它。构建可执行 jar 能够在整个开发生命周期、跨不同环境等中轻松地作为应用程序交付、版本化和部署服务。
如果您应用 Gradle,则能够应用./gradlew bootRun. 或者,您能够应用构建 JAR 文件./gradlew build,而后运行 JAR 文件,如下所示:
java -jar build/libs/gs-messaging-jms-0.1.0.jar
如果您应用 Maven,则能够应用./mvnw spring-boot:run. 或者,您能够应用构建 JAR 文件,./mvnw clean package 而后运行该 JAR 文件,如下所示:
java -jar 指标 /gs-messaging-jms-0.1.0.jar
此处形容的步骤创立了一个可运行的 JAR。您还能够构建经典的 WAR 文件。
当它运行时,暗藏在所有日志记录中,您应该会看到以下音讯:
发送电子邮件。
收到 <Email{to=info@example.com , body=Hello}>
概括
祝贺!您曾经开发了基于 JMS 的音讯的发布者和使用者。