依赖引入
<dependency>
<groupId>org.messaginghub</groupId>
<artifactId>pooled-jms</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-artemis</artifactId>
</dependency>
application.properties:
spring.artemis.mode=native
spring.artemis.host=你的Artemis服务器IP
spring.artemis.port=61616
spring.artemis.user=root
spring.artemis.password=root
spring.artemis.pool.enabled=true
spring.artemis.pool.max-connections=50
spring.artemis.embedded.enabled=false
发送消息:面向JmsTemplate编程
package cc.mq;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
/**
* @author 张家琛
* @version 1.0
* @date 2023/1/22 20:21
*/
@Service
public class MessageService {
private final JmsTemplate jmsTemplate;
@Autowired
public MessageService(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}
//p2p模型
public void produce(String message) {
this.jmsTemplate.setPubSubDomain(false);
this.jmsTemplate.convertAndSend("myQueue", message);
}
//pub-sub模型
public void publish(String message) {
this.jmsTemplate.setPubSubDomain(true);
this.jmsTemplate.convertAndSend("myTopic", message);
}
}
接收消息
Spring Boot会自动将@JmsListener注解修饰的方法注册为消息监听器,如果没有显示配置监听器容器工厂,此时Spring Boot会自动配置一个监听器容器工厂。
监听消息队列的监听器
package cc.mq;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
/**
* @author 张家琛
* @version 1.0
* @date 2023/1/22 20:53
*/
@Component
public class QueueListener {
//表示监听myQueue消息队列
@JmsListener(destination = "myQueue")
public void processMessage(String content){
System.out.println("接收到消息:"+content);
}
}
Spring Boot的消息监听器总是监听消息队列,监听消息主题得为@JmsListener注解指定containerFactory属性,设置使用自定义的监听器容器工厂。
自定义监听器容器工厂
package cc.mq.config;
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import javax.annotation.Resource;
import javax.jms.ConnectionFactory;
/**
* @author 张家琛
* @version 1.0
* @date 2023/1/22 20:57
*/
@Configuration
public class JmsConfig {
@Bean
@Resource
public DefaultJmsListenerContainerFactory myFactory(DefaultJmsListenerContainerFactoryConfigurer configurer
, ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
configurer.configure(factory, connectionFactory);
//设置成Pub-Sub消息模型!!!
factory.setPubSubDomain(true);
return factory;
}
}
然后再进行配置监听消息主题监听器
package cc.mq;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
/**
* @author 张家琛
* @version 1.0
* @date 2023/1/22 20:56
*/
@Component
public class TopicListener {
@JmsListener(destination = "myTopic", containerFactory = "myFactory")
public void processMessage(String content) {
System.out.println("收到主题消息:" + content);
}
}
然后启动服务器,对服务器发送请求,我这用的浏览器直接访问
消息发送出去了
监听器也接收到了
再试试消息主题监听
发送消息:
没问题也成功发送成功了并接收到了