SpringMVC+ActiveMQ发送消息并接收返回值的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC+ActiveMQ发送消息并接收返回值的问题相关的知识,希望对你有一定的参考价值。

消息接收者在接收到消息后能不能有返回值?如果可以,那么发送者怎么接收这个返回值?能不能给个示例代码?比如这是我的接收消息的方法:
public void receiveMap(MapMessage message) throws JmsException, JMSException
能不能有返回值?如果可以,那么发送者:
myJmsTemplateReturn.send(new MessageCreator()
public Message createMessage(Session session) throws JMSException
TextMessage msg = session.createTextMessage();
// 设置消息内容
msg.setText("Hello World!");
return msg;

);
怎么接收返回值呢?

参考技术A 消息通讯是异步的,receiver 需要给sender发个确认收到的消息,没有同步返回的功能。
你可以新创建个ack queue 来给sener 消费。大体是这样,代码一大堆,自己搜。追问

您的意思是,接收者再给发送者发送一个message来当作返回值?其实我的业务是需要同步返回的……

本回答被提问者和网友采纳

Spring Boot的JMS发送和接收队列消息,基于ActiveMQ

消息队列ActiveMQ是JMS的一种实现,ActiveMQ可以单独作为一个消息队列组件即插即拔,即插即用,参考下面两篇文章:

分布式MQTT消息订阅-发布框架:高可用性ActiveMQ_Zhang Phil-CSDN博客_mqtt分布式架构分布式MQTT消息订阅-发布框架:高可用性ActiveMQActiveMQ是MQTT的一种实现。ActiveMQ基于JMS。ActiveMQ开发包下载地址:http://activemq.apache.org/download.htmlActiveMQ最适合做消息推送。国内很多厂商基于ActiveMQ改造出多种消息推送平台。下载完成ActiveMQ压缩包后解压,解压后直接在Java环境中运...https://zhangphil.blog.csdn.net/article/details/94759508

ActiveMQ安装配置和使用简例_Zhang Phil-CSDN博客本文作者:Zhang Phil原文链接:ActiveMQ安装配置和使用简例ActiveMQ是一套JMS(Java Message Service)开源消息服务实现的组件。以Windows操作系统为例,本文简述了ActiveMQ的安装配置和使用简例。消息服务是互联网应用的最基本功能,只要是互联网应用,就少不了消息通信。而ActiveMQ是一个相对比较成熟稳定的JMS消息服务组件,https://blog.csdn.net/zhangphil/article/details/48173665

以上是把ActiveMQ作为单独的组件(系统子模块)拆分出来加载使用。

在Spring boot里面,ActiveMQ作为JMS的实现,Spring boot内嵌、可直接使用。

定义一个POJO的消息类:

public class SimpleMsg 
    private String to;
    private String body;

    public SimpleMsg() 

    

    public SimpleMsg(String to, String body) 
        this.to = to;
        this.body = body;
    

    public String getTo() 
        return to;
    

    public void setTo(String to) 
        this.to = to;
    

    public String getBody() 
        return body;
    

    public void setBody(String body) 
        this.body = body;
    

    @Override
    public String toString() 
        return "SimpleMsg" +
                "to='" + to + '\\'' +
                ", body='" + body + '\\'' +
                '';
    

SimpleMsg将作为spring boot程序中消息的实体传输。

定义一个spring boot的消息接收器:

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
public class MsgReceiver 
    //destination的值和在application里面发送制定的目的地值需要相同才能收到
    //containerFactory的变量名对应在app里面定义的JmsListenerContainerFactory
    @JmsListener(destination = "@zhangphil", containerFactory = "myAppContainerFactory")
    public void receiveMessage(SimpleMsg msg) 
        System.out.println("收到消息->");
        System.out.println(msg);
        System.out.println("收到消息<-");
    


完成spring boot的应用application:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;

import javax.jms.ConnectionFactory;

import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.support.converter.MappingJackson2MessageConverter;
import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.jms.support.converter.MessageType;

@SpringBootApplication
@EnableJms
public class SpringJmsApplication 
    @Bean
    public JmsListenerContainerFactory<?> myAppContainerFactory(ConnectionFactory connectionFactory,
                                                             DefaultJmsListenerContainerFactoryConfigurer configurer) 
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        configurer.configure(factory, connectionFactory);
        return factory;
    

    @Bean
    public MessageConverter jmsMessageConverter() 
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setTargetType(MessageType.TEXT);
        converter.setTypeIdPropertyName("_type");
        return converter;
    

    public static void main(String[] args) 
        ConfigurableApplicationContext context = SpringApplication.run(SpringJmsApplication.class, args);

        JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);

        SimpleMsg msg = new SimpleMsg("zhangfly", "Hello,world!");
        System.out.println("发送消息:" + msg);
        jmsTemplate.convertAndSend("@zhangphil", msg);
        System.out.println("发送结束");
    

以上完成后,运行SpringJmsApplication,如果成功,控制台输出:

发送消息:SimpleMsgto='zhangfly', body='Hello,world!'
发送结束
收到消息->
SimpleMsgto='zhangfly', body='Hello,world!'
收到消息<-

以上是关于SpringMVC+ActiveMQ发送消息并接收返回值的问题的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMQ消息发送与接收

activeMQ

ActiveMQ的介绍及使用

Spring Boot的JMS发送和接收队列消息,基于ActiveMQ

学习ActiveMQ:点对点(队列)模式消息演示

ActiveMQ概述和安装