异步消息的主要目的是解决跨系统的通信。所谓异步消息,即发送信息者无须等待消息接收者的处理及返回,甚至无须关心消息是否发送与接受成功。在异步消息中有两个极其重要的概念,即消息代理和目的地。当消息发送者发送信息后,消息将有消息代理管理,消息代理保证消息传递到目的的。
JMS(Java 消息服务)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行信息交换,并且提供标准的产生,发送,接受消息的接口简化企业应用的开发
JMS由以下元素组成:
1:JMS消息代理实现
2:JSM客户
3:JMS生产者
4:JMS消费者
5:JMS消息
6:JMS队列
7:JMS主题
JMS异步消息通信实例
1:下载JMS的一种实现ActiveMQ
http://activemq.apache.org/ 去官网下载适合自己的版本 然后点开wrapper.exe或者activemq.bat启动
2:创建消息发送者Spring Boot Web应用ch8_1Sender
3:在application.properties配置文件中添加如下内容
spring.activemq.broker-url=tcp://localhost:61616
4:定义消息
在sender包下创建MyMessage类 具体代码如下
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; } }
5:在ch8_1Sender的主类中实现接口 具体代码如下
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()); } }
6:按照上面的步骤创建信息接收者ch8_1Receive
7:在receive包中创建监听器类ReceiverMsg
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")); } }