`

Spring JMS和ActiveMQ

    博客分类:
  • JMS
 
阅读更多
JMS可以建立发送和接受消息的程序.消息是在java程序或组件之间传递的信息,可以是文本,也可以是其他类型如某个类的对象。涉及到多个系统协作或者处理开销较高的,且不希望耦合度太紧密的,就会考虑用JMS来作为接口。
在下列情况下应该考虑使用JMS而不是其他的消息处理机制:
1.消息的发送者和接受者不需要依赖对方的接口
2.消息的发送者和接受者不需要对方同时在运行
3.消息的发送者不需要接收者立刻应答
JMS消息传送分为point to point(点对点)和publish/subscribe(出版/预定)两种
JMS用来做什么:
用JMS来异步发送邮件,还可以用JMS来解决很多复杂的问题,例如 分布,并发,系统解耦,负载均衡,热部署,触发器等等,这些复杂问题因为引入JMS而变的更加简单.下面简单介绍下解决分布,并发问题的场景.
1.pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.springframework.samples</groupId>
  <artifactId>spring-jms-activemq-send</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <properties>   
    <!-- Spring version -->
    <spring-framework.version>4.1.0.RELEASE</spring-framework.version>   
    <!-- ActiveMQ version -->
    <activemq.version>5.10.0</activemq.version>
  </properties>
  
  <dependencies>   
    <!-- Spring aritifacts -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring-framework.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jms</artifactId>
      <version>${spring-framework.version}</version>
    </dependency> 
 
    <!-- ActiveMQ Artifacts -->
    <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-spring</artifactId>
      <version>${activemq.version}</version>
    </dependency>
  </dependencies>
   
  <!-- Using JDK 1.7 for compiling -->
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.5.1</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

2. Message Sender和消费者Listener
package com.deppon.test04.jms;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;

import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;
 
@Service
public class JmsMessageSender {
 
  @Autowired
  private JmsTemplate jmsTemplate;
   
   
  /**
   * send text to default destination
   * @param text
   */
  public void send(final String text) {
     
    this.jmsTemplate.send(new MessageCreator() {
      @Override
      public Message createMessage(Session session) throws JMSException {
        Message message = session.createTextMessage(text);    
        //set ReplyTo header of Message, pretty much like the concept of email.
        message.setJMSReplyTo(new ActiveMQQueue("Recv2Send"));
        return message;
      }
    });
  }
   
  /**
   * Simplify the send by using convertAndSend
   * @param text
   */
  public void sendText(final String text) {
    this.jmsTemplate.convertAndSend(text);
  }
   
  /**
   * Send text message to a specified destination
   * @param text
   */
  public void send(final Destination dest,final String text) {
     
    this.jmsTemplate.send(dest,new MessageCreator() {
      @Override
      public Message createMessage(Session session) throws JMSException {
        Message message = session.createTextMessage(text);
        return message;
      }
    });
  }
}

import javax.jms.JMSException; 
import javax.jms.Message; 
import javax.jms.MessageListener; 
import javax.jms.TextMessage; 
  
public class ConsumerMessageListener implements MessageListener { 
  
    public void onMessage(Message message) { 
        //这里我们知道生产者发送的就是一个纯文本消息,所以这里可以直接进行强制转换 
        TextMessage textMsg = (TextMessage) message; 
        System.out.println("接收到一个纯文本消息。"); 
        try { 
            System.out.println("消息内容是:" + textMsg.getText()); 
        } catch (JMSException e) { 
            e.printStackTrace(); 
        } 
    } 
  


3. Message Main函数:
package com.deppon.test04.jms;

import javax.jms.Queue;

import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class DemoMain {

  public static void main(String[] args) {
    // init spring context
    ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
//    BeanFactory ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");    
    // get bean from context
    JmsMessageSender jmsMessageSender = (JmsMessageSender)ctx.getBean("jmsMessageSender");
        
    // send to default destination
    jmsMessageSender.send("hello JMS");
        
    // send to a code specified destination
    Queue queue = new ActiveMQQueue("AnotherDest");
    jmsMessageSender.send(queue, "hello Another Message");
  
    // close spring application context
    ((ClassPathXmlApplicationContext)ctx).close();
  }

}

4.applicationContext.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" xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/tx  
     http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
     http://www.springframework.org/schema/aop  
     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
    <context:component-scan base-package="com.deppon.test04.jms" />
    <!-- JMS -->
    <bean id="jmsMessageSender" class="com.deppon.test04.jms.JmsMessageSender">   </bean>
   
    <!-- =============================================== -->
    <!-- JMS Common, Define JMS connectionFactory       -->
    <!-- =============================================== -->
    <!-- Activemq connection factory -->
    <bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
      <!-- brokerURL, You may have different IP or port -->
      <constructor-arg index="0" value="tcp://10.182.105.30:61616" />
      <!--  <constructor-arg index="0" value="tcp://localhost:8161" />-->
    </bean>

    <!-- Pooled Spring connection factory -->
    <bean id="connectionFactory"
       class="org.springframework.jms.connection.CachingConnectionFactory">
      <constructor-arg ref="amqConnectionFactory" />
    </bean>

    <!-- ======================================================= -->
    <!-- JMS Send, define default destination and JmsTemplate    -->
    <!-- ======================================================= -->
    <!-- Default Destination Queue Definition -->
    <bean id="defaultDestination" class="org.apache.activemq.command.ActiveMQQueue">
      <!-- name of the queue -->
      <constructor-arg index="0" value="Send2Recv" />
    </bean>

    <!-- JmsTemplate Definition -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
      <property name="connectionFactory" ref="connectionFactory" />
      <property name="defaultDestination" ref="defaultDestination" />
    </bean>

<!-- 消息监听器 --> 
    <bean id="consumerMessageListener" class="com.deppon.test04.jms.ConsumerMessageListener"/>     
 
    <!-- 消息监听容器 --> 
    <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
        <property name="connectionFactory" ref="connectionFactory" /> 
        <property name="destination" ref="defaultDestination" /> 
        <property name="messageListener" ref="consumerMessageListener" /> 
    </bean>
   
</beans>

5.下载ActiveMQ,并点击..\apache-activemq-5.9.0\bin\win64\activemq.bat启动MQ
http://activemq.apache.org/activemq-590-release.html

6.可以通过http://localhost:8161/index.html下的“Manage ActiveMQ broker”查看当前的Broker信息,例如地址、端口号等
http://localhost:8161/hawtio/#/jmx/attributes?tab=activemq&nid=root-org.apache.activemq-Broker-localhost


7.可以在eclispe下运行main函数,也可以在命令行下运行命令:
--------------------------------------------------------
cd 当前项目,例如c:\workspace\SpringWeb
mvn exec:java -Dexec.mainClass="com.deppon.test04.jms.DemoMain"

8.可以登入admin页面,访问“Queue Views”,用户名密码默认为admin,可以看到

<queues>
<queue name="Send2Recv">
<stats size="4" consumerCount="0" enqueueCount="4" dequeueCount="0"/>
<feed>
<atom>queueBrowse/Send2Recv?view=rss&feedType=atom_1.0</atom>
<rss>queueBrowse/Send2Recv?view=rss&feedType=rss_2.0</rss>
</feed>
</queue>
<queue name="AnotherDest">
<stats size="4" consumerCount="0" enqueueCount="4" dequeueCount="0"/>
<feed>
<atom>queueBrowse/AnotherDest?view=rss&feedType=atom_1.0</atom>
<rss>queueBrowse/AnotherDest?view=rss&feedType=rss_2.0</rss>
</feed>
</queue>
</queues>
控制台输出结果:
接收到一个纯文本消息。
消息内容是:hello JMS
接收到一个纯文本消息。
消息内容是:hello JMS
接收到一个纯文本消息。
消息内容是:hello JMS
接收到一个纯文本消息。
消息内容是:hello JMS
接收到一个纯文本消息。
消息内容是:hello JMS

9.junit测试类:
import javax.jms.Destination; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 
  
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("/applicationContext.xml") 
public class ProducerConsumerTest { 
  
    @Autowired 
    private JmsMessageSender producerService; 
    @Autowired 
    @Qualifier("defaultDestination") 
    private Destination destination; 
     
    @Test 
    public void testSend() { 
        for (int i=0; i<2; i++) { 
            producerService.send(destination, "你好,生产者!这是消息:" + (i+1)); 
        } 
    }       
}

参考:
http://shengwangi.blogspot.jp/2014/10/spring-jms-with-activemq-helloworld-example-send.html
http://haohaoxuexi.iteye.com/blog/1893038
https://spring.io/guides/gs/messaging-jms/
http://activemq.apache.org/jms.html
http://www.cnblogs.com/huang0925/p/3558690.html
http://www.javacodegeeks.com/2015/04/configure-a-spring-jms-application-with-spring-boot-and-annotation-support.html
http://itindex.net/detail/49721-jms-jms-%E5%BA%94%E7%94%A8 JMS的应用
分享到:
评论

相关推荐

    SpringJMS整合ActiveMQ

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

    Spring 实现远程访问详解——jms和activemq

    本章我将通过spring jms和activemq实现单Web项目服务器间异步访问和多Web项目服务器间异步访问。 一. 简介 1. 什么是Apache ActiveMq Apache ActiveMq是最流行和最强大的开源消息和集成服务器。同时Apache ActiveMq...

    spring整合jms+activemq

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

    SpringJMS示例代码

    集成SpringJMS和ActiveMQ首先需要在Spring配置中定义ConnectionFactory和Destination(Topic或Queue)。ConnectionFactory是JMS客户端用来创建与消息服务器的连接的工厂,而Destination是消息的目的地。Spring的`...

    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的整合实例源码

    3. `pom.xml`或`build.gradle`文件,描述了项目的构建依赖,包括Spring、ActiveMQ和其他必需库。 4. 测试脚本或测试类,用于验证消息的发送和接收。 为了运行这个实例,你需要安装并配置Tomcat服务器,然后按照说明...

    spring+jms+activemq

    在IT行业中,Spring框架...Spring简化了JMS的集成和管理,ActiveMQ作为强大的消息中间件,保证了消息的稳定传输。通过理解和掌握这一技术栈,开发者可以构建出高可用、松耦合的应用系统,提高系统的整体性能和稳定性。

    jms Spring+ActiveMQ 5.4.2

    总结起来,"jms Spring+ActiveMQ 5.4.2"是一个关于如何利用Spring框架和ActiveMQ实现高效、可靠的JMS通信的教程或示例。通过学习这个主题,开发者可以掌握如何在Java环境中构建健壮的、分布式的消息驱动系统。

    Spring+JMS+ActiveMQ+Tomcat jar下载

    Spring、JMS、ActiveMQ和Tomcat是Java开发中常用的技术组件,它们分别扮演着不同的角色,构建出高效的企业级消息通信系统。本教程将详细阐述这些技术的使用及其相互结合的方式。 首先,Spring是一个开源的Java应用...

    Spring整合JMS.doc

    1. **添加依赖**:在Maven项目中,需要添加Spring JMS和ActiveMQ的相关依赖。这些依赖包括但不限于Spring的context、jms模块,以及ActiveMQ的核心库。 2. **ActiveMQ的准备**:下载并安装ActiveMQ,通常是在Apache...

    JMS之Spring +activeMQ实现消息队列

    1. 添加依赖:在项目的Maven或Gradle配置文件中引入ActiveMQ和Spring JMS的相关库。 2. 配置ConnectionFactory:这是连接到ActiveMQ服务器的关键,可以通过XML配置或Java配置来定义。 3. 创建Destination:JMS中的...

    基于Spring+JMS+ActiveMQ+Tomcat整合

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

    Spring与ActiveMQ完整实例源码下载 Maven 版.zip

    《Spring与ActiveMQ整合实战详解》 在Java开发领域,Spring框架和ActiveMQ是两个非常重要的...这个实例源码是一个很好的学习起点,可以帮助开发者深入理解Spring JMS和ActiveMQ的使用,为实际项目开发打下坚实的基础。

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

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

    jms+activeMq+spring学习简单例子

    标题“jms+activeMq+spring学习简单例子”表明这个压缩包包含了一些示例代码,用于演示如何在Spring框架中集成JMS和ActiveMQ,以便于理解和学习。通过这个例子,开发者可以了解如何在实际应用中实现基于消息的通信。...

    JMS-activemq 实例(分ppt,eclipse工程,说明三部分)

    1. **PPTX文件(activemq.pptx)** - 这通常是一个演示文稿,详细介绍了JMS和ActiveMQ的基础知识、工作原理以及如何使用它们。它可能包含概念解释、架构图、配置示例和使用步骤等内容,帮助学习者理解ActiveMQ的核心...

    MQ、JMS以及ActiveMQ关系的理解

    ActiveMQ的主要特点包括支持多种编程语言和协议的客户端、完全支持JMS 1.1和J2EE 1.4规范、对Spring的支持、支持多种传输协议以及持久化和事务处理能力。 在实际的项目中,消息队列经常被用于将一些耗时的操作,如...

    Spring和ActiveMQ整合的完整实例

    将Spring与ActiveMQ整合,可以轻松地在Spring应用中实现消息队列的功能,提高系统的可扩展性和可靠性。 首先,让我们了解Spring框架如何支持消息传递。Spring提供了JmsTemplate类,这是一个模板类,用于简化发送和...

    spring整合JMS-居于ActiveMQ实现

    整合Spring与ActiveMQ,首先需要在Spring配置文件中定义一个JMS模板,这是一个便捷的工具类,可以用来发送和接收消息。例如: ```xml &lt;bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"&gt; ...

    Spring 使用ActiveMQ 收发消息实例

    在本文中,我们将深入探讨如何在Java Spring框架中使用ActiveMQ进行消息传递。Spring与ActiveMQ的集成...在实际开发中,我们应充分利用Spring JMS模块的便利性和ActiveMQ的高性能特性,确保系统间的通信稳定、高效。

Global site tag (gtag.js) - Google Analytics