`
eric_hwp
  • 浏览: 126676 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring + ActiveMQ兑现jms发送消息

 
阅读更多

Spring + ActiveMQ实现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的封装:

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


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

spring_jms.xml

<?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接口:

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<Object>() {
			public Object doInJms(Session session) throws JMSException {
				doSend(session, destination, messageCreator);
				return null;
			}
		}, false);
}



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

<T> T execute(SessionCallback<T> action) throws JmsException;



的定义。

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

public interface SessionCallback<T> {

	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版本。

分享到:
评论

相关推荐

    JMS之Spring +activeMQ实现消息队列

    总结起来,"JMS之Spring + ActiveMQ实现消息队列"涉及到的关键知识点包括:Spring框架的JMS支持、ActiveMQ的使用、ConnectionFactory的配置、JmsTemplate和MessageListener的实现,以及消息队列在解决系统解耦和异步...

    Spring+JMS+ActiveMQ+Tomcat实现消息服务的demo

    基于Spring+JMS+ActiveMQ+Tomcat,我使用的版本情况如下所示:Spring 3.2.0,ActiveMQ 5.4.3,Tomcat 6.0.43。本例通过详细的说明和注释,实现消息服务的基本功能:发送与接收。Spring对JMS提供了很好的支持,可以...

    spring+activemq必备jar包

    spring+activemq必备jar包:activeio-core-3.1.4.jar,activemq-all-5.13.2.jar,activemq-pool-5.13.2.jar,commons-pool2-2.4.2.jar

    Spring+ActiveMQ整合实例代码工程

    ActiveMQ作为JMS的实现,可以通过Spring的配置来轻松集成,使得应用程序能够方便地发送和接收消息。 1. **Spring JMS配置** 在Spring配置文件中,我们需要定义一个`ConnectionFactory`,它是与消息服务器建立连接...

    jms Spring+ActiveMQ 5.4.2

    标题 "jms Spring+ActiveMQ 5.4.2" 涉及的是Java消息服务(JMS)在Spring框架中的应用,以及ActiveMQ作为消息代理的使用。在这个主题下,我们将深入探讨JMS的基本概念、Spring对JMS的支持以及ActiveMQ 5.4.2版本的...

    spring+activemq

    标题“spring+activemq”暗示了我们将探讨如何将Spring框架与ActiveMQ集成,以便利用JMS进行高效的消息传递。下面我们将深入讨论这个主题。 首先,**Spring对JMS的支持**:Spring框架提供了一套强大的JMS抽象层,...

    基于Spring+JMS+ActiveMQ+Tomcat的整合ActiveMQSpringDemo实例源码.zip

    基于Spring+JMS+ActiveMQ+Tomcat的整合ActiveMQSpringDemo实例源码,此实例基于Spring+JMS+ActiveMQ+Tomcat,注解的完整实例,包含jar包,可供学习及设计参考。

    SpringBoot+ActiveMq+MQTT实现消息的发送和接收

    在本文中,我们将深入探讨如何使用SpringBoot、ActiveMQ和MQTT来实现消息的发送与接收。这是一个典型的分布式系统中的消息通信场景,其中SpringBoot作为应用程序框架,ActiveMQ作为消息中间件,而MQTT(Message ...

    Spring+JMS+ActiveMQ+Tomcat jar下载

    在"Spring+JMS+ActiveMQ+Tomcat"的组合中,Spring作为核心框架负责应用的结构和依赖管理,而JMS提供消息传递机制。ActiveMQ作为JMS的实现,承担起消息队列的职责,确保消息的可靠传输。Tomcat则作为运行环境,承载着...

    SpringMVC+Spring+Mybatis框架整合Mqttt通信协议+ActiveMQ作为中间件进行消息的发布与订阅

    单片机部分采用MQTT协议将主题消息发布到队列中,java部分也采用MQTT协议进行处理,整合MQTT协议, 具体这个资源是干什么的,请查看博客: https://blog.csdn.net/qq_34178998/article/details/93158429

    Spring+JMS+ActiveMQ+Tomcat实现消息服务_服务器应用

    ### Spring+JMS+ActiveMQ+Tomcat 实现消息服务 #### 一、技术栈介绍 在本案例中,我们采用的技术栈为Spring 2.5、ActiveMQ 5.4.0 和 Tomcat 6.0.30。这些技术的结合能够有效地构建一个可靠的消息传递系统。 - **...

    spring+jms+activemq

    总结来说,"spring+jms+activemq"的组合为开发者提供了一种高效、可扩展的异步消息处理方案。Spring简化了JMS的集成和管理,ActiveMQ作为强大的消息中间件,保证了消息的稳定传输。通过理解和掌握这一技术栈,开发者...

    spring整合jms+activemq

    综上所述,Spring整合JMS和ActivemQ提供了一套完整的解决方案,帮助开发者轻松地在应用中实现消息的发送和接收。通过这种方式,可以构建出高可用、松耦合、可扩展的分布式系统,提高系统的稳定性和响应速度。在实际...

    springboot-nettysocketio +netty+activeMq在线客服系统

    springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot +netty+activeMq在线客服系统springboot...

    基于Spring+JMS+ActiveMQ+Tomcat整合

    基于Spring+JMS+ActiveMQ+Tomcat,做一个Spring4.1.0和ActiveMQ5.11.1整合实例,实现了Point-To-Point的异步队列消息和PUB/SUB(发布/订阅)模型,简单实例,不包含任何业务。

    springMvc+spring+activeMq+mybaits

    Spring与ActiveMQ的集成非常便捷,可以使用Spring的JmsTemplate或配置监听容器来发送和接收消息。 MyBatis是一个轻量级的持久层框架,它简化了Java应用与数据库之间的交互。MyBatis允许开发者编写SQL语句,将它们与...

    Spring+ActiveMQ消息队列+前台接收消息

    2. **创建消息生产者**:在Spring中,你可以使用`JmsTemplate`作为消息生产者,发送消息到ActiveMQ的队列或主题。配置`JmsTemplate`并设置ActiveMQ的连接工厂,然后在需要发送消息的地方调用其`convertAndSend`方法...

    spring + activemq 消息sample

    5. **事务管理**:Spring还提供了对JMS事务的支持,可以在消息发送或接收过程中加入事务控制,确保消息的可靠传输。 6. **消息选择器**:可以通过设置消息选择器来过滤接收的消息,只处理满足特定条件的消息。 7. ...

Global site tag (gtag.js) - Google Analytics