Java消息服务(java Message Sevice,JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间或分布式系统中发送消息,进行异步通信。Java消息服务时一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
java消息服务的规范包括两种消息模式,点对点和发布者/订阅者。许多提供商支持这一通用框架。因此,程序员可以在他们的分布式软件中实现面向消息的操作,这些操作将具有不同面向消息中间件产品的可移植性。
Java消息服务支持同步和异步的消息处理,事件驱动的程序设计现在被广泛认为是一种富有成效的程序设计范例,程序员们都相当熟悉。
在应用系统开发时,Java消息服务可以推迟选择面对消息中间件产品,也可以在不同的面对消息中间件切换。
我们会以Java消息服务的开源实现产品ActiveMQ为例来进行Spirng整合消息服务功能的实现分析。
1.Spring整合ActiveMQ
(1)Spirng配置文件。
配置文件是Spirng的核心,Spirng整合消息服务的使用也从配置文件配置开始。类似于数据库操作,Spring也将ActiveMQ的操作统一封装至JmsTemplate中,以方便我们统一使用。所以在Spring的核心配置文件中首先要注册JsmTemplate类型的bean。当然ActiveMQConnectionFactory用于连接消息服务器,是消息服务器的基础,也要注册。ActiveMQQueue则用于指定消息的目的地。在这里要引入相应的jar包
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL">
<value>tcp://localhost:61616</value>
</property>
</bean>
<bean id="jmsTemplate" class="org.apache.active">
</bean>
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0">
<value>HelloWorldQueue</value>
</constructor-arg>
</bean>
<baen id="myTextListener" class="test.activeMQ.Spring.myMessageListener"/>
<bean id="javaConsumer"
class="org.Springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="destination"/>
<property name="messageListener" ref="myTextListener"/>
</bean>
</beans>
(2)发送端
有了以上配置,Spring就可以根据配置信息简化我们的工作量。Spirng中使用发送消息到消息服务器,省去了省去了冗余的Connection以及Session等的创建于销毁过程,简化了工作量。
public class HelloWorldSender {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
JmsTemplate jmsTemplate = (JmsTemplate)context.getBean("jmsTemplate");
Destination destination = (Destination)context.getBean("destination");\
jmsTemplate.send(destination,new MessageCreator()){
public Message createMessage(Session session) throws JMSException{
return session.createTextMessage("ceshi");
}
}
}
}
(3)接受端
接收端使用了消息监听器,一旦有消息Spring会将消息引导至消息监听器以方便用户记性相应的额逻辑处理
public class MyMessageListener implements MessageListener {
public void onMessage(Message message) {
TextMessage msg = (TextMessage)message;
try {
System.out.println(msg.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在这里源码不做过多分析了,有兴趣的同学可以进去看下,在DefaultMessageLIstenerContainer类中,实现了innitializingBean接口,在其afterPropertiesSet()方法中,进行了轮询,为了减小因为一直轮询造成cpu的性能开销, 里面有个线程做了处理,根据isRunning状态,和lifecycleMonitor全局变量的lifecycleMonitor。wait进行了处理。由于DefaultMessageLIstenerContainer监听器,放在了dispatcherSevlet的初始化中,当有消息发送过来时,会通过dispatcherServlet选择合适的调度器,然后调用lifecycleMonitor.notifyAll()方法,激活了消息处理。结论为查看源码与文献后的个人总结,如有不当,或者异议请留言一起探讨。