启动activemq_「Java」 - SpringBoot amp; ActiveMQ

一、消息队列

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件。

目前在生产环境中使用较多的消息队列有ActiveMQ、RabbitMQ、Kafka、RocketMQ等。

A、特性

  • 异步性:将耗时的同步操作以消息的方式进行异步化处理,减少了同步等待的时间;
  • 松耦合:消息队列减少了服务之间的耦合性,不同的服务可以通过消息队列进行通信,而不用关心彼此的实现细节,只要定义好消息的格式就行;
  • 分布式:通过对消费者的横向扩展,降低了消息队列阻塞的风险,以及单个消费者产生单点故障的可能性;
  • 可靠性:消息队列一般会把接收到的消息存储到本地硬盘上,这样即使应用挂掉或者消息队列本身挂掉,消息也能够重新加载。

B、JMS规范

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

JMS的消息机制有2种模型,一种是Point to Point,表现为队列的形式,发送的消息,只能被一个接收者取走;另一种是Topic,可以被多个订阅者订阅,类似于群发。

ActiveMQ就是JMS的一个实现。

二、ActiveMQ介绍

ActiveMQ是Apache软件基金下的一个开源软件,它遵循JMS 1.1规范,是消息驱动中间件软件。它为企业消息传递提供高可用、出色性能、可扩展、稳定和安全保障。ActiveMQ使用Apache许可协议,因此,任何人都可以使用和修改它而不必反馈任何改变。

ActiveMQ的目标是在尽可能多的平台和语言上提供一个标准的,消息驱动的应用集成。ActiveMQ实现JMS规范并在此之上提供大量额外的特性。ActiveMQ支持队列和订阅两种模式的消息发送。

Spring Boot提供了ActiveMQ组件spring-boot-starter-activemq,用来支持ActiveMQ在Spring Boot体系内使用。

A、ActiveMQ安装

1、下载安装启动

# 安装JDK并配置环境# 下载activemq
wget http://archive.apache.org/dist/activemq/5.12.2/apache-activemq-5.12.2-bin.tar.gz# 解压安装
cd /usr/local/apache-activemq-5.12.2/bin# 启动ActiveMQ
./activemq start# web控制台
http://192.168.240.131:8161
admin/admin

2、安全配置

安装完成ActiveMQ后,任何连接到ActiveMQ的程序都可以创建和消费队列,可以通过修改配置文件conf/activemq.xml来加入身份验证,在文件的borker标签中加入:

<plugins> <simpleAuthenticationPlugin> <users> <authenticationUser username="admin" password="admin" groups="users,admins"/> </users> </simpleAuthenticationPlugin> 
</plugins>

控制台账号密码,修改conf/jetty.xml,确保authenticate的值是true。

<bean id="securityConstraint" class="org.eclipse.jetty.util.security.Constraint"> <property name="name" value="BASIC" /> <property name="roles" value="admin" /> <property name="authenticate" value="true" /> 
</bean>

登陆管控台的帐号和密码在conf/jetty-realm.properties文件。

# Defines users that can access the web (console, demo, etc.)
# username: password [,rolename ...]
admin: admin, admin

重启生效。

A、相关依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

B、配置文件

在使用ActiveMQ时有两种使用方式,一种是使用独立安装的ActiveMQ,在生产环境推荐使用这种;另一种是使用基于内存ActiveMQ ,在调试阶段建议使用这种方式。

# 基于内存 
ActiveMQspring.activemq.in-memory=true# 不适应连接池
spring.activemq.pool.enabled=false# 独立安装ActiveMQ
#spring.activemq.broker-url=tcp://10.255.242.168:61616
#spring.activemq.user=admin
#spring.activemq.password=admin

三、队列(Queue)

队列发送的消息,只能被一个消费者接收。

A、创建队列

@Configuration
public class ActiveMqConfig
{@Beanpublic Queue queue(){return new ActiveMQQueue("isisiwish.test.queue");}
}

使用定义了队列queue命名为isisiwish.test.queue。

B、消息生产者

@Slf4j
@Component
public class Producer
{@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;@Autowiredprivate Queue queue;public void sendQueue(String msg){log.info("send queue msg : {}", msg);this.jmsMessagingTemplate.convertAndSend(this.queue, msg);}
}

JmsMessagingTemplate是Spring提供发送消息的工具类,使用JmsMessagingTemplate和创建好的queue对消息进行发送。

C、消息消费者

@Slf4j
@Component
public class ConsumerA
{@JmsListener(destination = "isisiwish.test.queue")public void receiveQueue(String text){log.info("ConsumerA queue msg : {}", text);}
}@Slf4j
@Component
public class ConsumerB
{@JmsListener(destination = "isisiwish.test.queue")public void receiveQueue(String text){log.info("ConsumerB queue msg : {}", text);}
}

使用注解@JmsListener(destination = "isisiwish.test.queue"),表示此方法监控了名为isisiwish.test.queue的队列。当队列isisiwish.test.queue中有消息发送时会触发此方法的执行,text为消息内容。

D、测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class MqActivemqQueueApplicationTests
{@Autowiredprivate Producer producer;@Testpublic void sendSimpleQueueMessage() throws InterruptedException{this.producer.sendQueue("Test queue message");}@Testpublic void send100QueueMessage() throws InterruptedException{for (int i = 0; i < 100; i++){this.producer.sendQueue("Test queue message " + i);}Thread.sleep(1000L);}
}

当有多个消费者监听一个队列时,消费者会自动均衡负载的接收消息,并且每个消息只能有一个消费者所接收。

PS:控制台输出javax.jms.JMSException: peer (vm://localhost#1) stopped.报错信息可以忽略。

四、广播(Topic)

广播发送的消息,可以被多个消费者接收。

A、创建Topic

@Configuration
public class ActiveMqConfig
{@Beanpublic Topic topic(){return new ActiveMQTopic("isisiwish.test.topic");}
}

B、消息生产者

@Slf4j
@Component
public class ConsumerA
{@JmsListener(destination = "isisiwish.test.topic")public void receiveTopic(String text){log.info("ConsumerA topic msg : {}", text);}
}@Slf4j
@Component
public class ConsumerB
{@JmsListener(destination = "isisiwish.test.topic")public void receiveTopic(String text){log.info("ConsumerB topic msg : {}", text);}
}

C、消息消费者

@Slf4j
@Component
public class Producer
{@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;@Autowiredprivate Topic topic;public void sendTopic(String msg){log.info("send queue msg : {}", msg);this.jmsMessagingTemplate.convertAndSend(this.topic, msg);}
}

D、测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class MqActivemqTopicApplicationTests
{@Autowiredprivate Producer producer;@Testpublic void sendSimpleTopicMessage() throws InterruptedException{this.producer.sendTopic("Test Topic message");Thread.sleep(1000L);}
}

广播(Topic)是一个发送者多个消费者的模式,两个消费者都收到了发送的消息。

五、同时支持队列(Queue)和广播(Topic)

Spring Boot集成ActiveMQ的项目默认只支持队列或者广播中的一种,通过配置项 spring.jms.pub-sub-domain的值来控制,true为广播模式,false为队列模式,默认情况下支持队列模式。

如果需要在同一项目中既支持队列模式也支持广播模式,可以通过DefaultJmsListenerContainerFactory创建自定义的JmsListenerContainerFactory实例,之后在@JmsListener注解中通过containerFactory属性引用它。

分别创建两个自定义的JmsListenerContainerFactory实例,通过pubSubDomain来控制是支持队列模式还是广播模式。

@Configuration
@EnableJms
public class ActiveMqConfig
{@Bean("queueListenerFactory")public JmsListenerContainerFactory<?> queueListenerFactory(ConnectionFactory connectionFactory){DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setPubSubDomain(false);return factory;}@Bean("topicListenerFactory")public JmsListenerContainerFactory<?> topicListenerFactory(ConnectionFactory connectionFactory){DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setPubSubDomain(true);return factory;}@Beanpublic Queue queue(){return new ActiveMQQueue("isisiwish.test.queue");}@Beanpublic Topic topic(){return new ActiveMQTopic("isisiwish.test.topic");}
}

在消费者接收的方法中,指明使用containerFactory接收消息。

@Slf4j
@Component
public class ConsumerA
{@JmsListener(destination = "isisiwish.test.queue", containerFactory = "queueListenerFactory")public void receiveQueue(String text){log.info("ConsumerA queue msg : {}", text);}@JmsListener(destination = "isisiwish.test.topic", containerFactory = "topicListenerFactory")public void receiveTopic(String text){log.info("ConsumerA topic msg : {}", text);}
}

常用配置。

# 基于内存的ActiveMQ
#spring.activemq.in-memory=true
#spring.activemq.pool.enabled=false# 独立安装的ActiveMQ
spring.activemq.broker-url=tcp://10.255.242.168:61616
spring.activemq.user=admin
spring.activemq.password=admin# 结束之前等待的时间
#spring.activemq.close-timeout=15s# 等待消息发送响应的时间,设置为0永远等待
spring.activemq.send-timeout=0# 默认情况下ActiveMQ提供的是queue模式,若要使用topic模式需要配置下面配置
#spring.jms.pub-sub-domain=true#账号
# spring.activemq.user=admin# 密码
# spring.activemq.password=admin# 是否信任所有包
#spring.activemq.packages.trust-all=# 要信任的特定包(逗号分隔)
#spring.activemq.packages.trusted=# 当连接请求和满时是否阻塞,设置false会抛出JMSException异常
#spring.activemq.pool.block-if-full=true# 如果池满,则在抛出异常前阻塞时间
#spring.activemq.pool.block-if-full-timeout=-1ms# 是否在启动时创建连接,可以在启动时用于热加载
#spring.activemq.pool.create-connection-on-startup=true# 是否用Pooledconnectionfactory代替普通的ConnectionFactory
#spring.activemq.pool.enabled=false# 连接过期超时
#spring.activemq.pool.expiry-timeout=0ms# 连接空闲超时
#spring.activemq.pool.idle-timeout=30s# 连接池最大连接数
#spring.activemq.pool.max-connections=1# 每个连接的有效会话的最大数目。
#spring.activemq.pool.maximum-active-session-per-connection=500# 当有JMSException时尝试重新连接
#spring.activemq.pool.reconnect-on-exception=true# 空闲连接清除线程之间运行的时间,当为负数时,没有空闲连接驱逐线程运行
#spring.activemq.pool.time-between-expiration-check=-1ms# 是否只使用一个MessageProducer
#spring.activemq.pool.use-anonymous-producers=true

ab49cc5513a91cd1c2cf566ef85e81a0.png

六、总结

消息中间件广泛应用在大型互联网架构中,利用消息中间件队列和广播各自的特性可以支持很多业务,比如群发发送短信、给单个用户发送邮件等。

ActiveMQ是一款非常流行的消息中间件,它的特点是部署简单、使用方便,比较适合中小型团队。Spring Boot提供了集成ActiveMQ对应的组件,在Spring Boot中使用ActiveMQ只需要添加相关注解即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

永不休眠怎么设置_电脑休眠后应该怎样唤醒?

可能有朋友会碰到这种情况&#xff0c;电脑屏幕显示正在休眠&#xff0c;而且不停的转圈&#xff0c;这是怎么回事&#xff0c;如何唤醒?下面让坚哥为大家分析一下吧。电脑开机显示休眠一般根据以下几种情况进行处理&#xff1a;1、正常电脑休眠&#xff1a;一般的是按一下电源…

配置ssl证书_Mysql配置ssl证书

本环境基于mysql5.6配置&#xff0c;通过openssl生成证书进行配置一、确认环境信息1、查看数据库版本mysql> select version();-----------| version() |-----------| 5.6.36 |-----------2、查看数据库是否支持ssl配置mysql> show variables like have%ssl%;-----------…

如何让图片充满excel单元格_如何在Excel单元格建立下拉菜单

对于一些常用的数据我们往往会希望能够尽量快速的输入&#xff0c;下拉菜单就是一个最简单的解决办法。那么如何实现下拉菜单呢&#xff1f;跟随以下步骤&#xff0c;建立属于自己的下拉菜单吧&#xff01;如何建立下拉菜单&#xff1f;一、确定内容&#xff1a;在单元格中&…

pgsql中float4导致java程序精度丢失_Java基础系列02

注释Java中支持三种注释&#xff1a;1.单行注释以//开始换行结束。2.多行注释以/*开始&#xff0c;以*/结束。3.说明注释以/**开始&#xff0c;以*/结束。关键字关键字&#xff1a;是指在程序中&#xff0c;Java已经定义好的单词&#xff0c;具有特殊含义。例如上篇文章中Hello…

用idea建立jsp项目_用idea创建maven项目,配置tomcat详解

用idea创建maven项目&#xff0c;配置tomcat详解&#xff0c;电脑上得有jdk1.7&#xff0c;或者1.8&#xff0c;然后就是maven3.x吧&#xff0c;再有就是tomcat7以上下面就直接开始看图啦&#xff1a;这个我刚刚开始没注意细看&#xff0c;原来web app 的骨架有2个呢&#xff0…

求立方根_初一数学立方根考点详解,立足基础,把握题型,学会方法

初一数学实数部分&#xff0c;平方根和立方根这两部分的知识点比较的基础&#xff0c;但是考试中却是经常会考&#xff0c;并且有很多的“陷阱”&#xff0c;也是让学生猝不及防&#xff0c;今天我和同学们继续学习交流立方根的知识点&#xff0c;通过详解考点&#xff0c;帮助…

mysql双主数据一致性_MySQL双主一致性架构优化 | 架构师之路-阿里云开发者社区...

一、双主保证高可用MySQL数据库集群常使用一主多从&#xff0c;主从同步&#xff0c;读写分离的方式来扩充数据库的读性能&#xff0c;保证读库的高可用&#xff0c;但此时写库仍然是单点。在一个MySQL数据库集群中可以设置两个主库&#xff0c;并设置双向同步&#xff0c;以冗…

spool导出姓名中文乱码_MySQL不同字符集转化标准—7步实现,杜绝乱码!

引言作为资深的DBA程序员&#xff0c;在工作中是否会遇到更这样的情况呢&#xff1f;原有数据库的字符集由于前期规划不足&#xff0c;随着业务的发展不能满足业务的需求。如原来业务系统用的是utf8字符集&#xff0c;后期有存储表情符号的需求&#xff0c;uft8字符集就不能满足…

easyexcel 设置标题_使用easyexcel完成复杂表头及标题的导出功能(自定义样式)

如需客户端指定excel版本,只需要判断后缀名然后在controller中的.excelType(ExcelTypeEnum.XLS)做指定输出内容格式即可***(注意表格行高列宽统一设置是在实体类的类名注解上,如果需要对表格进行精细的宽高设置需要删除掉这两个注解,可以在拦截器使用row的方法进行设置)1. ## 引…

nmon安装为什么重启mysql_Nmon的安装及使用

一、下载Nmon根据CPU的类型选择下载相应的版本&#xff1a;二、初始化工具[rootmululu ~]# cd /opt[rootmululu opt]# mkdir nmon[rootmululu opt]# cd nmon[rootmululu nmon]#wget http://sourceforge.net/projects/nmon/files/download/nmon_x86_12a.zip[rootmululu nmon]# u…

Iptables详解+实例

2019独角兽企业重金招聘Python工程师标准>>> Iptabels是与Linux内核集成的包过滤防火墙系统&#xff0c;几乎所有的linux发行版本都会包含Iptables的功能。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器&#xff0c; 则Iptables有利于…

阿里云服务器安装onlyoffice_阿里云服务器安装 JDK 8

欢迎关注“科技毒瘤君”&#xff01;上一期给大家分享了如何申请阿里云的免费云服务器&#xff0c;还没有看过的小伙伴可以先前往了解 >>阿里云免费服务器<<这一次将会为大家分享如何在服务器上配置 Java环境&#xff0c;这里演示使用的系统为Ubuntu 18.04 64位&am…

据说有99%的人都会做错的面试题

这道题主要考察了面试者对浮点数存储格式的理解。另外&#xff0c;请不要讨论该题本身是否有意义之类的话题。本题只为了测试面试者相关的知识是否掌握&#xff0c;题目本身并没有实际的意义。 下面有6个浮点类型变量&#xff0c;其中前三个是float类型的&#xff0c;后三个是d…

php使用mysql5和8的区别_mysql8.0和mysql5.7的区别是什么?

区别&#xff1a;mysql8.0的索引可以被隐藏和显示&#xff0c;当一个索引隐藏时&#xff0c;他不会被查询优化器所使用&#xff1b;2、mysql8.0新增了“SET PERSIST”命令&#xff1b;3、从mysql8.0开始&#xff0c;数据库的缺省编码将改为utf8mb4&#xff0c;包含了所有emoji字…

mysql pt check sum_percona工具pt-table-checksum

利用pt-table-checksum进行数据库同步检查rpm方式#wget percona.com/get/percona-toolkit.rpm源码方式#wget http://www.percona.com/downloads/percona-toolkit/2.2.1/percona-toolkit-2.2.8.tar.gz#yum install perl perl-CPAN perl-DBD-MySQL perl-Time-HiRes解压&#xff0…

如何通过BBED找回删除数据

项目案例&#xff1a;客户删除delete了重要数据&#xff0c;无备份&#xff0c;客户联系我&#xff0c;要求恢复相应数据。本次通过实验方式重现客户现场。备份高于一切&#xff0c;首先备份&#xff0c;再操作 创建表格&#xff1a; create table king(age number,name varcha…

mysql 重置密码语音_数字语音信号处理学习笔记语音信号的同态处理(2)

5.4 复倒谱和倒谱 定义 设信号x(n)的z变换为X(z) z[x(n)]&#xff0c;其对数为&#xff1a; (1) 那么 的逆z变换可写成&#xff1a; (2) 取 (1)式则有 (3) 于是式子(2)则可以写成 (4) 则式子(4)即为信号x(n)的复倒谱 的定义。因为 一般为复数&#xff0c;故称 为复倒谱。如果对…

NFS 八步神曲

Server:第一步yum install - y nfs*第二步vi /etc/exports第三步/var/testdirs *(rw,all_squash,anonuid99,anongid99,sync)第四步service nfs start第五步chkconfig --level 35 nfs on Client第一步mount 192.168.1.X:/var/www/testdirs /var/www/testdirs第二步vi /et…

2014年9月计算机二级mysql真题_2017年9月全国计算机二级MySQL考试章节练习题

2017年9月全国计算机二级MySQL考试章节练习题计算机二级考试成绩在“及格”&#xff0c;即60~89分者&#xff0c;由教育部考试中心发合格证书&#xff0c;考试成绩在“优秀”&#xff0c;即90~100分者&#xff0c;由教育部考试中心发优秀证书。这是小编给大家提供的2017年9月全…