JMS的自动配置 Spring Boot对JMS的自动配置位于org.springframework.boot.autoconfigure.jms包下,支持JMS的实现有ActiveMQ和Artemis 以ActiveMQ为例,Spring Boot为我们定义了ActiveMQConnectionFactory的Bean作为连接,并通过以“spring.activemq”为前缀的属性配置ActiveMQ的连接属性,主要包含: spring.activemq.broker-url= tcp://localhost:61616 spring.activemq.user= spring.activemq.password= spring.activemq.in-memory=true 另外,Spring Boot在JmsAutoConfiguration自动配置类中为我们配置了JmsTemplate;并且在JmsAnnotationDrivenConfiguration配置类中,为我们开启了注解式消息监听的支持,即自动开启@EnableJms。
我们使用JMS的一种实现ActiveMQ讲解JMS实例。因此,需要事先安装ActiveMQ(注意需要安装jdk)。可访问http://activemq.apache.org/下载符合自己的ActiveMQ。解压缩即可完成安装。 解压缩后,双击“apache-activemq-5.15.15\bin\win64”下的“wrapper.exe”或“activemq.bat”启动ActiveMQ,然后,通过“http://localhost:8161”运行ActiveMQ的管理界面,管理员账号和密码默认为admin/admin
使用JMS的实现ActiveMQ进行两个应用系统间的点对点式通信 1.创建基于Apache ActiveMQ5的Spring Boot应用ch8_1Sender(消息发送者) 2.配置ActiveMQ的消息代理地址 3.定义消息 4.发送消息 5.创建消息接收者(ch8_1Receive) 6.定义消息监听器接收消息 7.运行测试
<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.sender</groupId> <artifactId>SpringBootSender</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <!-- 声明项目配置依赖编码格式为 utf-8 --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <fastjson.version>1.2.24</fastjson.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
配置文件application.properties中,配置ActiveMQ的消息代理地址,具体如下:
spring.activemq.broker-url= tcp://localhost:61616
package com.ch.ch8_1sender; import java.util.ArrayList; import javax.jms.JMSException; import javax.jms.MapMessage; import javax.jms.Message; import javax.jms.Session; import org.springframework.jms.core.MessageCreator; public class MyMessage implements MessageCreator { @Override public Message createMessage(Session session) throws JMSException { MapMessage mapm = session.createMapMessage(); ArrayList<String> arrayList = new ArrayList<String>(); arrayList.add("陈恒1"); arrayList.add("陈恒2"); mapm.setObject("mesg1", arrayList);// 只能存Java的基本对象 mapm.setString("mesg2", "测试消息2"); return mapm; } }
package com.ch.ch8_1sender; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.jms.core.JmsTemplate; @SpringBootApplication public class Ch81SenderApplication implements CommandLineRunner{ @Autowired private JmsTemplate jmsTemplate; public static void main(String[] args) { SpringApplication.run(Ch81SenderApplication.class, args); } /** * 我们这里为了方便操作使用run方法发送消息, 当然完全可以使用控制器通过Web访问 */ @Override public void run(String... args) throws Exception { // new MyMessage()回调接口方法createMessage产生消息 jmsTemplate.send("mydestination", new MyMessage()); } }
创建消息接收者
<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.receiver</groupId> <artifactId>SpringBootReceiver</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <!-- 声明项目配置依赖编码格式为 utf-8 --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <fastjson.version>1.2.24</fastjson.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
spring.activemq.broker-url= tcp://localhost:61616
package com.ch.ch8_1receive; import java.util.ArrayList; import javax.jms.JMSException; import javax.jms.MapMessage; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; @Component public class ReceiverMsg { @JmsListener(destination = "mydestination") public void receiverMessage(MapMessage mapm) throws JMSException { @SuppressWarnings("unchecked") ArrayList<String> arrayList = (ArrayList<String>) mapm.getObject("mesg1"); System.out.println(arrayList); System.out.println(mapm.getString("mesg2")); } }
package com.ch.ch8_1receive; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Ch81ReceiveApplication { public static void main(String[] args) { SpringApplication.run(Ch81ReceiveApplication.class, args); } }