千家信息网

JMS消息activemq的使用分析

发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,这篇文章将为大家详细讲解有关JMS消息activemq的使用分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一. 认识JMS1.1 概述对于JMS,
千家信息网最后更新 2025年02月03日JMS消息activemq的使用分析

这篇文章将为大家详细讲解有关JMS消息activemq的使用分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

一. 认识JMS

1.1 概述

对于JMS,百度百科,是这样介绍的:JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

简短来说,JMS是一种与厂商无关的 API,用来访问消息收发系统消息。它类似于JDBC(Java Database Connectivity),提供了应用程序之间异步通信的功能。

JMS1.0是jsr 194里规定的规范(关于jsr规范,请点击)。目前最新的规范是JSR 343,JMS2.0。

好了,说了这么多,其实只是在说,JMS只是sun公司为了统一厂商的接口规范,而定义出的一组api接口。

1.2 JMS体系结构

描述如下:

  • JMS提供者(JMS的实现者,比如activemq jbossmq等)

  • JMS客户(使用提供者发送消息的程序或对象,例如在12306中,负责发送一条购票消息到处理队列中,用来解决购票高峰问题,那么,发送消息到队列的程序和从队列获取消息的程序都叫做客户)

  • JMS生产者,JMS消费者(生产者及负责创建并发送消息的客户,消费者是负责接收并处理消息的客户)

  • JMS消息(在JMS客户之间传递数据的对象)

  • JMS队列(一个容纳那些被发送的等待阅读的消息的区域)

  • JMS主题(一种支持发送消息给多个订阅者的机制)

1.3. JMS对象模型

  • 连接工厂(connectionfactory)客户端使用JNDI查找连接工厂,然后利用连接工厂创建一个JMS连接。

  • JMS连接 表示JMS客户端和服务器端之间的一个活动的连接,是由客户端通过调用连接工厂的方法建立的。

  • JMS会话 session 标识JMS客户端和服务端的会话状态。会话建立在JMS连接上,标识客户与服务器之间的一个会话进程。

  • JMS目的 Destinatio 又称为消息队列,是实际的消息源

  • 生产者和消费者

  • 消息类型,分为队列类型(优先先进先出)以及订阅类型

二. ActiveMQ安装和思路

2.1. ActiveMQ的安装

从官网下载安装包, http://activemq.apache.org/download.html 赋予运行权限 chmod +x,windows可以忽略此步 运行 ./active start | stop 启动后,activeMQ会占用两个端口,一个是负责接收发送消息的tcp端口:61616,一个是基于web负责用户界面化管理的端口:8161。这两个端口可以在conf下面的xml中找到。http服务器使用了jettry。这里有个问题是启动mq后,很长时间管理界面才可以显示出来。

==》启动MQ服务器:

根据操作系统不同,进入相应win64/win32位目录,双击activemq.bat启动MQ。

ActiveMQ默认启动时,启动了内置的jetty服务器,提供一个用于监控ActiveMQ的admin应用 进入ActionMQ服务监控地址:浏览器输入http://127.0.0.1:8161/admin

2.2 整合思路

Spring最厉害的地方就是它的Bean了,还有它特有的IOC(控制反转)和AOP(面向切面编程)技术。有了这些,我们就可以不用new关键字构造对象,同时,可以方便地使用注入往类中的属性进行初始化。如果你编写过ActiveMQ之类的JMS应用程序,无论对于消息的生产者还是消费者,最重要的接口有以下两个: 1.ConnectionFactory 2.Destination

ConnectionFactory是一切的基础,有了它才有了Connection,然后才有Session,只有通过Session对象,我们才能创建消息队列、构建生产者/消费者,继而发送/接收消息。 Destination是一切的归宿,它就像总线一样,生产者发出消息要发到它上面,消费者取消息也要从这上面取。

试想,如果这一切都能借助Spring强大的Bean管理的话,我们在编写程序的时候会更加的方便简洁。幸运的是,ActiveMQ官方提供了完美的Spring框架支持,一切只需要在xml文件中配置即可~

Spring官方提供了一个叫JmsTemplate的类,这个类就专门用来处理JMS的,在该类的Bean配置标签中有两个属性connectionFactory-ref和defaultDestination-ref正好对应JMS中的ConnectionFactory和Destination,如果你有兴趣查看源码的话,就可以发现JmsTemplate帮我们做了大量创建的工作,我们只需要用它来进行收发信息就ok了,而ActiveMQ官方也提供了对应的实现包。

三、Spring 整合

3.1 xml配置方式一

                                                                                                                                                                                                                                                                        

3.2 xml配置方式二:

                                                                                                        classpath:conf/spring-config.properties                                                                                                                                                                                                                                                                                                                                                                                                                
import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;import org.springframework.stereotype.Component;@Component(value = "simpleMsgListener")public class SimpleMsgListener implements MessageListener {        //收到信息时的动作        @Override        public void onMessage(Message message) {                TextMessage textMessage = (TextMessage) message;                try {                        System.out.println("收到的信息:" + textMessage.getText());                } catch (JMSException e) {                        e.printStackTrace();                }        }}

四、spring boot配置

  • spring boot jsm官网

  • springboot与ActiveMQ整合

4.1、引入依赖配置

                                      org.springframework.boot                        spring-boot-starter-activemq                                                        org.apache.activemq                        activemq-pool                

4.2 application.properties配置

# ActiveMQ--------------------------------------------------------------------------------------------------------------# Specify if the default broker URL should be in memory. Ignored if an explicit broker has been specified.#spring.activemq.in-memory=false# URL of the ActiveMQ broker. Auto-generated by default. For instance `tcp://localhost:61616`spring.activemq.broker-url=tcp://127.0.0.1:61616# Login user of the broker.spring.activemq.user=admin# Login password of the broker.spring.activemq.password=admin# Trust all packages.#spring.activemq.packages.trust-all=false# Comma-separated list of specific packages to trust (when not trusting all packages).#spring.activemq.packages.trusted=# See PooledConnectionFactory.#spring.activemq.pool.configuration.*=# Whether a PooledConnectionFactory should be created instead of a regular ConnectionFactory.spring.activemq.pool.enabled=true# Maximum number of pooled connections.spring.activemq.pool.max-connections=50# Connection expiration timeout in milliseconds.spring.activemq.pool.expiry-timeout=10000# Connection idle timeout in milliseconds.spring.activemq.pool.idle-timeout=30000spring.jms.pub-sub-domain=false

4.3 boot类配置

import javax.jms.Queue;import javax.jms.Topic;import org.apache.activemq.ActiveMQConnectionFactory;import org.apache.activemq.command.ActiveMQQueue;import org.apache.activemq.command.ActiveMQTopic;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.jms.config.DefaultJmsListenerContainerFactory;import org.springframework.jms.config.JmsListenerContainerFactory;@Configurationpublic class ActiveMQConfig {        @Value("${queueName}")        private String queueName;        @Value("${topicName}")        private String topicName;        @Value("${spring.activemq.user}")        private String usrName;        @Value("${spring.activemq.password}")        private String password;        @Value("${spring.activemq.broker-url}")        private String brokerUrl;                /**         * 

@describe: 配置队列

*

@author: whh

*

@date: 2019年8月9日 下午5:56:22

* @return */ @Bean public Queue queue() { return new ActiveMQQueue(queueName); } /** *

@describe:配置主题

*

@author: whh

*

@date: 2019年8月9日 下午5:56:40

* @return */ @Bean public Topic topic() { return new ActiveMQTopic(topicName); } /** *

@describe:连接工厂

*

@author: whh

*

@date: 2019年8月9日 下午5:57:14

* @return */ @Bean public ActiveMQConnectionFactory connectionFactory() { return new ActiveMQConnectionFactory(usrName, password, brokerUrl); } /** *

@describe: 监听队列bean

*

@author: whh

*

@date: 2019年8月9日 下午5:57:43

* @param connectionFactory * @return */ @Bean public JmsListenerContainerFactory jmsListenerContainerQueue(ActiveMQConnectionFactory connectionFactory) { DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory(); bean.setConnectionFactory(connectionFactory); return bean; } /** *

@describe:监听主题 bean

*

@author: whh

*

@date: 2019年8月9日 下午5:58:17

* @param connectionFactory * @return */ @Bean public JmsListenerContainerFactory jmsListenerContainerTopic(ActiveMQConnectionFactory connectionFactory) { DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory(); //设置为发布订阅方式, 默认情况下使用的生产消费者方式 bean.setPubSubDomain(true); bean.setConnectionFactory(connectionFactory); return bean; }}

五、发送者和接收者使用

5.1 发送者

import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.Session;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jms.core.JmsTemplate;import org.springframework.jms.core.MessageCreator;import org.springframework.stereotype.Service;@Servicepublic class JmsSendDemo {        private  static final Logger LOGGER = LoggerFactory.getLogger(JmsSendDemo.class);            @Autowired        private JmsTemplate jmsTemplate;                public void execute(){                LOGGER.debug("执行定时任务-----------------直接违规数据定时:下发至医院端首页进行展示-----------------");                Destination destination = (Destination) AppContext.getBean("queue_test");                jmsTemplate.convertAndSend("mailbox", new Email("info@example.com", "Hello"));                //启动另一个方法                boolean flag=true;                LOGGER.debug("执行定时任务结束------------------------------");        }                        public void sendMessage(Destination destination,final String message) {                LOGGER.debug("发送消息到AMQ,消息内容为:"+message);                jmsTemplate.send(destination, new MessageCreator() {                        @Override                        public Message createMessage(Session session) throws JMSException {                                return session.createTextMessage(message);                        }                });        }}

5.1 接收者

import org.springframework.jms.annotation.JmsListener;import org.springframework.stereotype.Component;@Componentpublic class Receiver {    @JmsListener(destination = "mailbox", containerFactory = "myFactory")    public void receiveMessage(Email email) {        System.out.println("Received <" + email + ">");    }}

关于JMS消息activemq的使用分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

0