Spring + ActiveMQ实现jms发送消息

本文介绍了如何使用Spring的JmsTemplate与ActiveMQ结合,实现JMS消息的发送和接收。通过配置ConnectionFactory,利用JmsTemplate的send和receive方法,简化了JMS API的使用。详细讲解了发送消息的流程,包括构造方法注入ConnectionFactory,实现MessageCreator接口创建消息,以及Spring内部如何处理消息的发送过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的封装:

public JmsTemplate(ConnectionFactory connectionFactory) {
        this();
        setConnectionFactory(connectionFactory);
        afterPropertiesSet();
}

所以,我们有两种方式注入ConnectionFactory,本文我们采用构造方法的方式。

spring_jms.xml



        
    

    




    




         





MessageCreator 回调接口通过JmsTemplate中调用代码提供的Session来创建一条消息。
看一下MessageCreator接口:

public interface MessageCreator {

    Message createMessage(Session session) throws JMSException;




那么,我们来实现发送和接受消息DummyJms类

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源代码:


public void send(final Destination destination, final MessageCreator messageCreator) throws JmsException {
        execute(new SessionCallback() {
            public Object doInJms(Session session) throws JMSException {
                doSend(session, destination, messageCreator);
                return null;
            }
        }, false);
}


JmsTemplate实现了JmsOperations接口,在JmsOperations里有

T execute(SessionCallback action) throws JmsException;


的定义。

那么这个SessionCallback接口是什么呢?它也为用户提供了JMS session。


public interface SessionCallback {

    T doInJms(Session session) throws JMSException;

}


继续往下看。doSend方法:


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(),实际的消息生产者在这里。

protected MessageProducer doCreateProducer(Session session, Destination destination) throws JMSException {
        return session.createProducer(destination);
    }


在这里,我们看到了,spring创建了消息的发送者,关闭连接的一些操作。到这里,大家就明白了,spring内部处理Jms消息的过程了吧(消息的接受也是一样)。
注:本文使用spring3.0和activemq5.2版本。
  

  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值