`
truelove12358
  • 浏览: 77491 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

【消息队列】二、Spring整合JMS(消息中间件)实例

 
阅读更多

本篇文章主要描述了如何配置spring-JMS,至于为何这样配置及Spring-JMS相关介绍,请阅读这篇文章:Spring整合JMS(消息中间件)。我们这里的消息broker用的是ActiveMQ。

一、相关配置

本篇主要讲解如何在Spring中配置JMS,关于Spring本身的配置本文就不多做介绍了。

1.1 配置maven依赖

在使用Spring-JMS之前,先配置相关依赖。

<!-- Java JMS 原生API -->
<dependency>
   <groupId>javax.jms</groupId>
   <artifactId>javax.jms-api</artifactId>
   <version>2.0</version>
</dependency>
<!-- spring-jms API -->
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-jms</artifactId>
   <version>${spring.version}</version>
</dependency>
<!-- active-mq核心包 -->
<dependency>
   <groupId>org.apache.activemq</groupId>
   <artifactId>activemq-core</artifactId>
   <version>5.7.0</version>
</dependency>
<!-- spring-test类用来测试 -->
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-test</artifactId>
   <version>${spring.version}</version>
</dependency>

 1.2 安装并启动ActiveMQ

这里只是简单介绍如何安装启动ActiveMQ,详细请参考官方文档。

  1. 下载ActiveMQ:http://activemq.apache.org/download.html
  2. 安装:
    - 解压:tar zxvf activemq-x.x.x-bin.tar.gz
    - 增加权限:
    cd [activemq_install_dir]/bin
    chmod 755 activemq

  3. 启动:
    cd [activemq_install_dir]/bin
    ./activemq start

  4. 检查是否启动成功:
    netstat -nl|grep 61616

我们还可以通过监控页面查看ActiveMQ运行情况:http://localhost:8161/admin(默认用户名密码都是admin)

1. 3 配置JMS相关bean

<?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:p="http://www.springframework.org/schema/p"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:jms="http://www.springframework.org/schema/jms"
   xmlns:amq="http://activemq.apache.org/schema/core"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
                       http://www.springframework.org/schema/beans/spring-beans.xsd
                       http://www.springframework.org/schema/context
                       http://www.springframework.org/schema/context/spring-context.xsd
                       http://www.springframework.org/schema/jms
                       http://www.springframework.org/schema/jms/spring-jms.xsd
                       http://activemq.apache.org/schema/core
                       http://activemq.apache.org/schema/core/activemq-core.xsd">

<!-- 配置连接ActiveMQ的ConnectionFactory -->
<bean id="amqConnectionFactory"
      class="org.apache.activemq.ActiveMQConnectionFactory"
      p:brokerURL="tcp://localhost:61616"/>
<!--为了提高效率,配置一个连接池-->
<bean id="cachedConnectionFactory"
      class="org.springframework.jms.connection.CachingConnectionFactory"
      p:targetConnectionFactory-ref="amqConnectionFactory"
      p:sessionCacheSize="10"/>
<!-- 配置broker的destination-->
<bean id="destination"
      class="org.apache.activemq.command.ActiveMQQueue">
    <constructor-arg value="FOO.TEST"/>
</bean>
<!-- 配置Spring的JmsTemplate -->
<bean id="producerTemplate"
      class="org.springframework.jms.core.JmsTemplate"
      p:connectionFactory-ref="cachedConnectionFactory"
      p:defaultDestination-ref="destination"/>
</beans>

从这个配置中可以看到,这里的配置比Spring整合JMS(消息中间件)文章中介绍的多了一个cachedConnectionFactory配置。我们知道创建和销毁连接是非常消耗资源的,为了解决创建销毁连接带来的资源消耗,我们一般会引入连接池(Pool)或者缓存(Cache)。普通的JmsTemplate的ConnectionFactory每次发送消息时都需要建立新的连接,这样效率是非常低的,所以在具体配置时,我们要尽量用到连接池或缓存,所以这里的配置中加了一个cachedConnectionFactory作为缓存。

二、发送消息

写一个JmsMessageProducer异步发送消息:

@Component
public class JmsMessageProducer {
    private static final Logger logger = LoggerFactory.getLogger(JmsMessageProducer.class);
    @Autowired
    protected JmsTemplate jmsTemplate;
    protected int numberOfMessages = 10;

    public void sendMessages() throws JMSException {
        StringBuilder payload = null;
        for (int i = 0; i < numberOfMessages; ++i) {
            payload = new StringBuilder();
            payload.append("Message [").append(i).append("] sent at: ").append(new Date());
            jmsTemplate.convertAndSend(payload.toString());
            logger.info("Sending message number [" + i + "]");
        }
    }
}

三、接收消息

3.1方式一:写一个JmsMessageConsumer 同步接收消息

@Component
public class JmsMessageConsumer {
    private static final Logger logger = LoggerFactory.getLogger(JmsMessageProducer.class);
    @Autowired
    private JmsTemplate template;
    public void receiveMessages() throws JMSException {
        Message message =template.receive();
        TextMessage textMessage =(TextMessage)template.receive();
        logger.info(textMessage.getText());
    }
}

3.2方式二:写一个JmsMessageListener监听器异步接收消息

@Component
public class JmsMessageListener implements MessageListener{
    private static final Logger logger = LoggerFactory.getLogger(JmsMessageListener.class);
    public void onMessage(Message message) {
        try {
            TextMessage msg = (TextMessage) message;
            logger.info("Consumed message: " + msg.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

写完listener之后还需要在配置文件中配置这个listener:

<!-- 注入我们写的listener -->
<bean id="jmsMessageListener" class="com.heaven.spring.jms.JmsMessageListener"/>

<!-- 配置listener到listener-container当中 -->
<jms:listener-container
        container-type="default"
        connection-factory="cachedConnectionFactory"
        acknowledge="auto">
    <jms:listener destination="FOO.TEST" ref="jmsMessageListener" method="onMessage"/>
</jms:listener-container>

四、测试一下

4.1 测试发送异步消息

写一个JmsMessageProducerTest测试一下发送:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/root-context.xml")
public class JmsMessageProducerTest {
    @Autowired
    JmsMessageProducer jmsMessageProducer;
    @Test
    public void testSend(){
        try {
            jmsMessageProducer.sendMessages();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

看一下运行结果:

这里写图片描述

消息已经异步发送成功,虽然还没有消费者消费,消息就像被成功处理一样。

4.2 测试同步接收消息

写一个JmsMessageConsumerTest 测试一下接收:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/root-context.xml")
public class JmsMessageConsumerTest {
    @Autowired
    JmsMessageConsumer jmsMessageConsumer;
    @Test
    public void testSend(){
        try {
            jmsMessageConsumer.receiveMessages();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

看一下运行结果:

这里写图片描述

我们可以看到消费者接收到一条消息,这条消息正是上面发送者发送的第一条消息。如果我们再运行一遍则会收到第二条消息。如果所有消息都消费完了,broker中没有消息了,此时JmsMessageConsumerTest进程便会挂起一直等待,直到有新消息产生,大家可以试一下。

4.3测试一下异步消息接收

按照上面3.2节写介绍一个JmsMessageListener并将其配置到listener-Container中。此时JmsMessageListener便会实时监听brokerURL="tcp://192.168.134.128:61616"这个端口,一旦有消息产生,便会在onMessage()方法接收到消息。其实此时我们的producer和监听器都在同一个应用中,如果我们再运行producer,可以看到如下结果:
这里写图片描述

通过运行结果可以看到,每当生产者生产消息,监听器便会实时接收到消息。

分享到:
评论

相关推荐

    activemq与spring整合发送jms消息入门实例

    在Java世界中,ActiveMQ和Spring的整合是企业级应用中常见的消息中间件解决方案,用于实现JMS(Java Message Service)消息传递。本教程将深入探讨如何将这两个强大的工具结合在一起,以创建一个简单的发送JMS消息的...

    spring整合jms+activemq

    ActivemQ是Apache软件基金会的一个项目,它实现了JMS规范,提供了一个高效、可靠的中间件服务,用于处理消息队列。本文将深入探讨如何在Spring 3.0中整合JMS与ActivemQ,以及它们在实际应用中的关键知识点。 首先,...

    Spring整合JMS——实现收发消息

    在IT行业中,Spring框架是Java领域最常用的轻量级应用框架之一,而JMS(Java Message Service)则是Java平台上的消息中间件标准,用于应用程序之间的异步通信。本篇文章将详细探讨如何通过Spring框架整合JMS,特别是...

    Spring整合JMS

    在Spring和JMS整合后的应用中,可以使用JmsTemplate类来发送消息,或者注册消息监听器来处理接收到的消息。发布消息时,只需调用JmsTemplate的send方法并指定目的地即可。消息的监听通常通过实现了MessageListener...

    基于spring 消息队列

    在IT行业中,消息队列(Message Queue)是一种重要的中间件技术,它在分布式系统和微服务架构中扮演着至关重要的角色。Spring框架是Java开发领域广泛使用的轻量级开源框架,它提供了对消息队列的支持,使得开发者...

    JMS之Spring +activeMQ实现消息队列

    总的来说,通过Spring与ActiveMQ的整合,我们可以构建出可靠、高效的消息队列系统,从而改善系统的响应时间,提高可扩展性和容错性。同时,Spring提供的抽象层简化了开发过程,使得开发者可以专注于业务逻辑,而不是...

    Spring-JMS把企业消息处理变容易.doc

    Spring JMS 是一个强大的框架,它极大地简化了Java企业级消息处理。它通过提供一套抽象和模板类,使得开发者能够更加便捷地使用Java消息服务(JMS),并与各种JMS提供者,如IBM的WebSphere MQ进行集成。本文将深入...

    SpringBoot整合ActiveMQ(消息中间件)实现邮件发送功能

    在本项目中,"SpringBoot整合ActiveMQ(消息中间件)实现邮件发送功能"是一个典型的企业级应用示例,它展示了如何将SpringBoot框架与Apache ActiveMQ集成,以实现基于消息队列的邮件发送服务。下面我们将详细探讨这个...

    activeMQ-JMS实例

    在本文中,我们将深入探讨如何使用Spring MVC框架与ActiveMQ结合实现JMS(Java Message Service)实例。...通过这个实例,开发者可以进一步掌握异步通信、消息中间件的使用,以及Spring MVC和ActiveMQ的整合技巧。

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

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

    JMS完全实例(八个实例)

    在JMS中,队列保证消息的顺序传递,每个消息只能被一个消费者接收,适合一对一通信。而主题支持发布/订阅模式,消息可以被多个订阅者同时接收,适合一对多通信。实例中会展示这两种模型的使用场景和差异。 7. **...

    spring+MQ消息队列

    3. **消息生产者**:在Spring应用中,我们可以创建一个`JmsTemplate`实例,用于发送消息到队列或主题。`JmsTemplate`提供了多种发送消息的方法,如`convertAndSend`,可以自动将对象转换为消息体。 4. **消息消费者...

    Spring整合ActiveMQ简单实例

    Spring 框架与 ActiveMQ 的整合,使得开发者能够轻松地在 Spring 应用程序中使用消息中间件。本文将详细阐述如何实现这一整合,以及其中涉及的关键知识点。 首先,**ActiveMQ** 是 Apache 开源项目,是基于 Java 的...

    采用Spring整合activeMQ与quartz的JMS数据同步实例

    在这个实例中,我们将探讨如何利用Spring框架整合ActiveMQ(一个流行的开源消息代理)和Quartz(一个广泛使用的作业调度库)来实现JMS(Java消息服务)数据同步。这个方案尤其适用于大型分布式系统,它能够确保即使...

    weblogic与jms+spring

    JMS 是一个为Java平台设计的消息中间件接口,它允许应用程序通过消息传递进行通信,而Spring框架则提供了一种便捷的方式来管理应用程序的配置和服务,包括对JMS的集成。 **WebLogic的安装与配置:** 1. 下载...

    Spring和ActiveMQ的整合实例源码

    本实例“Spring和ActiveMQ的整合实例源码”旨在展示如何将Spring框架与ActiveMQ结合使用,利用JMS进行高效的消息传递。这个实例适合那些希望学习或深入了解Spring框架如何与消息中间件集成的开发者。它基于Spring的...

    spring+jms+activemq

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

    activemq整合spring完整实例代码(内含所有相关jar包)

    通过这个实例,开发者不仅可以学习如何整合ActiveMQ和Spring,还能了解到如何在实际项目中应用消息队列,提升系统性能。同时,这也是对容器化部署的一种实践,有助于理解和掌握Web应用服务器的使用。

    Spring整合ActiveMQ超级详细实例

    在本文中,我们将深入探讨如何将Spring框架与ActiveMQ消息中间件进行集成,提供一个超级详细的实例。这个实例是基于Java编程语言,利用Spring的JMS(Java消息服务)支持和ActiveMQ作为消息代理,同时在Tomcat服务器...

Global site tag (gtag.js) - Google Analytics