SpringBoot使用JMS(activeMQ)的两种方式 队列消息、订阅/发布

时间:2023-03-09 04:02:26
SpringBoot使用JMS(activeMQ)的两种方式  队列消息、订阅/发布

刚好最近同事问我activemq的问题刚接触所以分不清,前段时间刚好项目中有用到,所以稍微整理了一下,仅用于使用

1.下载ActiveMQ

地址:http://activemq.apache.org/download.html

2.启动ActiceMQ

windows版本直接双击启动bin/win64/activemq.batSpringBoot使用JMS(activeMQ)的两种方式  队列消息、订阅/发布

linux版本也是下载解压在bin/linux-x86-64或者linux-x86-32下

cd apache-activemq-5.14.1/bin/linux-x86-64/

  

./activemq start

启动完成之后,浏览器输入:http://localhost:8161/admin 会显示如下界面就证明成功了

SpringBoot使用JMS(activeMQ)的两种方式  队列消息、订阅/发布

浏览器输入:http://localhost:8161/admin/queues.jsp 需要输入账户密码默认:admin/admin

则会显示消息队列主题等信息

SpringBoot使用JMS(activeMQ)的两种方式  队列消息、订阅/发布

3.Springboot配置ActiveMQ

加入activemq 依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

配置连接属性:

如果是properties后缀文件

spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.pool.enabled=false

如果是yml后缀文件

spring:
profiles : dev
application:
name: user-service
activemq:
broker-url: tcp://localhost:61616
user: admin
password: admin
in-memory: true
pool:
enabled: true
max-connections: 500

4.消息队列的使用

生产者、消费者模式

创建生产者

package org.tfkf.minsurance.jms.activemq;

import javax.jms.Destination;

import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component; /**
*
* @Author zyt
* @Date 2018/3/15 17:39
*/
@Component
public class Producer { @Autowired
private JmsMessagingTemplate jmsMessagingTemplate; /**
* 消息发送
* @param destinationName
* @param message
* @return
*/
public boolean sendMessage(final String message,String destinationName) {
boolean result = true;
try {
Destination destination = new ActiveMQQueue(destinationName);
jmsMessagingTemplate.convertAndSend(destination, message);
} catch (Exception e) {
e.printStackTrace();
result = false;
}
return result;
}
}

创建消费者,@JmsListener注解,在java7及以下版本jdk中,可以使用@JmsListeners代替它。

    @JmsListener(destination = "name.msg")
public void receive(String message){
System.out.println("name.msg消费者:"+message);
}

我们封装一个调用例子

SpringBoot使用JMS(activeMQ)的两种方式  队列消息、订阅/发布

调用实例

SpringBoot使用JMS(activeMQ)的两种方式  队列消息、订阅/发布

返回结果

SpringBoot使用JMS(activeMQ)的两种方式  队列消息、订阅/发布

5.发布/订阅模式

先发布一个话题

package org.tfkf.minsurance.jms.activemq;

import javax.jms.Destination;

import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component; /**
*
* @Author zyt
* @Date 2018/3/15 17:40
*/
@Component
public class Producer { @Autowired
private JmsMessagingTemplate jmsMessagingTemplate; /**
* 发布者 发布topic
* @param destinationName
* @param message
* @return
*/
public boolean publish(String destinationName, final String message) {
boolean result = true;
try {
Destination destination = new ActiveMQTopic(destinationName);
jmsMessagingTemplate.convertAndSend(destination, message);
} catch (Exception e) {
e.printStackTrace();
result = false;
}
return result;
}
}

订阅者

package org.tfkf.minsurance.jms.activemq;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component; /**
*
* @Author zyt
* @Date 2018/3/15 17:41
*/
@Component
public class Consumer { @JmsListener(destination = "login.topic",containerFactory = "myJmsContainerFactory")
public void subscribe(String message){
System.out.println("login.topic订阅者一:"+message);
} @JmsListener(destination = "login.topic",containerFactory = "myJmsContainerFactory")
public void subscribe1(String message){
System.out.println("login.topic订阅者二:"+message);
}
}

在pub/sub模式中,对消息的监听需要对containerFactory进行以下配置

package org.tfkf.minsurance.user.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.config.SimpleJmsListenerContainerFactory;
import javax.jms.ConnectionFactory; @Configurationpublic class ConfigBase{ /**
* 在pub/sub模式中,对消息的监听需要对containerFactory进行以下配置
* @param connectionFactory
* @return
*/
@Bean
public JmsListenerContainerFactory<?> myJmsContainerFactory(ConnectionFactory connectionFactory){
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(true);
return factory;
} }

封装调用

SpringBoot使用JMS(activeMQ)的两种方式  队列消息、订阅/发布

调用实例

SpringBoot使用JMS(activeMQ)的两种方式  队列消息、订阅/发布

返回结果

SpringBoot使用JMS(activeMQ)的两种方式  队列消息、订阅/发布

两种模式实践就ok了