JMS:Java Message Service应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序
之间,或分布式系统中发消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS
提供支持。
启动:下载apache-mq后bin目录下对应系统(win32/win64)activemq.bat为启动项目,用户名:admin 密码:admin网页访问地址:http://localhost:8161/admin/ 对应可以看到Queues/Topics等标签
配置:application.propertity
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.pool.enabled=false
springBoot添加ActiveMQ支持:spring-boot-starter-activemq
优势:异步,可靠(JMS保证消息只会传递一次)
点对点消息模型,又称消费生产模型:每个消息只有一个接受者,消息发送者和消息接受者没有时间依赖性,当消息发送者
发送消息时,无论接收者在不在运行,都能获取到消息,当接收者收到消息的时候,会发送确认收到
通知(achnowledgement),多个消费者会轮流消费队列中的消息,ActiveMQQueue
//生产者@Service
public class Producer {
@Resource
private JmsMessagingTemplate jmsMessagingTemplate;
// 发送消息,destination是发送到的队列,message是待发送的消息
public void sendMessage(String destinationName, final String message){
System.out.println("***************>>>>>>>>>发送queue消息 " + message);
Destination destination = new ActiveMQQueue(destinationName);
jmsMessagingTemplate.convertAndSend(destination, message);
}
}
//消费者
@Service
public class Consumer {
// 使用JmsListener配置消费者监听的队列,其中text是接收到的消息
@JmsListener(destination = "mytest.queue")
public void receiveQueue(String text) {
System.out.println("Consumer收到的报文为:"+text);
}
}
发布/订阅消息传送模型:发布者发布一个消息,通过topic传递给所有的客户端,一个消息可以传递给多个订阅者,发布者和订阅者有时间依赖性,只有当客户端创建订阅后才能接受消息,且订阅者需一直保持活动状态以接收消息。为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。ActiveMQTopic
@Service
public class Publisher {
@Resource
private JmsMessagingTemplate jmsMessagingTemplate;
public void publish(String destinationName,String message){
ActiveMQTopic destination = new ActiveMQTopic(destinationName);
System.out.println("***************>>>>>>>>>发布topic消息 " + message);
jmsMessagingTemplate.convertAndSend(destination, message);
}
}
@Service
public class Subscriber {
@JmsListener(destination = "mytest.topic", containerFactory = "jmsListenerContainerFactory")
public void subscribe(String text){
System.out.println("**********<<<<<<1收到的订阅消息为:"+text);
}
@Bean
JmsListenerContainerFactory<?> jmsListenerContainerFactory(ConnectionFactory connectionFactory){
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(true);
return factory;
}
}