`
sunbin
  • 浏览: 354227 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

spring 快速搭建JMS

 
阅读更多

一、简介

JMS(Java Message Service) java异步消息服务

1.JMS是什么?
jms是一个标准,定义了使用消息的通用API,类似于jdbc这样用户可以用同样的接口操作不同的消息服务实现

2.JMS的应用场景?
jms代表应用之间的异步通信,对应的有同步通信,所谓同步通信就是当消息发出后,客户端需要一直等到服务器响应,即使服务器只是返回了一个空。异步消息类似于寄信,当我们把信件放进邮筒并假定它肯定能正确被投递,我们不用等着回信,甚至不用关心信件什么时候寄出去,并且我们相信信件肯定会得到正确的处理!异步消息就是我们将消息发出给消息代理服务器,并假定消息肯定能够送到指定目的地,相信消息肯定能得到处理。

3.JMS涉及的概念?

  • jms是一个规范,既然是规范,那肯定有实现规范的服务比如(ActiveMQ)
  • 消息代理服务器(类似于邮局)
  • 目的地(类似于收信地址)包含点对点的queue和发布/订阅的topic
  • 我们将消息发给代理服务器,由代理服务器发送到指定的目的地,就是这么简单!

4.消息队列和发布订阅介绍
消息队列就是点对点,当消息发出后会有一个服务可以接收到,但关注的服务不只一个,发送方不关心是谁接收了消息。这样做的好处是我们可以通过添加更多的接收者来提升性能

发布订阅,当消息发布后,所有订阅了该消息主题的用户都可以接收到消息,但发送者并不知道谁订阅了自己的消息,想象一个场景,当一个新员工来到公司,HR部门会为该员工建立一些档案等,财务部门会为该员工登记工资信息,后勤部会给该员工分配办公用品等等,也就是说,同样的消息当不同的应用获取后可以进行不同的处理。


二、从一个helloworld开始

不要急按着步骤一步步来。
第一步、下载ActiveMQ(下载地址就自己去网上搜吧!)
第二步、解压后,在如图所示的bin目录下启动代理服务器


启动代理服务器


第三步、将解压后的lib目录下的activemq-broker-5.9.1.jar和activemq-client-5.9.1.jar拷进你的classpath下,或者在你的pom文件中引入对应版本的依赖

           <dependency>
                <groupId>org.apache.activemq</groupId>
                <artifactId>activemq-broker</artifactId>
                <version>5.9.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.activemq</groupId>
                <artifactId>activemq-client</artifactId>
                <version>5.9.1</version>
            </dependency>

第四步、发送方代码(生产者)

//创建连接工厂 ActiveMQ服务默认的端口号是:61616
 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        Connection conn = null;
        Session session = null;
        try {
       //创建连接
            conn = connectionFactory.createConnection();
            conn.start();
      //创建会话
            session = conn.createSession(false,session.AUTO_ACKNOWLEDGE);
      //创建目的地(点对点目的地,发布订阅是(ActiveMQTopic对象))
            Destination destination = new ActiveMQQueue("gamelife.alert.queue");
      //创建消息发送者
            MessageProducer producer = session.createProducer(destination);
        //创建文本消息
            TextMessage message = new ActiveMQTextMessage();
            message.setText("Hello world!");
        //发送消息
            producer.send(destination,message);
        } catch (JMSException e) {
            e.printStackTrace();
        } finally {
        //资源不要忘了关闭
            try {
                if (conn != null) {
                    conn.close();
                }
                if (session != null) {
                    session.close();
                }
            } catch (JMSException e) {
                throw new RuntimeException(e);
            }
        }

第五步、接收方代码(消费者)

        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        Connection conn = null;
        Session session = null;
        try {
            conn = connectionFactory.createConnection();
            conn.start();
            session = conn.createSession(false,session.AUTO_ACKNOWLEDGE);
            Destination destination = new ActiveMQQueue("gamelife.alert.queue");
          //创建消息接收者
            MessageConsumer consumer = session.createConsumer(destination);
          //接收消息
            TextMessage message = (TextMessage) consumer.receive();
            System.out.println(message.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                }
                if (session != null) {
                    session.close();
                }
            } catch (JMSException e) {
                throw new RuntimeException(e);
            }
        }

这样就完成了一个简单的helloworld

三、利用spring的JmsTemplate消灭重复代码

第一步、配置ConnectionFactory、和JmsTemplate

    <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616"/>
    </bean>
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory"/>
    </bean>

第二步、发送消息代码

       ApplicationContext context = new ClassPathXmlApplicationContext("/conf/applicationContext.xml");
        JmsTemplate jmsTemplate = (JmsTemplate) context.getBean("jmsTemplate");
//可以通过convertAndSend()直接发送实现了序列化接口的对象,第一个参数是目的地,默认是消息队列如果希望是发布订阅的主题可以传一个对象
        jmsTemplate.convertAndSend("gamelife.alert.queue",new User("username","password"));

第三步、接收消息

        ApplicationContext context = new ClassPathXmlApplicationContext("/conf/applicationContext.xml");
        JmsTemplate jmsTemplate = (JmsTemplate) context.getBean("jmsTemplate");
        System.out.println(jmsTemplate==null);
        User user= (User) jmsTemplate.receiveAndConvert("gamelife.alert.queue");
        System.out.println(user.getUsername());

完成了。

四、利用spring创建消息驱动的POJO

首先要知道之前的操作有什么不好呢?就是每次接收方去取消息的时候recive方法会阻塞,知道有消息到达为止,这样不是我们想要的,我们需要一个基于事件驱动的消息系统,就是说当有消息的时候会自动调用我们的方法。
第一步、创建用于监听消息的对象

//仅仅是一个简单的实现了MessageListener接口的POJO
public class JmsHandler implements MessageListener{

    public void onMessage(Message message) {
        try {
            User user = (User) ((ObjectMessage) message).getObject();
            System.out.println(user.getUsername());
            System.out.println(user.getPassword());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

第二步、配置消息监听对象**

<bean id="jmsHandler" class="jmslistener.JmsHandler"></bean>
<jms:listener-container>
        <jms:listener destination="gamelife.alert.queue" ref="jmsHandler" />
    </jms:listener-container>

启动服务器后,当有消息到来的时候会自动调用对应的方法

到这里就算结束了,快去动手搭建自己的JMS服务器吧,发布订阅模型就不敲重复的代码了只不过是Destination不同(ActiveMQTopic),对象不同而已,自己跟着IDE的提示走就没问题。

 

 

分享到:
评论

相关推荐

    Spring整合JMS.doc

    Spring Boot提供了自动配置的能力,使得开发者无需过多关注配置细节,就能快速搭建起基于JMS的消息处理系统。然而,在高并发、高可用性等场景下,还需要考虑消息的持久化、重试策略以及错误处理机制,以确保消息的...

    Spring+mybatis环境搭建

    Spring+MyBatis环境搭建 本篇资源摘要信息主要介绍了如何搭建Spring 3.0.6 + MyBatis 3.0.6环境。...本篇资源摘要信息提供了详细的 Spring 3.0.6 + MyBatis 3.0.6 环境搭建指南,旨在帮助读者快速搭建开发环境。

    Spring整合JMS

    在实际应用中,我们可以结合Spring Boot和Spring JMS,利用其自动配置特性快速搭建JMS应用。对于源码探索,可以深入Spring框架的JMS模块,了解其实现细节和工作原理。而"工具"标签可能暗示了在实际开发中,可能还会...

    Spring快速入门教程

    ### Spring快速入门教程知识点详解 #### 一、理论知识概览 **1. 依赖注入与控制反转** - **依赖注入(Dependency Injection, DI)**:在Spring框架中,依赖注入是一种设计模式,用于实现控制反转。它允许在运行...

    Struts2+Spring3.0+MyBatis3.0平台搭建spring+json+gson+mysql,经典版本spring3.0+,完整架包

    标题中的"Struts2+Spring3.0+MyBatis3.0平台搭建"涉及到的是一个常见的企业级Java Web开发框架组合。这个平台基于Struts2作为MVC框架,Spring3.0作为核心容器,负责依赖注入(DI)和面向切面编程(AOP),而MyBatis...

    spring5 框架 中文文档_spring-framework-5-doc-cn.zip

    虽然Spring5文档主要聚焦于核心框架,但Spring Boot是基于Spring的快速开发工具,它简化了Spring应用的初始搭建和配置。Spring Boot默认配置了很多常见需求,使得开发者可以快速构建独立运行的应用。 五、Spring...

    ssm项目框架搭建(springmvc+spring+mybatis)

    Spring还提供了大量的企业级服务,如数据访问、JMS、邮件服务等。 MyBatis是一个优秀的持久层框架,它简化了数据库操作。MyBatis将SQL语句与Java代码分离,允许开发者在XML配置文件或注解中编写SQL,提高了SQL的...

    Spring全家桶知识笔记.pdf

    Spring全家桶是企业级应用开发中广受欢迎的解决方案,它包括了一系列的模块和工具,可以...在不断的发展中,Spring全家桶还包含了Spring Boot、Spring Cloud等更多模块,帮助开发者快速搭建和部署基于微服务的应用。

    spring 整合 activemq 生产者和消费者 案例源码

    Spring整合ActiveMQ是Java消息服务(JMS)在Spring框架中的应用,用于实现生产者与消费者的解耦。...通过理解上述步骤,开发者可以快速搭建起生产者和消费者的示例,进一步探索JMS在实际项目中的应用。

    spring framework4.0.3,及项目搭建整合包

    在描述中提到的"项目搭建整合包"通常包含了一系列预配置好的文件和配置,帮助开发者快速启动一个新的Spring项目。这个包可能包括了Spring的jar包,web.xml配置文件,Spring的配置文件如applicationContext.xml,以及...

    spring+cxf 整合jar包

    在下载的"spring3+cxf2.7 整合jar包"中,可能包含了Spring 3.x版本和CXF 2.7版本的库文件,以及相关的示例配置文件,这些可以帮助开发者快速搭建和运行一个Spring+CXF的环境。使用时,开发者需要根据自己的项目需求...

    Spring框架jar包全

    4. **Spring Context**:这是Spring框架的上下文模块,它扩展了Core Container的概念,引入了环境感知能力,如bean的国际化、事件传播以及对其他Spring模块(如JDBC、JMS、JMX等)的支持。 5. **Spring JDBC**:...

    关于spring的资料关于spring的资料

    Spring Boot是为了简化Spring应用的初始搭建以及开发过程而诞生的。它默认配置了许多常见的功能,如嵌入式Web服务器、健康检查端点、自动配置等,让开发者能够快速启动和运行项目。 7. **Spring Security** ...

    csdn spring包下载

    7. **Spring Boot**:虽然不直接在“spring-jars”中,但Spring Boot是Spring的一个重要组成部分,它简化了Spring应用的初始搭建以及开发过程,通过自动配置和起步依赖,可以快速创建独立的、生产级别的基于Spring的...

    Spring+AOP全套jar包

    压缩包中的“lib (1)”很可能包含了所有这些必要的jar文件,确保了开发者可以快速搭建一个支持Spring和AOP的开发环境,进行基础的Spring应用开发。 总的来说,这个“Spring+AOP全套jar包”是一个非常实用的开发资源...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版).pdf

    - Spring Boot提供了一种快速搭建Spring应用的方法,它默认配置了很多常用的特性,如内嵌的Tomcat服务器、自动配置等功能。 #### 2. **使用Spring Security进行安全控制** - Spring Security是一个强大的安全框架,...

    Java Spring入门简介

    Java Spring框架是一个非常流行的开源框架,主要用于简化Java应用的开发。Spring为Java提供了全面的编程和配置模型,从而可以...通过以上内容的学习和实践,可以快速入门并掌握Spring框架的基本使用和相关开发技巧。

    spring-framework-reference

    - **分发 ZIP 文件**:Spring 提供 ZIP 分发包,便于没有构建工具的环境快速搭建开发环境。 - **日志**:Spring 支持多种日志框架,包括 Commons Logging、SLF4J 和 Log4J。 #### 二、Spring Framework 4.x 新功能...

    spring绝佳入门教程.pdf

    Spring Boot简化了Spring应用的初始搭建和配置过程,它内置了Tomcat服务器,支持自动配置,以及“起步依赖”功能,让开发者能够快速启动项目。 6. **Spring Data** Spring Data提供了与各种持久化技术(如JPA、...

Global site tag (gtag.js) - Google Analytics