<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"
default-autowire="byName">
(1) <!-- spring jms 配置 -->
<!-- 第一步配置jmsFactory -->
<bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616"></property>
<property name="useAsyncSend" value="true"></property>
</bean>
<!-- 第二步,配置jms模板 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<constructor-arg index="0">
<ref local="jmsFactory" />
</constructor-arg>
</bean>
<!-- 开始配置消息 -->
<!-- 第三部开始配置消息目的地,采用queue类型的消息 -->
<bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
<property name="physicalName" value="queueDestination"></property>
</bean>
<bean id="jmsListener" class="com.jms.listener"></bean>
<!-- 配置消息的监听 -->
<bean id="defaultMessageListener" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="jmsFactory"></property>
<property name="destination" ref="queueDestination"></property>
<property name="messageListener" ref="jmsListener"></property>
<property name="messageSelector" value="isAdmin=true"></property>
</bean>
</beans>
(2) 发送消息,发送一个自定义的对象
package com.jms.test;
import java.util.Date;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import org.apache.activemq.command.ActiveMQQueue;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import com.jms.util.DateUtil;
import com.jms.vo.BasicMessage;
import com.jms.vo.MessageType;
public class SendMessageTest {
private static String [] locations = new String[]{"classpath:applicationJMS.xml"};
static JmsTemplate jmsTemplate ;
static ActiveMQQueue messageQueue ;
static{
ApplicationContext context = new ClassPathXmlApplicationContext(locations);
jmsTemplate = (JmsTemplate) context.getBean("jmsTemplate");
messageQueue = (ActiveMQQueue) context.getBean("messageQueue");
System.out.println(messageQueue);
}
@Test
public void sendMessage(){
jmsTemplate.send(messageQueue,new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
BasicMessage basicMessage = new BasicMessage();
basicMessage.setMessageId(1001);
basicMessage.setMessageType(MessageType.PRICE_UPDATE);
basicMessage.setMessageDes("新品匹配");
basicMessage.setMessageSendTime(DateUtil.getDateString(new Date()));
ObjectMessage objMessage = session.createObjectMessage();
objMessage.setObject(basicMessage);
return objMessage;
}
});
}
(3) 消息的监听
package com.jms.listener;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import com.jms.vo.BasicMessage;
import com.jms.vo.MessageType;
public class MessageListener implements javax.jms.MessageListener {
static private String lastSendTime = "";
static private MessageType lastMessageType = null ;
public void onMessage(Message message) {
try {
System.out.println("接收到JMS消息.");
ObjectMessage objMessage = (ObjectMessage) message ;
BasicMessage basicMessage = (BasicMessage) objMessage.getObject();
String sendTime = basicMessage.getMessageSendTime();
MessageType messageType = basicMessage.getMessageType();
if (!"".equals(lastSendTime)) {
double differentTime = compareTime(sendTime, lastSendTime);
if (lastMessageType == basicMessage.getMessageType()
&& differentTime <= 30) {
System.out.println("相同的消息正在处理,此消息将丢弃..");
System.out.println("相差时间:" + differentTime);
} else {
lastSendTime = sendTime;
lastMessageType = messageType;
operateMessage(basicMessage);
}
} else {
lastSendTime = sendTime;
lastMessageType = messageType;
operateMessage(basicMessage);
}
} catch (JMSException e) {
e.printStackTrace();
}
}
public void operateMessage(BasicMessage basicMessage) {
if (basicMessage.getMessageType() == MessageType.NEW_PRODUCT) {
System.out.println("收到新品消息..");
} else if (basicMessage.getMessageType() == MessageType.PRICE_UPDATE) {
System.out.println("收到价格更新消息.");
} else {
System.out.println("收到无用消息");
}
}
/*
* 计算2个时间相差多少分钟
*/
public double compareTime(String sendTime, String lastSendTime) {
double time3 = 0;
try {
DateFormat simpleDateFormate = new SimpleDateFormat(
"yyyy-MM-dd hh:mm:ss");
long time1 = simpleDateFormate.parse(sendTime).getTime();
long time2 = simpleDateFormate.parse(lastSendTime).getTime();
time3 = ((double)(time1 - time2)) / (1000 * 60);
System.out.println(time1+":"+time2+":"+(time1-time2)/60);
} catch (ParseException e) {
e.printStackTrace();
}
return time3;
}