JMS+ActiveMq+Spring整合模拟处理新闻日志场景 新建项目jms_spring_produce模拟新闻项目,项目jms_spring_consumer模拟日志处理项目, 为了便捷,项目都是用maven结构搭建的。 下面会贴部分源码,完整的项目请下载  生产者和消费者之间的数据交互,采用了自定义的类。由于生产者和消费者位于两个独立 的项目中,所以这些日志对象(如截图上的LoginLogDto.java/NewsVisitLogDto.java)都必 须序列号,并且生产者和消费之间这些对象都必须一模一样。如果觉得麻烦,那可以通过 json来进行交互,或者将这些日志对象抽出来作为一个独立的jar项目,maven管理很方便的。  由于代码较多,又有配置之类的,这里就不一一全部贴出来了,就贴部分. LoginLogDto.java package com.fei.dto;
import java.io.Serializable;
import java.util.Date;
/**
* 模拟用户登录日志
* @author weijianfei
*
*/
public class LoginLogDto implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String userName;
private Date loginTime;
private String ip;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Date getLoginTime() {
return loginTime;
}
public void setLoginTime(Date loginTime) {
this.loginTime = loginTime;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
}
UserLoginLogProducer.java package com.fei.service.jmsproducer;
import java.util.List;
import javax.jms.Destination;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
import com.fei.dto.LoginLogDto;
@Service
public class UserLoginLogProducer {
private static Logger logger = LoggerFactory.getLogger(UserLoginLogProducer.class);
/**
* JMS模板
*/
@Autowired
private JmsTemplate jmsTemplate;
/**
* 用户行为队列
*/
@Autowired
@Qualifier("userLoginQueue")
private Destination userLoginQueue;
public void sendMessage(LoginLogDto loginLog) {
try{
jmsTemplate.convertAndSend(this.userLoginQueue, loginLog);
}catch(Exception e){
logger.error("发送用户登录记录消息出错:"+loginLog,e);
}
}
public void setJmsTemplate(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}
public void setNotifyQueue(Destination notifyQueue) {
this.userLoginQueue = notifyQueue;
}
}
LogSenderServiceImpl.java package com.fei.service.log;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;
import com.fei.dto.LoginLogDto;
import com.fei.dto.NewsVisitLogDto;
import com.fei.service.jmsproducer.NewsVisitLogProducer;
import com.fei.service.jmsproducer.UserLoginLogProducer;
@Service
public class LogSenderServiceImpl implements LogSenderService{
@Autowired
private UserLoginLogProducer userLoginLogProducer;
@Autowired
private NewsVisitLogProducer newsVisitLogProducer;
public void send(LoginLogDto loginLogDto) {
userLoginLogProducer.sendMessage(loginLogDto);
}
public void send(NewsVisitLogDto newsVisitLogDto) {
newsVisitLogProducer.sendMessage(newsVisitLogDto);
}
}
生产者项目中的测试例子 TestUserLoginLogProducer.java package com.fei.service.jmsproducer;
import java.util.Date;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.fei.dto.LoginLogDto;
import com.fei.dto.NewsVisitLogDto;
import com.fei.service.log.LogSenderService;
public class TestUserLoginLogProducer {
private ClassPathXmlApplicationContext context ;
@Before
public void before(){
context = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
context.start();
}
@After
public void after(){
context.stop();
}
@Test
public void testSendMessage(){
LoginLogDto u1 = new LoginLogDto();
u1.setUserName("tom06");
u1.setIp("192.168.6.95");
u1.setLoginTime(new Date());
LoginLogDto u2 = new LoginLogDto();
u2.setUserName("jack06");
u2.setIp("192.168.6.98");
u2.setLoginTime(new Date());
LogSenderService service = (LogSenderService)context.getBean("logSenderServiceImpl");
service.send(u1);
service.send(u2);
}
@Test
public void testSendMessage2(){
NewsVisitLogDto d1 = new NewsVisitLogDto();
d1.setIp("192.168.22.33");
d1.setNewsId("112244");
d1.setVisitDate(new Date());
LogSenderService service = (LogSenderService)context.getBean("logSenderServiceImpl");
service.send(d1);
}
}
执行testSendMessage(),这样就把数据发送到ActiveMq了。 再来看看消费者的监听类 UserLoginLogListener.java package com.fei.jmsconsumer;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.fei.dto.LoginLogDto;
@Service
public class UserLoginLogListener implements MessageListener{
private static Logger logger = LoggerFactory.getLogger(UserLoginLogListener.class);
public void onMessage(Message message) {
try {
ObjectMessage objectMessage = ((ObjectMessage) message);
LoginLogDto loginLogDto = (LoginLogDto)objectMessage.getObject();
//调用其它service进行数据处理,这里直接打印下
logger.info("用户登录:"+loginLogDto.getUserName() +" "+loginLogDto.getIp()+" "+loginLogDto.getLoginTime());
System.out.println("用户登录:"+loginLogDto.getUserName() +" "+loginLogDto.getIp()+" "+loginLogDto.getLoginTime());
} catch (Exception e) {
e.printStackTrace();
}
}
}
把jms_spring_consumer部署到tomcat,启动,就可以看到打印日志了  注意事项,必须要有日志配置,比如logback.xml,同时web.xml中必须配有listener <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.web.util.IntrospectorCleanupListener
</listener-class>
</listener>
</web-app>
这里再贴下jms_spring_produce中的jms_applicationContext.xml的配置 <?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:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<!-- 此处地址需要与启动的jms服务中的配置文件中activemq.xml中的 <transportConnector name="openwire"
uri="tcp://127.0.0.1:61616"中的端口指定一致/>配置 -->
<property name="brokerURL" value="tcp://127.0.0.1:61616" />
<!-- <property name="userName" value="system" /> <property name="password" value="manager"/> -->
<!-- 对PERSISTENT的消息进行同步发送(NON_PERSISTENT消息默认异步发送) -->
<property name="useAsyncSend" value="true" />
</bean>
<bean id="cachingConnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="connectionFactory" />
<property name="sessionCacheSize" value="10" />
</bean>
<!-- Spring JMS Template -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="cachingConnectionFactory" />
<property name="deliveryPersistent" value="false" />
<property name="priority" value="9" />
</bean>
<!-- 用户登录 -->
<bean id="userLoginQueue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="queue.user.login" />
</bean>
<!-- 新闻点击 -->
<bean id="newsVisitQueue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="queue.news.visit" />
</bean>
</beans>
消费者jms_spring_consumer中的jms_applicationContext.xml <?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:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<!-- 此处地址需要与启动的jms服务中的配置文件中activemq.xml中的 <transportConnector name="openwire"
uri="tcp://127.0.0.1:61616"中的端口指定一致/>配置 -->
<property name="brokerURL" value="tcp://127.0.0.1:61616" />
<!-- <property name="userName" value="system" /> <property name="password" value="manager"/> -->
<!-- 对PERSISTENT的消息进行同步发送(NON_PERSISTENT消息默认异步发送) -->
<property name="useAsyncSend" value="true" />
</bean>
<bean id="cachingConnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="connectionFactory" />
<property name="sessionCacheSize" value="10" />
</bean>
<!-- Spring JMS Template -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="cachingConnectionFactory" />
<property name="deliveryPersistent" value="false" />
<property name="priority" value="9" />
</bean>
<!-- 用户登录 -->
<bean id="userLoginQueue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="queue.user.login" />
</bean>
<bean id="userLoginQueueContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="cachingConnectionFactory" />
<property name="destination" ref="userLoginQueue" />
<property name="messageListener" ref="userLoginLogListener" />
<property name="concurrentConsumers" value="5" />
<property name="maxConcurrentConsumers" value="10" />
</bean>
<!-- 新闻点击 -->
<bean id="newsVisitQueue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="queue.news.visit" />
</bean>
<bean id="newsVisitQueueContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="cachingConnectionFactory" />
<property name="destination" ref="newsVisitQueue" />
<property name="messageListener" ref="newsVisitLogListener" />
<property name="concurrentConsumers" value="5" />
<property name="maxConcurrentConsumers" value="10" />
</bean>
</beans>
spring的配置,有很多参数,也有很多负责的功能,这里就不一一介绍了。 上面总共给出了4个项目jms_produce、jms_consumer、jms_spring_produce、jms_spring_consumer,这里打包上传了,大家可以下载看看 点我下载源码 |