Active MQ实战-与Spring集成使用
最近在项目中应用了ActiveMQ消息中间件,这里简单说一下应用背景和与Spring的集成。
背景:多个功能模块或者系统间需要进行消息传递时,短时间内推送的信息较多,且对目标模块或者系统处理消息时间要求不是很高的时候,可以考虑采用MQ消息中间件进行处理。而开源的ActiveMQ相比于IBMWebSphereMQ是足以胜任中小系统的解决方案。
下面介绍一下ActiveMQ5.6.0版本在Windows下的安装及如何与Spring集成使用。
Windows下的安装:
1、下载地址:http://archive.apache.org/dist/activemq/apache-activemq/5.6.0/apache-activemq-5.6.0-bin.zip
2、解压文件后运行:
E:\apache-activemq-5.6.0\bin\activemq.bat
注意需要设置java环境变量。
3、启动后打开:
http://localhost:8161/admin/
即可看到activemq管的理页面。
与Spring集成使用:
1、在apache-activemq-5.6.0文件夹中找到activemq-all-5.6.0.jar,然后导入到项目工程中。
2、添加activemq的配置文件messageQueue.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="connectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory"> <property name="connectionFactory"> <bean class="org.apache.activemq.ActiveMQConnectionFactory"> <!-- 测试 --> <property name="brokerURL" value="tcp://127.0.0.1:61616?wireFormat.maxInactivityDuration=0" /> </bean> </property> </bean> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory"> <ref bean="connectionFactory"/> </property> </bean> <bean id="logQueue" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg index="0"> <value>LogQueue</value> </constructor-arg> </bean> </beans>
3、消息生成类
import javax.jms.JMSException; import javax.jms.Message; import javax.jms.Session; import org.springframework.jms.core.MessageCreator; /** * 创建消息 */ public class LogMessageCreator implements MessageCreator { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Message createMessage(Session paramSession) throws JMSException { return paramSession.createTextMessage(message); } }
4、发送消息类
import javax.jms.Destination; import org.springframework.jms.core.JmsTemplate; import com.necares.eterm.util.CommonMethod; public class MessageSender { private JmsTemplate jmsTemplate; private Destination logQueue; public void sendLog(String logMsg) { LogMessageCreator myMessageCreator = new LogMessageCreator(); myMessageCreator.setMessage(logMsg); jmsTemplate.send(logQueue, myMessageCreator); } public JmsTemplate getJmsTemplate() { return jmsTemplate; } public Destination getLogQueue() { return logQueue; } public void setJmsTemplate(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } public void setLogQueue(Destination logQueue) { this.logQueue = logQueue; } }
5、接收消息类
import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.TextMessage; import org.springframework.jms.core.JmsTemplate; public class MessageLogReceiver implements Runnable{ private JmsTemplate jmsTemplate; private Destination logQueue; public void run() { try { receiveLogMessage(); } catch (Exception e) { e.printStackTrace(); System.out.println("IbeLog Start Fail"); } } public void receiveLogMessage() throws JMSException { TextMessage msg = null; boolean isContinue = true; while (isContinue) { try { msg = (TextMessage) jmsTemplate.receive(logQueue); System.out.println("Received Message:" + msg.getText()); //持久化到DB } catch (Exception e) { e.printStackTrace(); } } } public JmsTemplate getJmsTemplate() { return jmsTemplate; } public Destination getLogQueue() { return logQueue; } public void setJmsTemplate(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } public void setLogQueue(Destination logQueue) { this.logQueue = logQueue; } }
该例子是需要将系统生成的大量log信息存储到数据库中(代码中DB部分已被忽略掉),如果实时进行存储的话,会严重影响当前系统性能,所以就考虑到将log信息通过MQ进行信息推送,在另外单独的系统中进行处理。这样就不会影响到当前该系统的性能。