springboot+activemq手动处理

1. springboot框架中activemq手动连接处理
2. activemq事务性分析

记录一个最近使用activemq的使用总结,场景是activemq异步处理一个高访问量的接口,不能实时入库,而改用定时处理消息,隔断时间触发处理。

  • 手动建立MQ连接
    在这里插入图片描述
    上图已经对activemq进行过实体配置了,因此,下面部分代码,是直接取用的ActiveMQConnectionFactory工厂,也可以再次使用用户名密码,建立连接,这里不贴代码了,网上一搜一大堆
/**直接引用 ActiveMQConnectionFactory工厂建立连接**/
@Autowired
private ActiveMQConnectionFactory activeMQConnectionFactory;
 
 public void receiveQueue(){
 		Connection connection = null;
        Session session = null;
        try {
            // 通过工厂创建一个连接
            connection = activeMQConnectionFactory.createConnection();
            // 启动连接
            connection.start();
            // 创建一个session会话
            session = connection.createSession(Boolean.TRUE, Session.CLIENT_ACKNOWLEDGE);
            // 创建一个消息队列(你自己的)
            Destination destination = session.createQueue(ActiceMqConstant.COMMODITY_ACTION_DATA_COLLECT);
            // 创建消费者
            MessageConsumer consumer = session.createConsumer(destination);
            
            //读取队列中的消息,直至结束
            while (true) {
            	//队列中的消息读完之后,break退出循环
                Message receive = consumer.receive();
                if (receive == null) {
                    break;
                }
                TextMessage textMessage = (TextMessage) receive;
                if (textMessage == null) {
                    break;
                }
                  
                String msg = textMessage.getText();
                JSONObject jsonObject = JSONObject.parseObject(msg);
		
                // 告诉MQ这调消息已经消费
                textMessage.acknowledge();
                //session回话提交通知  ps:session不存在事务统一提交,需要逐条进行提交,这里等下分析
                session.commit();
            }
        } catch (JMSException e) {
        	//消息重发
        	session.recover();
            e.printStackTrace();
        } finally {
            if (connection != null) {
                try {
                	//关闭连接,会话
                    connection.close();
                    session.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        }
 }      
  • activemq事务性分析
           在自己测验中发现,activemq的事务是针对单条消息而言,而不是一个队列中的所有消息。包括官网给出的调用session的commit提交事务,调用rollback进行事务回滚的方法。
           session.rollback()回滚,与session.recover()最终效果是一样的,都是让当前处理的这条消息回归队列,进行消息重发。

    话不多说上图:
    在处理到第四条消息时,这里手动抛出的Exception异常,捕捉后,进行进行了session.rollback()操作
    在这里插入图片描述
    这里打印输出了四个消息,然而队列中显示却只是消费了三个
    在这里插入图片描述
    在这里插入图片描述
    继续消费,发现第一个消费的消息,就是上图最后一个打印的消息,也就是说在第四个消息打印后,抛出了异常后,进行的回滚操作,将最后一条消息回滚会了队列中,等待重发
    在这里插入图片描述
    PS:
    以下是使用@JmsListener MQ监听的测试方法截图,同样,Session.rollback将当前条消息进行队列回滚,等待下次重发,并跳过当前消息,继续分发下一条消息。

    在这里插入图片描述

这里要说明的是session.rollback()与session.recover()达到的效果是一样的,而MQ的事务性呢,只是针对单条消息而言的,而不是整个队列的消息。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot与ActiveMQ的集成可以实现消息队列的功能。以下是实现步骤: 1. 配置ActiveMQ依赖:在项目的pom.xml文件中添加ActiveMQ的依赖。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> ``` 2. 配置ActiveMQ连接信息:在项目的application.properties(或application.yml)文件中配置ActiveMQ连接信息。 ```properties spring.activemq.broker-url=tcp://localhost:61616 spring.activemq.user=admin spring.activemq.password=admin ``` 3. 创建消息发送者:编写一个消息发送者类,使用JmsTemplate发送消息到ActiveMQ队列。 ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsTemplate; import org.springframework.stereotype.Component; @Component public class MessageSender { @Autowired private JmsTemplate jmsTemplate; public void sendMessage(String message) { jmsTemplate.convertAndSend("myQueue", message); } } ``` 4. 创建消息接收者:编写一个消息接收者类,使用@JmsListener注解监听ActiveMQ队列,并处理接收到的消息。 ```java import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; @Component public class MessageReceiver { @JmsListener(destination = "myQueue") public void receiveMessage(String message) { System.out.println("Received message: " + message); // 处理接收到的消息 } } ``` 5. 发送和接收消息:在需要发送消息的地方,通过调用消息发送者的sendMessage方法发送消息;在消息接收者类中,使用@JmsListener注解监听到消息后进行处理。 通过以上步骤,你就可以在Spring Boot应用中使用ActiveMQ实现消息队列的功能了。记得在启动应用之前,确保你已经启动了ActiveMQ服务器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值