Spring + ActiveMQ sendandrecive模式(Queue)

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>  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值