Spring jms+activemq基于配置实现
主要做了传递参数的转换
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="test"></context:component-scan>
<bean id="connectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"
destroy-method="stop">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://127.0.0.1:61616" />
</bean>
</property>
<property name="maxConnections" value="20"></property>
</bean>
<bean id="destinationOne" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="testOne" />
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"></property>
<property name="defaultDestination" ref="destinationOne"></property>
<property name="receiveTimeout" value="6000"></property>
</bean>
<bean id="receiverOne" class="test.ReceiverOne"></bean>
<bean id="consumerMessageListenerOfOne" class="test.ReceiverOne" />
<bean id="jmsContainerOne"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="testDest" />
<property name="messageListener" ref="consumerMessageListenerOfOne" />
</bean>
<bean id="testDest" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="noticeQueue1" />
</bean>
<bean id="jmsSender" class="test.JMSMessageSender">
<property name="jmsTemplate" ref="jmsTemplate" />
<property name="destination" ref="testDest" />
</bean>
<bean id="senderOne" class="test.Sender">
<property name="jMSMessageSender" ref="jmsSender"/>
</bean>
</beans>
主要配置有ActiveMQConnectionFactory -url,jmsTemplate,destination(queueName),DefaultMessageListenerContainer(配置监听的queue)
Test类
package test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class JMSActiveMQTest {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("classpath:*/mqtest.xml");
Sender sender=(Sender)context.getBean("senderOne");
sender.sendInfo("1", "aaa");
}
}
消息发送者类
package test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Sender {
public JMSMessageSender jMSMessageSender;
public void setSender(JMSMessageSender jMSMessageSender) {
this.jMSMessageSender = jMSMessageSender;
}
public JMSMessageSender getjMSMessageSender() {
return jMSMessageSender;
}
public void setjMSMessageSender(JMSMessageSender jMSMessageSender) {
this.jMSMessageSender = jMSMessageSender;
}
public void sendInfo(final String messageRecord, final String flag) {
Map<String, Object> map = new HashMap<String, Object>();
List<Integer> loanIds = new ArrayList<Integer>();
loanIds.add(2509417);
loanIds.add(2697802);
loanIds.add(2082935);
loanIds.add(2697804);
loanIds.add(2910408);
map.put("eventType", "modifyTable");
map.put("loanIds", loanIds);
map.put("originalPrepareForPlanState", 5);
map.put("newPrepareForPlanStatus", 1);
jMSMessageSender.send(map);
}
}
Sender中用到的通用JMSMessageSender类
package test;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;
@Component
public class JMSMessageSender{
JmsTemplate jmsTemplate;
Destination destination;
/**
* 发送消息对象到指定的队列
* @param destinationName
* @param param
*/
public void send(final String destinationName, final Map<String, Object> param) {
jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);
jmsTemplate.send(destinationName, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
MapMessage mapMessage = session.createMapMessage();
Set<String> set = param.keySet();
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
mapMessage.setObject(key, param.get(key));
}
return mapMessage;
}
});
}
/**
* 发送消息对象到默认队列
* @param param
*/
public void send(final Map<String, Object> param) {
jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);
jmsTemplate.send(this.destination, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
MapMessage mapMessage = session.createMapMessage();
Set<String> set = param.keySet();
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
mapMessage.setObject(key, param.get(key));
}
return mapMessage;
}
});
}
public void setJmsTemplate(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}
public void setDestination(Destination destination) {
this.destination = destination;
}
public JmsTemplate getJmsTemplate() {
return jmsTemplate;
}
public Destination getDestination() {
return destination;
}
/**
* 将一个 JavaBean 对象转化为一个 Map
*
* @param bean
* 要转化的JavaBean 对象
* @return 转化出来的 Map 对象
* @throws IntrospectionException
* 如果分析类属性失败
* @throws IllegalAccessException
* 如果实例化 JavaBean 失败
* @throws InvocationTargetException
* 如果调用属性的 setter 方法失败
*/
public Map<String, Object> convertBean(Object bean)
throws IntrospectionException, IllegalAccessException,
InvocationTargetException {
Class<? extends Object> type = bean.getClass();
Map<String, Object> returnMap = new HashMap<String, Object>();
BeanInfo beanInfo = Introspector.getBeanInfo(type);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (int i = 0; i < propertyDescriptors.length; i++) {
PropertyDescriptor descriptor = propertyDescriptors[i];
String propertyName = descriptor.getName();
if (!propertyName.equals("class")) {
Method readMethod = descriptor.getReadMethod();
if(readMethod == null) {
System.out.println("属性无法读取。propertyName = " + propertyName);
continue;
}
Object result = readMethod.invoke(bean, new Object[0]);
if (result != null) {
if (result instanceof Integer || result instanceof Short
|| result instanceof Double
|| result instanceof String
|| result instanceof Float
|| result instanceof Byte
|| result instanceof Byte[]
|| result instanceof Character
|| result instanceof Boolean) {
returnMap.put(propertyName, result);
} else if (result instanceof Date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");// 格式化对象
returnMap.put(propertyName, sdf.format(result));
} else if (result instanceof BigDecimal) {
returnMap.put(propertyName, result.toString());
}
} else {
returnMap.put(propertyName, "");
}
}
}
return returnMap;
}
/**
* 发送消息对象(TextMessage)
*
* @param jsonString 对象
* @param eventType 事件类型
*/
public void sendTextMessage(final String jsonString, final String eventType) {
jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);
jmsTemplate.send(this.destination, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
TextMessage textMessage = session.createTextMessage();
textMessage.setJMSType(eventType);
textMessage.setText(jsonString);
return textMessage;
}
});
}
/**
* 发送消息对象到指定队列
*
* @param jsonString 对象
* @param eventType 事件类型
*/
public void sendTextMessage(final String destinationName,final String jsonString, final String eventType) {
jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);
jmsTemplate.send(destinationName, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
TextMessage textMessage = session.createTextMessage();
textMessage.setJMSType(eventType);
textMessage.setText(jsonString);
return textMessage;
}
});
}
}
服务类
package test;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.fuscent.loanorg.rmiservice.common.superpackage.BaseService;
@Service
public class ModifyTableImpl extends BaseService
implements IModifyTable{
private static Log logger = LogFactory.getLog(ModifyTableImpl.class);
@Override
@Transactional
public void modifyTableByLoanIds(List<Integer> loanIds, int originalState, int newStatus) {
logger.info(“test step1”);
logger.info(“test step2”);
logger.info(“test step3”);
logger.info(“test step4”);
}
}
服务类接口
package test;
import java.util.List;
public interface IModifyTable {
public void modifyTableByLoanIds (List<Integer> loanIds,int originalPrepareForPlanState,int newPrepareForPlanStatus);
}
消息接收者监听类
package test;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import com.fuscent.loanorg.jms.constant.JMSConstant;
public class ReceiverOne implements MessageListener{
private static Log logger = LogFactory.getLog(ReceiverOne.class);
private static Integer CORE_THREAD_NUM = 99;
private ExecutorService threadPool = Executors.newFixedThreadPool(CORE_THREAD_NUM);
@Autowired
private JMSEventHandler handler;
public void onMessage(Message msg) {
if (msg instanceof MapMessage) {
final MapMessage mapMsg = (MapMessage) msg;
threadPool.execute(new Runnable() {
@Override
public void run() {
try {
// 事件类型判断 "eventType"
String eventType = mapMsg.getString(JMSConstant.EVENT_TYPE);
logger.info("事件类型为:" + eventType);
// JMSMap转成普通Map来处理
Map<String, Object> mapData = getMap(mapMsg);
if("modifyTable".equals(eventType)){
handler.handleModify5Table(mapData);
}
} catch (Exception e) {
logger.error("消息处理失败!Message = " + mapMsg , e);
}
}
});
}else if(msg instanceof TextMessage){
final TextMessage textMsg = (TextMessage) msg;
threadPool.execute(new Runnable() {
@Override
public void run() {
try {
textMsg.getText();
// 事件类型判断 "eventType"
String eventType = textMsg.getJMSType();
if(StringUtils.isBlank(eventType)){
return;
}
String data = textMsg.getText();
logger.info("事件类型为:" + eventType);
} catch (Exception e) {
logger.error("消息处理失败!Message = " + textMsg , e);
}
}
});
}
}
/**
* 根据mapMessage生成新的Map对象
* @param mapMessage jms消息
* @return Map
*/
@SuppressWarnings("unchecked")
public Map<String, Object> getMap(MapMessage mapMessage) {
Map<String, Object> map = new HashMap<String, Object>();
try {
Enumeration<String> enumeration = mapMessage.getMapNames();
while (enumeration.hasMoreElements()) {
String key = (String) enumeration.nextElement();
Object value = mapMessage.getObject(key);
map.put(key, value);
}
} catch (JMSException e) {
e.printStackTrace();
}
return map;
}
public void setHandler(JMSEventHandler handler) {
this.handler = handler;
}
}
监听事件处理类handler
package test;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSONArray;
@Component
public class JMSEventHandler {
@Autowired
private IModifyTable service;
private static Log logger = LogFactory.getLog(JMSEventHandler.class);
public void handleModify5Table(Map<String,Object> mapData) throws Exception{
List<Integer> loanIds=(List<Integer>)mapData.get("loanIds");
int originalPrepareForPlanState=(Integer)mapData.get("originalPrepareForPlanState");
int newPrepareForPlanStatus=(Integer)mapData.get("newPrepareForPlanStatus");
service.modifyTableByLoanIds(loanIds, originalPrepareForPlanState, newPrepareForPlanStatus);
}
}
基于注解