springboot 整合activeMQ

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数据库,恢复数据也方便!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值