1、linux下安装activemq(5.15.9)
官网:https://activemq.apache.org/
版本号:5.15.9
2、上传到服务器并解压
cd /opt
tar -zxvf apache-activemq-5.15.9-bin.tar.gz
3、启动
cd /opt/apache-activemq-5.15.9/bin/
./activemq start
#注意端口5672 1883 61613 61614 61616是否被占用
小贴士
./activemq start 启动
./activemq stop 停止
./activemq restart 重启
4、新建springboot项目,且添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
5、修改application.properties文件
#activemq通讯地址
spring.activemq.broker-url=tcp://192.168.9.192:61616
spring.activemq.user=admin
spring.activemq.password=admin
#是否启用内存模型(就是不安装mq,项目启动时同时启动一个mq实例)
spring.activemq.in-memory=false
#信任所有包
spring.activemq.packages.trust-all=true
#是否替换默认的连接池,使用activemq的连接池需引入依赖
spring.activemq.pool.enabled=false
#true 为队列模式 false 为开启发布订阅模式 只能选中其中一种模式
spring.jms.pub-sub-domain=true
6、增加配置文件(activemq)
@Configuration
@EnableJms
public class ActiveMQConfig {
@Value("${spring.activemq.broker-url}")
private String host;
@Bean
public ConnectionFactory getActiveMqConnection(){
return new ActiveMQConnectionFactory(host);
}
//配置的是queue类型消息,如果要使用topic类型的消息,则需要配置该bean
@Bean
public JmsListenerContainerFactory jmsTopicListenerContainerFactory(ConnectionFactory connectionFactory){
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
//这里必须设置为true,false则表示是queue类型
factory.setPubSubDomain(true);
return factory;
}
}
7、生产者
@RestController
public class HelloControl {
@Autowired
private JmsMessagingTemplate jms;
//发送queue类型消息
@GetMapping("/queue")
public String queue(String message) {
jms.convertAndSend(new ActiveMQQueue("testQueue"),message);
return message;
}
//发送topic类型消息
@GetMapping("/topic")
public String sendTopicMsg(String message){
jms.convertAndSend(new ActiveMQTopic("testTopic"),message);
return message;
}
//发送延迟queue类型消息
//如果要使用延迟队列 需要修改服务器上activemq.xml文件中的broker标签里增加schedulerSupport="true"
@GetMapping("/delayQueue")
public String delayQueue(String message) {
Map<String, Object> headers = new HashMap<>();
//java8语法 显示当前时间
System.out.println("调用接口时间:"+ LocalDateTime.now());
//发送延迟队列,延迟24 小时
headers.put(ScheduledMessage.AMQ_SCHEDULED_DELAY, 1000 * 60);
jms.convertAndSend(new ActiveMQQueue("delayQueue"),message,headers);
return message;
}
@GetMapping("transactionQueue")
public String transactionQueue(String message,Integer num) throws JMSException {
ConnectionFactory connectionFactory = jms.getConnectionFactory();
Connection connection = connectionFactory.createConnection();
connection.start();
// 开启事务,只能设置AUTO_ACKNOWLEDGE,其他模式无效且不受控制
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
MessageProducer tq=session.createProducer(new ActiveMQQueue("transactionQueue"));
for (int i = 0; i < 20; i++) {
tq.send(session.createTextMessage(message+"第"+i+"条消息"));
}
// 测试判断,偶数提交,奇数回滚
if (num % 2 == 0) {
session.commit();
}else {
session.rollback();
}
return message;
}
}
8、消费者
@Component
public class ActiveMQConsumer {
@JmsListener(destination = "testQueue")
public void ListenQueue(String msg){
System.out.println("接收到queue消息:" + msg);
}
@JmsListener(destination = "testTopic",containerFactory = "jmsTopicListenerContainerFactory")
public void ListenTopic(String msg){
System.out.println("接收到topic消息:" + msg);
}
//如果要使用延迟队列 需要修改服务器上activemq.xml文件中的broker标签里增加schedulerSupport="true"
@JmsListener(destination = "delayQueue")
public void ListenDelayQueue(String msg){
System.out.println("消费时间:"+ LocalDateTime.now()+"接收到queue消息:" + msg);
}
@JmsListener(destination = "transactionQueue")
public void transactionQueue(String message, ActiveMQMessage mes) throws JMSException {
System.out.println("消费: "+message);
// 手动确认消息,当开启事务时,此设置无效
mes.acknowledge();
}
}
小贴士:
activemq(5.15.9)默认持久化方案是kahadb数据库,恢复数据也方便!