java ActiveMQ sendwithReply模式(Queue)

匿名 (未验证) 提交于 2019-12-02 21:53:52

1.发送方代码

import com.tfinfo.cim.common.mapper.JsonMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.MessageCreator; import org.springframework.stereotype.Component; import javax.jms.*; import java.util.Map; import java.util.Map.Entry; import java.util.UUID;  /**  *   * @description 队列消息生产者,发送消息到队列  *   */ @Component("queueSender") public class QueueSender {      @Autowired    @Qualifier("jmsQTemplate_P")    private JmsTemplate jmsTemplate;      /**     * 发送一条Map消息到指定的队列(目标),参数为对象,转换为json格式字符串后发送     *      * @param queueName 队列名称     * @param map 消息内容,map中放入的是需要传递的对象     */    public void send(String queueName, final Map<String, Object> map) {       jmsTemplate.send(queueName, new MessageCreator() {          @Override          public Message createMessage(Session session) throws JMSException {             return getMessage(session, map);          }       });    }     /**     * 发送一条Map消息到指定的队列(目标),参数为对象,转换为json格式字符串后发送     *     * @param queueName 队列名称     * @param map 消息内容     */    public Message sendWithReply(String queueName, final Map<String, Object> map){       Message replyMsg = jmsTemplate.sendAndReceive(queueName, new MessageCreator() {          public Message createMessage(Session session) throws JMSException {             return getMessage(session, map);          }       });       return replyMsg;    }      private Message getMessage(Session session, Map<String, Object> map) throws JMSException {       MapMessage message = session.createMapMessage();       for (Entry<String, Object> entry: map.entrySet()) {          String paramkey = entry.getKey();          String paramValue = "";          if(entry.getValue() instanceof String){             paramValue = (String) entry.getValue();          }else{             paramValue = JsonMapper.toJsonString(entry.getValue());          }          message.setString(paramkey, paramValue);       }       return message;    }  }

2.消息回复方代码

public void replayMsg(Message message, Map mqMap) {     try {         Destination destination = message.getJMSReplyTo();         String queueName = "";         if (destination instanceof Queue) {             queueName = ((Queue) destination).getQueueName();         }         if(queueName!=null&&!"".equals(queueName)){             queueSender.send(queueName, mqMap);         }     } catch (JMSException ex) {         ex.printStackTrace();     } }

3.jmsQTemplate_P 在Spring中的注入

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"             xsi:schemaLocation="       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd"        default-lazy-init="true">      <!-- ActiveMQ 连接工厂 -->     <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供-->     <!-- 如果连接网络:tcp://ip:61616;未连接网络:tcp://localhost:61616 以及用户名,密码-->     <!--<amq:connectionFactory id="amqConnectionFactory"                            brokerURL="${brokerUrl}" userName="${mq.userName}" password="${mq.password}" redeliveryPolicy="activeMQPolicy" />-->     <bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">         <property name="brokerURL" value="${brokerUrl}"></property>         <property name="userName" value="${mq.userName}"></property>         <property name="password" value="${mq.password}"></property>     </bean>          <!-- Spring Caching连接工厂 -->     <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->     <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">         <!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->         <property name="targetConnectionFactory" ref="amqConnectionFactory"></property>         <!-- 同上,同理 -->         <!-- <constructor-arg ref="amqConnectionFactory" /> -->         <!-- Session缓存数量 -->         <property name="sessionCacheSize" value="100"/>      </bean>     <!-- 定义JmsTemplate的Queue类型  P: PERSISTENT (持久化消息) ;NP: NON_PERSISTENT(非持久化消息) 不做设置默认发送的是持久化消息 即deliveryMode:0-->     <bean id="jmsQTemplate_P" class="org.springframework.jms.core.JmsTemplate">         <constructor-arg ref="connectionFactory"/>         <property name="pubSubDomain" value="false"/>         <property name="receiveTimeout" value="30000"/>     </bean>  </beans>  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!