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>