Spring jms+activemq基于配置实现

 

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() {

                    

                     @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;

                     }

              });

       }

      

       /**

        * 发送消息对象到默认队列

        * @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);

       }

}

基于注解

 

 

转载于:https://my.oschina.net/iioschina/blog/1499369

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值