xinglun 2020-02-16
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- spring boot web支持:mvc,aop... --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency>
1.2 创建application.yml配置文件
server: port: 8080 #activemq配置 spring: activemq: broker-url: tcp://127.0.0.1:61616 user: admin password: admin
1.3 创建生产者,通过JMSTemplate模板发送消息
@Component public class ActiveMQProvider { //注入JMSTemplate模板 @Resource private JmsTemplate jmsTemplate; //创建方法 public void sendMessage(){ //点对点,创建队列 ActiveMQQueue queue=new ActiveMQQueue("boot_queue"); //发送消息 jmsTemplate.convertAndSend(queue,"生产者产生的消息~"); } }
1.4 创建客户端访问的方法
@RestController public class ProController { @Resource private ActiveMQProvider activeMQProvider; @RequestMapping("/sendMessage") public String sendMessage(){ activeMQProvider.sendMessage(); return "success"; } }
1.5 创建消费者
1.5.1 创建配置文件
server: port: 8081 spring: activemq: broker-url: tcp://127.0.0.1:61616 user: admin password: admin
1.5.2 创建消费者
//消费者消费 @JmsListener(destination = "boot_queue") public void getMessage(TextMessage message) throws JMSException { System.out.println("消费者获取到消息:"+message.getText()); }
2.SpringBoot发送主题
2.1 生产者需要制定当前发送的主题,需要开启
@Component public class ActiveMQProvider { //注入JMSTemplate模板 @Resource private JmsTemplate jmsTemplate; //创建方法 public void sendMessage(){ //点对点,创建队列 //ActiveMQQueue queue=new ActiveMQQueue("boot_queue"); //发布订阅:创建主题 ActiveMQTopic topic=new ActiveMQTopic("boot_topic"); //springboot默认是queue jmsTemplate.setPubSubDomain(true); //发送消息 jmsTemplate.convertAndSend(topic,"生产者产生主题的消息~"); } }
2.2 消费者消费同样开启
//springboot默认只配置queue类型消息,如果要使用topic类型的消息,则需要配置该bean @Bean public JmsListenerContainerFactory jmsTopicListenerContainerFactory(ConnectionFactory connectionFactory){ DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); //这里必须设置为true,false则表示是queue类型 factory.setPubSubDomain(true); return factory; }
//消费者消费 destination队列或者主题的名字
@JmsListener(destination = "boot_topic",containerFactory = "jmsTopicListenerContainerFactory") public void getMessage(TextMessage message) throws JMSException { System.out.println("消费者获取到消息:"+message.getText()); }
3.SpringBoot整合ActiveMQ开启持久化
3.1.开启队列持久化
jmsTemplate.setDeliveryMode(2); jmsTemplate.setExplicitQosEnabled(true); jmsTemplate.setDeliveryPersistent(true);
3.2.开启主题持久化
不会进行数据消费的,但是数据可以持久化
@Bean(name = "topicListenerFactory") public JmsListenerContainerFactory<DefaultMessageListenerContainer> topicListenerFactory(ConnectionFactory connectionFactory){ DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setSubscriptionDurable(true);// Set this to "true" to register a durable subscription, factory.setClientId("B"); factory.setConnectionFactory(connectionFactory); return factory; } //消费者消费 destination队列或者主题的名字 @JmsListener(destination = "boot_topic",containerFactory = "topicListenerFactory") public void getMessage(TextMessage message,Session session) throws JMSException { System.out.println("消费者获取到消息:"+message.getText()); }