`

spring jms

阅读更多
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
评论

相关推荐

    SpringJMS示例代码

    SpringJMS是Spring框架的一部分,它提供了一种与Java消息服务(JMS)进行交互的简单方式。在本文中,我们将深入探讨SpringJMS的基本概念、如何与ActiveMQ集成,以及如何通过示例代码理解其工作原理。 1. **Spring...

    SpringJMS整合ActiveMQ

    详细内容: SpringJMS整合ActiveMQ.doc 详细说明文档 apache-activemq-5.8.0-bin.zip ActiveMQ安装包 JMSTest.rar MyEclipse8.5下web工程

    Spring JMS

    Spring JMS Spring JMS 是一个基于 Java 消息服务(JMS)的框架,它提供了一个简洁的方式来使用 JMS API。Spring JMS 框架提供了一个抽象层,简化了 JMS 的使用,使得开发者可以更容易地使用 JMS。 Spring JMS 的...

    springjms的demo

    Spring对JMS提供了很好的支持,可以通过JmsTemplate来方便地实现消息服务。本例通过activeMQ服务器模拟了消息的发送与接收。需要注意的是,activeMQ的运行依赖jdk的环境,而且对jdk的版本也有要求,我用的是jdk1.6+...

    spring_jms

    Spring JMS(Java Message Service)是Spring框架的一部分,专门用于集成JMS消息传递系统,以实现异步通信和解耦应用程序组件。在这个入门级实例中,我们将探讨如何使用Maven、Spring和ActiveMQ来构建一个简单的...

    Spring JMS 消息处理-基于JNDI

    这篇博客“Spring JMS 消息处理-基于JNDI”将深入探讨如何在Spring应用中使用JMS进行消息处理,并利用JNDI(Java Naming and Directory Interface)来查找和配置消息资源。 JMS是Java平台上的一个标准接口,它定义...

    Java网络编程--基于Spring的JMS编程

    在Java中,Spring框架提供了强大而灵活的支持,使得开发人员能够轻松地实现基于Java消息服务(JMS)的网络编程。JMS是一个标准接口,它允许应用程序创建、发送、接收和读取消息,这些消息可以在不同的应用之间传递,...

    spring jms 整合 weblogic jms

    本人开发的spring jms项目,已经上线近一年了,这里是我项目jms配置文件,使用的是spring jms 整合weblogic jms。如果真的需要,请咨询我,并且附上我上传的这个配置文件,附近中没有带有这个文件,一律不作任何回答...

    Spring JMS消息处理-不基于JNDI

    在本文中,我们将深入探讨Spring框架中的Java消息服务(JMS)支持,特别是不依赖于JNDI(Java Naming and Directory Interface)的方式。Spring JMS为应用程序提供了与消息中间件交互的能力,允许我们构建可扩展且...

    使用Spring JMS轻松实现异步消息传递.pdf

    【Spring JMS 知识点详解】 Spring JMS 是 Spring 框架的一部分,它提供了一种简单且灵活的方式来处理 Java 消息服务 (JMS)。在面向服务架构 (SOA) 中,异步消息传递是关键组件,特别是在企业级系统间通信,特别是...

    spring jms tomcat 异步消息传递入门实例

    在IT行业中,Spring框架是Java应用开发的基石,它提供了丰富的功能来简化应用程序的构建,而JMS(Java Message Service)则是处理异步通信的一种标准API。Tomcat作为轻量级的应用服务器,常用于部署Spring应用。在这...

    JMS整合Spring实例

    **JMS整合Spring实例** Java消息服务(Java Message Service,简称JMS)是Java平台中用于企业级应用间异步通信的一种标准接口。它允许应用程序创建、发送、接收和读取消息,以此来解耦生产者和消费者。而Spring框架...

    jms整合spring工程

    本项目"jms整合spring工程"是一个已经准备就绪的Java工程,它展示了如何在Spring框架中集成JMS,以便利用消息队列进行通信。主要依赖的是Apache ActiveMQ,这是一款流行的开源JMS提供者,能够实现高效、可靠的实时...

    SpringJMS源码

    **Spring JMS源码分析** 在Java世界里,消息队列(JMS,Java Message Service)是一种标准,它定义了一种规范,使得不同的消息中间件提供商可以为开发者提供一致性的API,以实现在应用程序间传递消息。Spring JMS是...

    Spring集成JMS

    在实际应用中,`SpringJMS`可能包含以下示例代码片段: ```xml &lt;bean id="jmsConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"&gt; &lt;!-- 这里配置具体的JMS提供商实现 --&gt;...

    spring jms 3.2

    spring jms jar包

Global site tag (gtag.js) - Google Analytics