spring+mq实现异步处理

最近研究了一下spring/spring boot与activeMq的整合,花费了很多时间,也遇到了很多坑,工作之余,总结一下。
业务逻辑是这样的,前台发起请求(步骤A),后台接收到请求并执行业务逻辑(步骤B),处理完之后返回应答(步骤C),但是步骤B运行十分缓慢,动辄好几分钟,往往导致超时,前台不仅得不到应答,而且JS报错。假如我现在不再关心步骤B的运行结果,步骤A之后立即进行步骤C,让运行缓慢的步骤B异步执行,成功或者失败都不管他,这种情况就可以交给MQ来处理。

本文章不再介绍springMVC的搭建与activeMq的安装,有需要的读者可以自行学习。

假设生产和消费都在同一个project中
下面直接发布springMVC+Mq代码:
1、引入mq相关依赖(pom.xml)



   org.apache.activemq
   activemq-spring
   5.14.5

2、编写mq资源文件mq-config.properties并引入
mq-config.properties

spring.activemq.broker-url=tcp://127.0.0.1:61616
spring.activemq.user=admin
spring.activemq.password=admin
# 支持所有的包,详见http://activemq.apache.org/objectmessage.html
# spring.activemq.packages.trust-all=true

springmvc.xml



3、编写mq配置文件(spring-mq.xml)并引入
spring-mq.xml




    
    

    
    
        
        
        
    

    
    
        
    

    
    
        
        
    

    
    
    
        
        
        
    

springmvc.xml



4、发送消息到消息队列
发送的消息大致可以分为TextMessage、MapMessage、ObjectMessage、BytesMessage、和StreamMessage,用的较多的应该是前3类,可以理解为文本、Map、对象。下面以文本为例:
HelloController.java

@Resource(name="jmsTemplate")
private JmsTemplate jmsTemplate;

@Resource(name = "registerQueue")
private Queue registerQueue;

public void execute_String() {
    String s = "hi,mq!";
    jmsTemplate.convertAndSend(registerQueue, s);
}

5、接收消息
RegisterListener.java

public class RegisterListener implements MessageListener{
    public void onMessage(Message message) {

        try {
            // 接收String
            if (message instanceof TextMessage) {
               	TextMessage tm = (TextMessage) message;
                	String result = tm.getText();
                	System.out.println(result);
            	}
		 } catch (JMSException e) {
            e.printStackTrace();
       	 }
    }
}

对于Map或者对象类型的传输,读者可以自行搜索或者探索一下,也可以参照下面大神的博客:
https://www.cnblogs.com/dennisit/p/4551795.html

你可能感兴趣的:(spring)