- 浏览: 820265 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (363)
- 2010年3月 (3)
- 2010年4月 (3)
- Java (116)
- ExtJs (22)
- EJB3.0 (11)
- JQuery (28)
- SqlServer (5)
- Oracle (17)
- hibernate (21)
- struts2 (14)
- php (10)
- JavaScript (11)
- jbpm (6)
- spring (24)
- lucene (2)
- ibatis (7)
- C# (8)
- mysql (11)
- json (3)
- webservice (3)
- 设计模式 (1)
- jdbc (1)
- servlet (2)
- ice (6)
- 日常软件问题 (2)
- 生活 (2)
- iphone (1)
- rest (3)
- ruby (2)
- linux (13)
- quartz (1)
- poi (1)
- redis (13)
- memcached (4)
- nosql (2)
- tomcat调优 (1)
- 项目管理 (0)
最新评论
-
天使建站:
jquery里和数组相关的操作 附带具体的实例 ...
jquery对象数组 -
Cy0941:
$('#formId').form('submit',...) ...
easyui的form表单提交处理 -
shmily2038:
swifth 写道楼主,,你的命令写错啦,,[root@ser ...
centos直接yum安装nginx -
swifth:
楼主,,你的命令写错啦,,[root@server ~]# y ...
centos直接yum安装nginx -
随遇而安DXX:
...
REST
1. 概述:Spring提供了一个用于简化JMS API使用的抽象框架,并且对用户屏蔽了JMS API中1.0.2和1.1版本的差异。
JMS的功能大致上分为两块,叫做消息制造和消息消耗。JmsTemplate 用于制造消息和同步消息接收。我们今天就用JmsTemplate实现同步的消息接受。
使用JMS发(接)消息的步骤:
1)创建连接工厂
2)使用连接工厂创建连接
3)使用连接创建会话
4)获取一个目的地
5)使用会话和目的地创建消息生产者(消息消费者)
6)使用连接创建一个需要发送的消息类型实例
7)使用连接的一个队列发送器或主题公布器,使用发送器或者主题器发送消息(接受消息)
spring中的JmsTemplate实现了对jms的一些封装,内部提供了很多的方法,我们只需要实现定义的回调接口即可。JmsTemplate继承自JmsAccessor,在JmsAccessor中有ConnectionFactory的定义,而JmsTemplate本身的构造方法也有对ConnectionFactory的封装:
Java代码
public JmsTemplate(ConnectionFactory connectionFactory) {
this();
setConnectionFactory(connectionFactory);
afterPropertiesSet();
}
所以,我们有两种方式注入ConnectionFactory,本文我们采用构造方法的方式。
spring_jms.xml
Java代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 这里我们用构造方法注入 connectionFactory-->
<bean id = "jmsTemplate" class = "org.springframework.jms.core.JmsTemplate">
<constructor-arg ref="connectionFactory"></constructor-arg>
</bean>
<!-- 使用activemq中的连接工厂,提供一个brokerUrl,这里表示本地 -->
<bean id = "connectionFactory" class = "org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="vm://localhost" />
</bean>
<!-- 使用activemq中的点对点消息模型,随意指定一个地址 -->
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="test/queue"/>
</bean>
</beans>
MessageCreator 回调接口通过JmsTemplate中调用代码提供的Session来创建一条消息。
看一下MessageCreator接口:
Java代码
public interface MessageCreator {
Message createMessage(Session session) throws JMSException;
}
那么,我们来实现发送和接受消息DummyJms类
Java代码
public class DummyJms {
public static void main(String[] args) throws Exception{
ApplicationContext context = new ClassPathXmlApplicationContext("spring.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("send message ");
}
});
TextMessage msg = (TextMessage)jmsTemplate.receive(destination);
System.out.println("receive message = " + msg.getText());
}
}
输出结果:
receive message = send message
可是我们并没有看到的像前文描述的那那些创建消息生产者,消息消费者的一些东西。继续分析,我们可以看一下,
jmsTemplate.send(Destination destination,MessageCreator messageCreator)这里到底做了什么,可以让我们不费吹灰之力,就可以实现消息的发送。JmsTemplate源代码:
Java代码
public void send(final Destination destination, final MessageCreator messageCreator) throws JmsException {
execute(new SessionCallback<Object>() {
public Object doInJms(Session session) throws JMSException {
doSend(session, destination, messageCreator);
return null;
}
}, false);
}
JmsTemplate实现了JmsOperations接口,在JmsOperations里有
Java代码
<T> T execute(SessionCallback<T> action) throws JmsException;
的定义。
那么这个SessionCallback接口是什么呢?它也为用户提供了JMS session。
Java代码
public interface SessionCallback<T> {
T doInJms(Session session) throws JMSException;
}
继续往下看。doSend方法:
Java代码
protected void doSend(Session session, Destination destination, MessageCreator messageCreator)
throws JMSException {
Assert.notNull(messageCreator, "MessageCreator must not be null");
MessageProducer producer = createProducer(session, destination);
try {
Message message = messageCreator.createMessage(session);
if (logger.isDebugEnabled()) {
logger.debug("Sending created message: " + message);
}
doSend(producer, message);
// Check commit - avoid commit call within a JTA transaction.
if (session.getTransacted() && isSessionLocallyTransacted(session)) {
// Transacted session created by this template -> commit.
JmsUtils.commitIfNecessary(session);
}
}
finally {
JmsUtils.closeMessageProducer(producer);
}
}
createProducer()方法又调用了doCreateProducer(),实际的消息生产者在这里。
Java代码
protected MessageProducer doCreateProducer(Session session, Destination destination) throws JMSException {
return session.createProducer(destination);
}
在这里,我们看到了,spring创建了消息的发送者,关闭连接的一些操作。到这里,大家就明白了,spring内部处理Jms消息的过程了吧(消息的接受也是一样)。
JMS的功能大致上分为两块,叫做消息制造和消息消耗。JmsTemplate 用于制造消息和同步消息接收。我们今天就用JmsTemplate实现同步的消息接受。
使用JMS发(接)消息的步骤:
1)创建连接工厂
2)使用连接工厂创建连接
3)使用连接创建会话
4)获取一个目的地
5)使用会话和目的地创建消息生产者(消息消费者)
6)使用连接创建一个需要发送的消息类型实例
7)使用连接的一个队列发送器或主题公布器,使用发送器或者主题器发送消息(接受消息)
spring中的JmsTemplate实现了对jms的一些封装,内部提供了很多的方法,我们只需要实现定义的回调接口即可。JmsTemplate继承自JmsAccessor,在JmsAccessor中有ConnectionFactory的定义,而JmsTemplate本身的构造方法也有对ConnectionFactory的封装:
Java代码
public JmsTemplate(ConnectionFactory connectionFactory) {
this();
setConnectionFactory(connectionFactory);
afterPropertiesSet();
}
所以,我们有两种方式注入ConnectionFactory,本文我们采用构造方法的方式。
spring_jms.xml
Java代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 这里我们用构造方法注入 connectionFactory-->
<bean id = "jmsTemplate" class = "org.springframework.jms.core.JmsTemplate">
<constructor-arg ref="connectionFactory"></constructor-arg>
</bean>
<!-- 使用activemq中的连接工厂,提供一个brokerUrl,这里表示本地 -->
<bean id = "connectionFactory" class = "org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="vm://localhost" />
</bean>
<!-- 使用activemq中的点对点消息模型,随意指定一个地址 -->
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="test/queue"/>
</bean>
</beans>
MessageCreator 回调接口通过JmsTemplate中调用代码提供的Session来创建一条消息。
看一下MessageCreator接口:
Java代码
public interface MessageCreator {
Message createMessage(Session session) throws JMSException;
}
那么,我们来实现发送和接受消息DummyJms类
Java代码
public class DummyJms {
public static void main(String[] args) throws Exception{
ApplicationContext context = new ClassPathXmlApplicationContext("spring.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("send message ");
}
});
TextMessage msg = (TextMessage)jmsTemplate.receive(destination);
System.out.println("receive message = " + msg.getText());
}
}
输出结果:
receive message = send message
可是我们并没有看到的像前文描述的那那些创建消息生产者,消息消费者的一些东西。继续分析,我们可以看一下,
jmsTemplate.send(Destination destination,MessageCreator messageCreator)这里到底做了什么,可以让我们不费吹灰之力,就可以实现消息的发送。JmsTemplate源代码:
Java代码
public void send(final Destination destination, final MessageCreator messageCreator) throws JmsException {
execute(new SessionCallback<Object>() {
public Object doInJms(Session session) throws JMSException {
doSend(session, destination, messageCreator);
return null;
}
}, false);
}
JmsTemplate实现了JmsOperations接口,在JmsOperations里有
Java代码
<T> T execute(SessionCallback<T> action) throws JmsException;
的定义。
那么这个SessionCallback接口是什么呢?它也为用户提供了JMS session。
Java代码
public interface SessionCallback<T> {
T doInJms(Session session) throws JMSException;
}
继续往下看。doSend方法:
Java代码
protected void doSend(Session session, Destination destination, MessageCreator messageCreator)
throws JMSException {
Assert.notNull(messageCreator, "MessageCreator must not be null");
MessageProducer producer = createProducer(session, destination);
try {
Message message = messageCreator.createMessage(session);
if (logger.isDebugEnabled()) {
logger.debug("Sending created message: " + message);
}
doSend(producer, message);
// Check commit - avoid commit call within a JTA transaction.
if (session.getTransacted() && isSessionLocallyTransacted(session)) {
// Transacted session created by this template -> commit.
JmsUtils.commitIfNecessary(session);
}
}
finally {
JmsUtils.closeMessageProducer(producer);
}
}
createProducer()方法又调用了doCreateProducer(),实际的消息生产者在这里。
Java代码
protected MessageProducer doCreateProducer(Session session, Destination destination) throws JMSException {
return session.createProducer(destination);
}
在这里,我们看到了,spring创建了消息的发送者,关闭连接的一些操作。到这里,大家就明白了,spring内部处理Jms消息的过程了吧(消息的接受也是一样)。
发表评论
-
Jackson2.x通用工具类
2014-11-03 11:38 4843import java.io.IOException; i ... -
面试题
2013-02-27 09:04 1681从1加到100(考虑减少循环次数)使用数学公式 首先要知道 ... -
单例延迟实例化
2013-01-23 08:55 12951.如果出于性能的考虑而需要对实例域使用延迟初始化,就使用双 ... -
java中重载与重写的区别
2013-01-21 10:03 898首先我们来讲讲:重载(Overloading) ( ... -
自定义标签
2012-12-15 12:58 967package com.fsti.tag; import ... -
JAXB格式化beanToXml
2012-12-14 15:03 1226context = JAXBContext.n ... -
面向对象的特征有哪些方面?
2012-12-13 09:36 978计算机软件系统是现实 ... -
java nio缓冲器
2012-12-05 17:03 3567缓冲器仅仅是一个" 多功能 " 的数组。可 ... -
面向对象三大特性一句话概括
2012-12-04 15:58 1525封装可以隐藏实现细节,使得代码模块化; 继承可以扩 ... -
Java序列化高级认识
2012-12-04 09:13 1029将 Java 对象序列化为二进制文件的 Java 序列化技术是 ... -
面向接口编程——提升系统多态性和可扩展性
2012-12-03 14:10 1235接口的本质 接口,在表面上是由几个没有主体代码的方 ... -
面向对象之多态
2012-11-23 19:22 840多态性(polymorphisn)是允许你将父对象设置成为和一 ... -
我对"秒杀"在技术性上的一些看法
2012-11-22 11:31 983秒杀,是指电子商务 ... -
项目编码
2012-11-16 13:59 1114看两个项目所用的编码是否一样 Java的乱码问题: ... -
SVN错误:Attempted to lock an already-locked dir
2012-11-07 09:08 993出现这个问题后使用“ ... -
spring mvc自动绑定数据到对象
2012-11-05 12:33 1675yxb1990 写道 dancewing 写道 ... -
面向对象的三个基本特征
2012-11-04 08:31 1058面向对象的三个基本特征是:封装、继承、多态。 封装 封装最 ... -
预编译防sql注入
2012-11-03 20:23 1928prepareStatement会先初始化SQL,先把这个SQ ... -
Spring2.5.6+Struts2.1.6+Hibernate3.2升级到Spring3.1.3+Struts2.3.4+Hibernate3.6Final
2012-11-02 19:50 15901. Struts2.3.4相对于Struts2. ... -
Java类与对象的初始化
2012-10-19 09:33 867Java类与对象的初始化 面试的时候,经常会遇到这样的笔试题 ...
相关推荐
详细内容: SpringJMS整合ActiveMQ.doc 详细说明文档 apache-activemq-5.8.0-bin.zip ActiveMQ安装包 JMSTest.rar MyEclipse8.5下web工程
activeMQ和Spring集成的 SpringJMS示例代码,适合新手,老鸟勿喷请绕道。ps:为什么传个资源一定要设置下载分呢
Spring对JMS提供了很好的支持,可以通过JmsTemplate来方便地实现消息服务。本例通过activeMQ服务器模拟了消息的发送与接收。需要注意的是,activeMQ的运行依赖jdk的环境,而且对jdk的版本也有要求,我用的是jdk1.6+...
本人开发的spring jms项目,已经上线近一年了,这里是我项目jms配置文件,使用的是spring jms 整合weblogic jms。如果真的需要,请咨询我,并且附上我上传的这个配置文件,附近中没有带有这个文件,一律不作任何回答...
tomcat spring jms 异步消息传递入门实例
spring jms jar包
Spring JMS使异步消息变得简单.docSpring JMS使异步消息变得简单.doc
spring jms tomcat 异步消息传递入门实例
Spring JMS示例 该项目提供了一些使用Spring JMS进行异步和同步消息使用的示例。 异步消费 所有异步消息使用的示例都使用Spring 进行消息使用。 Spring JMS支持三种类型的消息侦听器,包括: ...
使用Spring JMS轻松实现异步消息传递.docx使用Spring JMS轻松实现异步消息传递.docx
使用Spring JMS轻松实现异步消息传递.pdf使用Spring JMS轻松实现异步消息传递.pdf
Java笔试题目类型Spring JMS 示例 该项目提供了一些使用 Spring JMS 进行异步和同步消息消费的示例。 异步消费 所有异步消息消费示例都使用 Spring 进行消息消费。 Spring JMS 支持三种类型的消息侦听器,包括: ...
spring_jms是基于Maven+Spring+JMS+Active入门级实例.
Java网络编程--基于Spring的JMS编程
本文内容包括:SpringJMSIBMWebSphereMQSpringJMS模板SpringJMS实现队列管理器的设置运行示例下载参考资料快速了解使用SpringJMS框架和IBMWebSphereMQ5.3进行JMS消息处理的基础知识。在Spring系列的第4期也是最后一...
spring-jms入门
基于Spring+JMS+ActiveMQ+Tomcat,我使用的版本情况如下所示:Spring 3.2.0,ActiveMQ 5.4.3,Tomcat 6.0.43。本例通过详细的说明和注释,实现消息服务的基本功能:发送与接收。Spring对JMS提供了很好的支持,可以...
在spring下配置jms。J2EE容器为weblogic8.1
Spring 和JMS 很好的结合介绍 并有实例模板
JMS(使用消息中介:ActiveMQ) ...JmsTemplate是Spring消除冗长和重复JMS代码的解决方案。JmsTemplate可以创建连接,获取会话,以及发送和接收消息。http://blog.csdn.net/facepp/archive/2008/11/26/3374151.aspx