Spring xml方式接入MQ方式

一、导包

 <!-- activemq所需要的jar包 -->
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>5.15.9</version>
        </dependency>
        <!-- activeMQ对JMS的支持,整合Spring和ActiveMQ -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-pool</artifactId>
            <version>5.15.9</version>
        </dependency>

二、xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:amq="http://activemq.apache.org/schema/core"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
	<!--消息中间件 -->
    <amq:broker useJmx="true" persistent="true" >
    	<amq:managementContext>
    	    <amq:managementContext createConnector="false"/>
    	</amq:managementContext>
    	<amq:persistenceAdapter>
    		<amq:kahaDB directory="${jmsDir}" >
            </amq:kahaDB>
        </amq:persistenceAdapter>
         <amq:transportConnectors>
			<amq:transportConnector uri="tcp://${jms.ip}:${jms.port}" />
		</amq:transportConnectors>
    </amq:broker>
    
	<!--activeMq连接工厂 -->
  	<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
		<property name="brokerURL" value="vm://${jms.ip}?jms.useAsyncSend=true" />
	</bean>
	
	<!-- spring连接工厂 -->
  	<bean id="simpleJmsConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
	  	<constructor-arg ref="amqConnectionFactory"/>
		<property name="sessionCacheSize" value="100" />
		<property name="cacheConsumers" value="true"></property>
		<property name="exceptionListener" ref="jmsExceptionListener"/>
	</bean>
	<!-- 监听器 -->
  	<bean id="jmsExceptionListener" class="com.hotent.core.jms.JmsExceptionListener"></bean>
  	<!-- 消息转换器 -->
    <bean id="activeMqMessageConverter" class="com.hotent.core.jms.ActiveMqMessageConverter"/>
    <!-- jms 操作核心封装类 -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="simpleJmsConnectionFactory" />
        <property name="defaultDestinationName" value="messageQueue"/>
    </bean>
    <!-- 消息队列 -->
    <amq:queue id="messageQueue" name="messageQueue" physicalName="messageQueue" />
    <!-- hotent消息生产者 -->
    <bean id="messageProducer" class="com.hotent.core.jms.MessageProducer"/>
    <!-- hotent消息消费者 -->
    <bean name="messageConsumer" class="com.hotent.core.jms.MessageConsumer">
		<property name="handlers">
			<map>
				<entry  key="com.hotent.platform.service.jms.MessageModel">
					<bean class="com.hotent.platform.service.jms.impl.MessageHandler"></bean>
				</entry>
			</map>
		</property>  
    </bean>
    <!-- 消息处理器 -->
   <bean id="smsMessageHandler"   class="com.hotent.platform.service.jms.impl.SmsMessageHandler"></bean>
   <bean id="mailMessageHandler"   class="com.hotent.platform.service.jms.impl.MailMessageHandler"></bean>
   <bean id="innerMessageHandler"   class="com.hotent.platform.service.jms.impl.InnerMessageHandler"></bean>
   <bean id="xmlMessageHandler"   class="com.hotent.platform.service.jms.impl.XmlMessageHandler"></bean>
   <!-- 消息处理容器 -->
   <bean id="messageHandlerContainer " class="com.hotent.platform.service.jms.MessageHandlerContainer"> 
		<property name="handlersMap" ref="handlersMap"/> 
    </bean>
	<bean id="handlersMap" class="java.util.LinkedHashMap"> 
		 <constructor-arg> 
		 	<map> 
				<entry key="1" value-ref="mailMessageHandler" /> 
				<entry key="2" value-ref="smsMessageHandler" /> 
				<entry key="3" value-ref="innerMessageHandler" /> 
				<entry key="4" value-ref="xmlMessageHandler" /> 
			</map> 
		 </constructor-arg> 
	</bean> 
  	<!-- 消息监听处理容器 -->
	<bean id="messageListenerContainer"
		class="org.springframework.jms.listener.DefaultMessageListenerContainer">
		<property name="connectionFactory" ref="simpleJmsConnectionFactory" />
		<property name="destination" ref="messageQueue" />
		<property name="messageListener" ref="messageMsgListener" />
	</bean>
	<!-- 消息监听处理器 -->
	<bean id="messageMsgListener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
		<constructor-arg>
			<ref bean="messageConsumer"/>		
		</constructor-arg>
		<property name="messageConverter" ref="activeMqMessageConverter" />
		<property name="defaultListenerMethod" value="sendMessage" />
	</bean>
</beans>	

三、消费者

import javax.annotation.Resource;
import javax.jms.Queue;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.jms.core.JmsTemplate;

/**
 * 用于发送jms消息。
 * <br/>
 * 发送邮件,短信,内部消息。
 * 
 * @author pkq
 *
 */
public class MessageProducer
{
    private static final Log logger=LogFactory.getLog(MessageProducer.class);	
	@Resource(name="messageQueue")
	private Queue messageQueue;
	
	@Resource
	private JmsTemplate jmsTemplate;
	
	public void send(Object model)
	{
		logger.debug("procduce the message");
		//产生邮件\短信\消息发送的消息,加到消息队列中去
				
		jmsTemplate.convertAndSend(messageQueue, model);
	}
}

四、生产者

package com.hotent.core.jms;

import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.hotent.core.util.BeanUtils;
import com.hotent.platform.service.jms.IJmsHandler;

/**
 * 从消息队列中读取对象,并且进行消息发送。
 * 
 * @author zxh
 * 
 */
public class MessageConsumer {

	/**
	 * 处理消息
	 */
	private Map<String, IJmsHandler> handlers = new HashMap<String, IJmsHandler>();

	protected Logger logger = LoggerFactory.getLogger(MessageConsumer.class);
	public void setHandlers(Map<String, IJmsHandler> handlers) {
		this.handlers = handlers;
	}

	/**
	 * 发送消息
	 * 
	 * @param model
	 *            发送的对象
	 * @throws Exception
	 */
	public void sendMessage(Object model) throws Exception {
		if (BeanUtils.isNotEmpty(handlers) && BeanUtils.isNotEmpty(model)) {
			IJmsHandler jmsHandler = handlers.get(model.getClass().getName());
			if(jmsHandler!=null){
				jmsHandler.handMessage(model);
			}
			else{
				logger.info(model.toString());
			}
		} else {
			throw new Exception("Object:[" + model + "] is not  entity Object ");
		}
	}
}

五、消息处理器

package com.hotent.platform.service.jms.impl;


import com.hotent.platform.service.jms.IMessageHandler;
import com.hotent.platform.service.jms.MessageModel;

public class XmlMessageHandler implements IMessageHandler {
	private final Log logger = LogFactory.getLog(XmlMessageHandler.class);
	
	@Override
	public String getTitle() {
		return "文本";
	}

	@Override
	public boolean getIsDefaultChecked() {
		return false;
	}

	@Override
	public void handMessage(MessageModel model) {
		//消息处理
	}

}

六、消息转换器

package com.hotent.core.jms;

import java.io.Serializable;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.Session;

import org.springframework.jms.support.converter.MessageConverter;

/**
 * 消息转换器。 <br>
 * 
 * <pre>
 * 	1.转换发送消息。
 * 	2.转换接收消息。
 * </pre>
 * 
 * csx
 */
public class ActiveMqMessageConverter implements MessageConverter {

	/**
	 * 转换发送消息。
	 */
	@Override
	public Message toMessage(Object object, Session session)
			throws JMSException {
		if (object != null && object.getClass() != null) {
			ObjectMessage objMsg = session.createObjectMessage();
			objMsg.setObject((Serializable) object);
			return objMsg;
		} else {
			throw new JMSException("Object:[" + object
					+ "] is not legal message");
		}
	}

	/**
	 * 转换接收消息。
	 */
	@Override
	public Object fromMessage(Message msg) throws JMSException {
		if (msg instanceof ObjectMessage) {
			ObjectMessage objMsg = (ObjectMessage) msg;
			Object object = objMsg.getObject();
			if (object != null && object.getClass() != null) {
				return object;
			} else {
				throw new JMSException("Object:[" + msg
						+ "] is not legal message");
			}
		} else {
			throw new JMSException("Msg:[" + msg + "] is not ObjectMessage");
		}
	}

}

七、监听器

package com.hotent.core.jms;

import javax.jms.ExceptionListener;
import javax.jms.JMSException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.hotent.core.util.ExceptionUtil;

/**
 * JMS发送错误时监控。
 * <pre>
 *  配置在app-jms.xml中。
 *  &lt;bean id="jmsExceptionListener" class="com.hotent.core.jms.JmsExceptionListener">&lt;/bean>
 *  </pre>
 * @author ray
 *
 */
public class JmsExceptionListener implements ExceptionListener {
	protected Logger logger = LoggerFactory.getLogger(JmsExceptionListener.class);

	@Override
	public void onException(JMSException ex) {
		ex.printStackTrace();
		String message= ExceptionUtil.getExceptionMessage(ex);
		logger.error(message);
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值