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进行信息推送,在另外单独的系统中进行处理。这样就不会影响到当前该系统的性能。

相关推荐