一、导包
<!-- 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中。
* <bean id="jmsExceptionListener" class="com.hotent.core.jms.JmsExceptionListener"></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);
}
}