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>