`
yunzhongxia
  • 浏览: 648468 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring整和ActiveMQ

阅读更多

问题一:为什么要整合ActiveMQ?

      传统的JDBC代码在处理连接、语句、结果集和异常时是多么冗长和繁杂你一定不会忘记,传统的JMS继承了JDBC的“关荣传统”。发送一个简单的消息,要几行代码呢?请仔细数数吧。

	public void sendMessage() throws JMSException {
		ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
		"tcp://localhost:61616");
		Connection connection = null;
		Session session=null;
		try {
			
			connection = (Connection) connectionFactory.createConnection();//创建连接
			session = (Session) connection.createSession(false,
					Session.AUTO_ACKNOWLEDGE);//创建会话
			Destination destination = session.createQueue("myQueue");
			MessageProducer producer = session.createProducer(destination);
			TextMessage message = session.createTextMessage(expectedBody);
			message.setStringProperty("headname", "remoteB");
			producer.send(message);
			connection.close();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				if(session!=null){
					session.close();
				}
				if(connection!=null){
					connection=null;
				}
			} catch (Exception e) {
				
			}
		}
	}

 

传统接受消息而是类似的代码,其实我们的目的就是发送和接受消息。幸运的是Spring为我们提供了大量的模板。项目一期用的较多的是JdbCTemplate,spring也为我们提供了JMSTemplate模板。

 

问题二:JMSTemplate模板该如何配置呢?

类似于jdbcTemplate,首先要配置一个ConnectionFactory,我们采用ActiveMQ5.2作为消息服务器。之后要开始配置JmsTemplate模板了。最后是配置消息目标了。消息分为队列和主题两大类,因此要配置两个消息目标了。

 

<!-- ActiveMQ -->
    
    <!-- 配置JMS连接工厂 -->  
    <bean id="JmsConnectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">  
    	<property name="brokerURL" value="tcp://localhost:61616"/>  
    </bean>  
    <!-- 配置JMS模版 -->  
    <bean id="JmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
    	<property name="connectionFactory" ref="JmsConnectionFactory"/>  
    </bean>  
    <!-- 发送消息的目的地(队列) -->  
    <bean id="QueueDestination" class="org.apache.activemq.command.ActiveMQQueue">  
    	<!-- 设置消息队列的名字 -->  
    	<constructor-arg index="0" value="HelloWorldQueue"/>  
    </bean>
    <!-- 发送消息的目的地(主题) -->  
    <bean id="TopicDestination" class="org.apache.activemq.command.ActiveMQTopic">  
    	<!-- 设置消息主题的名字 -->  
    	<constructor-arg index="0" value="FlexTopic"/>  
    </bean>   

 

问题三:如何使用JmsTemplate发送消息呢?

spring的beanfactory得到一个jmsTemplate的实例和消息目标的实例,发送消息,够简单的吧。看看代码:

JmsTemplate template = (JmsTemplate) SpringContext.getBean("JmsTemplate");
			ActiveMQTopic destination=(ActiveMQTopic)SpringContext.getBean("TopicDestination");
			template.send((javax.jms.Destination) destination, new MessageCreator(){
				public Message createMessage(Session session) throws JMSException {
					return session.createTextMessage("hello");
				}
				
			});

 问题四:上面的代码能不能在简单些?

很多时候,发送消息的目标都是默认的,因此是不是可以在jmsTemplate中设置一个默认的消息目标呢?答案是肯定的。

 <!-- 配置JMS模版 -->  
    <bean id="JmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
    	<property name="connectionFactory" ref="JmsConnectionFactory"/>
    	<property name="defaultDestination" ref="TopicDestination"></property>
    </bean> 

 

发送消息的时候,不指定目标,spring就会调用默认的目标了。

JmsTemplate template = (JmsTemplate) SpringContext.getBean("JmsTemplate");
			template.send( new MessageCreator(){
				public Message createMessage(Session session) throws JMSException {
					return session.createTextMessage("hello");
				}
			});

 

问题四:jmsTemplate怎么接受信息?

 

jmsTemplate接收消息十分的简单,只需要调用template.receive()方法,receive方法是同步的,默认情况下,对receive()方法的调用会造成阻塞,知道消息到达目标----如果必要,永远等下去。为了避免对消息内容等待,可以配置jmsTemplate时,通过设置receiveTimeout属性来指定接收消息超时时间。下面的配置将接收消息的超时时间设置为一分钟(60000毫秒)。

 <!-- 配置JMS模版 -->  
    <bean id="JmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
    	<property name="connectionFactory" ref="JmsConnectionFactory"/>
    	<property name="defaultDestination" ref="TopicDestination"></property>
    	<property name="receiveTimeout" value="60000"></property>
    </bean>  

 

 template.receive()会从默认目标接收消息,如果你希望指定一个目标,可以传一个目标。如:template.receive("myQueue").

同步接收消息并不是spring唯一的选择,消息监听器可以实现异步(下篇文章将会介绍消息驱动)。

 

问题五:怎么自动将消息转化为Java对象?

 

转化器在很多组件中都是必不缺少的东西。Spring挺过MessageConverter接口提供了对消息转换的支持。

public class MyMessageConverter implements MessageConverter {
	@Override
	public Object fromMessage(Message arg0) throws JMSException,
			MessageConversionException {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public Message toMessage(Object arg0, Session arg1) throws JMSException,
			MessageConversionException {
		// TODO Auto-generated method stub
		return null;
	}
}

 

MessageConverter接口的两个方法简单明了。在发送端toMessage会将java对象转化为消息,在接收端fromMessage会将消息转化为java对象。

下面的代码简单的实现了MessageConverter的两个接口。

public class MyMessageConverter implements MessageConverter {
	@Override
	public Object fromMessage(Message message) throws JMSException,
			MessageConversionException {
		if(!(message instanceof MapMessage)){
			throw new MessageConversionException("Messae is not MapMessage");
		}
		MapMessage mapMessage=(MapMessage)message;
		MessageObj messageObj=new MessageObj();
		messageObj.setId(mapMessage.getString("id"));
		messageObj.setInfo(mapMessage.getString("info"));
		return messageObj;
	}
	@Override
	public Message toMessage(Object obj, Session session) throws JMSException,
			MessageConversionException {
		if(!(obj instanceof MessageObj)){
			throw new MessageConversionException("obj is not MessageObj");
		}
		MessageObj messageObj=(MessageObj)obj;
		MapMessage mapMessage=session.createMapMessage();
		mapMessage.setString("id", messageObj.getId());
		mapMessage.setString("info", messageObj.getInfo());
		return mapMessage;
	}
}

 

此时,发送和接收消息要换成template.convertAndSend(message);template.receiveAndConvert();

可是jmsTemplate如何知道消息转换器呢?需要在配置jmsTemplate的时候,加上messageConverter属性。

 <!-- 配置JMS模版 -->  
    <bean id="JmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
    	<property name="connectionFactory" ref="JmsConnectionFactory"/>
    	<property name="defaultDestination" ref="TopicDestination"></property>
    	<property name="receiveTimeout" value="60000"></property>
    	<property name="messageConverter" ref="messageObj"></property>
    </bean>  

 messageObj是要转化的java对象的bean的id。

分享到:
评论
1 楼 zhengyong7232 2013-07-02  
请问搞过mq的ssl 单向连接吗?我按官网的配置,配好后,客户端测试程序不信任我的连接,必须让我导入证书,可是导入证书的话,就是双向的了。 。。

相关推荐

    Spring和ActiveMQ整合的完整实例

    整合Spring和ActiveMQ可以帮助我们构建可扩展的、高可用性的系统,通过消息队列实现应用间的解耦,提高系统的响应速度和并发处理能力。这个完整的实例是一个很好的学习资源,可以帮助开发者更好地理解和实践Spring与...

    Spring集成ActiveMQ配置

    Spring集成ActiveMQ配置详解 Spring框架与ActiveMQ的集成,为...然而,值得注意的是,随着技术的发展,Spring和ActiveMQ的版本也在不断更新,因此,在实际项目中,应当根据最新的文档和实践来进行相应的调整和优化。

    SpringJMS整合ActiveMQ

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

    Spring-ActiveMQ.rar_Spring Activemq_activemq_activemq spring

    而Spring框架,作为一个Java平台的全功能模块化解决方案,提供了与ActiveMQ集成的能力,让开发者能够轻松地在Spring应用中使用消息队列。本篇将深入探讨Spring与ActiveMQ的集成及其配置过程。 首先,理解Spring与...

    spring整合Activemq源码

    总结,`spring整合Activemq源码`项目展示了如何在Spring和SpringMVC环境中利用ActiveMQ实现消息的发布与订阅。通过理解这些知识点,开发者能够更好地理解和实践消息队列在实际项目中的应用,提升系统的稳定性和扩展...

    jms Spring+ActiveMQ 5.4.2

    在实际应用中,Spring和ActiveMQ的结合可以用于实现如下的功能: - **解耦组件**:通过消息传递,生产者和消费者可以独立开发和升级,互不影响。 - **负载均衡**:消息队列可以缓冲消息,防止高峰期对系统的冲击。 ...

    Spring和ActiveMQ的整合实例源码

    10. **Tomcat服务器**:Tomcat是一个流行的Java Web服务器,它可以部署和运行使用Spring和ActiveMQ的Web应用程序。 通过上述知识点,我们可以理解如何在Spring环境中利用ActiveMQ进行消息传递,实现高并发、解耦的...

    结合Spring2.0和ActiveMQ进行异步消息调用

    Spring框架和ActiveMQ的结合使用,为开发者提供了强大的异步消息传递能力。本文将深入探讨如何结合Spring 2.0与ActiveMQ来实现异步消息调用,并分享相关知识点。 首先,Spring 2.0是一个广泛使用的Java应用框架,它...

    ActiveMQ-P2P文本消息+Spring和ActiveMQ的整合实例源码

    以上就是关于 ActiveMQ-P2P 文本消息以及 Spring 和 ActiveMQ 整合实例的相关知识点。通过这些知识,开发者可以构建起可靠的点对点消息传递系统,提高应用的可扩展性和解耦性。在实际项目中,根据具体需求,还可以...

    Spring Boot整合ActiveMQ

    在 Spring Boot 中整合 ActiveMQ,可以使用 Spring 的 JmsTemplate 或者 @JmsListener 注解来发送和接收消息,实现应用间的异步通信和解耦。 整合以上技术的过程通常包括以下步骤: - 添加对应库的依赖,如 spring...

    spring boot 集成activemq Datajpa Ehcache

    在这个项目中,我们将探讨如何将Spring Boot与Apache ActiveMQ、DataJPA和Ehcache进行集成,以构建一个功能丰富的应用程序。 首先,ActiveMQ是Apache出品的一款开源消息中间件,它遵循Java Message Service (JMS) ...

    activemq spring 客户端配置

    1. 引入依赖:首先,在项目中添加ActiveMQ和Spring相关的依赖库。通常在Maven或Gradle的pom.xml或build.gradle文件中配置如下依赖: - Apache ActiveMQ: ```xml &lt;groupId&gt;org.apache.activemq &lt;artifactId&gt;...

    spring-boot-activemq-demo

    在`pom.xml`文件中,我们需要添加`spring-boot-starter-jms`和`activemq-client`依赖,以便利用Spring JMS API和ActiveMQ客户端库。 ```xml &lt;groupId&gt;org.springframework.boot &lt;artifactId&gt;spring-boot-...

    spring+activemq

    最后,**高级特性**:Spring和ActiveMQ还支持更复杂的消息处理模式,如主题(Topic)订阅、消息分发策略、消息优先级和消息组等。这些特性可以帮助开发者构建更健壮、灵活的消息系统。 总结,Spring与ActiveMQ的集...

    Spring boot 和内置ActiveMQ集成例子.zip

    将Spring Boot与ActiveMQ集成可以提供强大的消息处理能力,使应用能够解耦组件,提高可扩展性和容错性。 本文将详细讲解如何使用Spring Boot与内置的ActiveMQ进行集成,以及如何通过代码实现这一过程。 首先,我们...

    spring使用activeMQ实现消息发送

    在IT行业中,Spring框架是Java应用开发的基石,而ActiveMQ则是Apache组织开发的一款开源的消息中间件,用于处理异步通信和消息队列。本文将深入探讨如何在Spring环境中使用ActiveMQ来实现消息的发送与接收,以提高...

    spring2 activemq5 tomcat6构建jms

    在构建基于Spring和ActiveMQ的应用时,Tomcat可以作为部署环境,承载应用的Web容器部分。 构建JMS系统通常涉及到以下步骤: 1. **配置Spring**: 首先,在Spring的配置文件(如`applicationContext.xml`)中定义JMS...

    spring配置activemq详解

    在"spring配置activemq详解"这个主题中,我们将探讨如何在Spring项目中配置和使用ActiveMQ。以下是对这个主题的详细说明: 1. **配置ActiveMQ**: - 首先,我们需要在项目中引入ActiveMQ的相关依赖,这通常通过在`...

Global site tag (gtag.js) - Google Analytics