activeMq有两种模式,说下个人理解
activemq 8186 管理端口 61616 默认服务端口
queue队列模式
topic 主题模式
队列模式: 生产者生成消息存入队列,消费者通过监听队列的queue消费者负责消费,且每个消息只能消费一次
应用场景: 登陆成功,记录日志/记录状态/记录ip 等的一些列 *** 作,可以异步执行,相对于来说不须要同步的 *** 作,可以保证 *** 作要求的请求不丢失
主题模式: 生产者生成消息,发布消息,订阅之后的消费者都可以读取到发布的消息,并且所有消息均可被多个消费者都消费一次
应用场景: 商城下单成功后,发送一条成功的消息,被日志系统/库存系统/物流系统 分别读取到,并做相应 *** 作
springboot+activemq整合
1 引入pom依赖
<groupId>orgspringframeworkboot
<artifactId>spring-boot-starter-activemq
<version>1520RELEASE
<groupId>orgmessaginghub
<artifactId>pooled-jms
<version>104
</dependency>
2 分别编写 生产者 消费者 配置类
@Component
public class ActiveSend {
@Autowired
private Queuequeue;
@Autowired
private Topictopic;
@Autowired
private JmsMessagingTemplatejmsMessagingTemplate;
public void sendQueue()throws JMSException {
ObjectMessage objectMessage =new ActiveMQObjectMessage();
objectMessagesetObject("nihao");
jmsMessagingTemplateconvertAndSend(queue,objectMessage);
}
public void sendTopic()throws JMSException {
ObjectMessage objectMessage =new ActiveMQObjectMessage();
objectMessagesetObject("nihao");
jmsMessagingTemplateconvertAndSend(topic,objectMessage);
}
}
@Component
public class ActiveListenner {
@JmsListener(destination ="active-queue")
public void reciveQueueMsg(ObjectMessage message)throws JMSException {
Systemoutprintln("收到的消息"+messagegetObject()toString());
}
@JmsListener(destination ="active-topic")
public void reciveTopicMsg(ObjectMessage message)throws JMSException {
Systemoutprintln("主题收到的消息"+messagegetObject()toString());
}
}
@Configuration
public class ActiveMqConfig {
@Bean
public Queuequeue (){
return new ActiveMQQueue("active-queue");
}
@Bean
public Topictopic (){
return new ActiveMQTopic("active-topic");
}
}
做一下说明,队列模式/主题模式,都是以配置类中的 关键字为判断对象,且两种模式不能共存
为了测试什么呢
测试队列模式,是否两个消费者都消费,且均分
测试主题模式,是否消息产生后,两个消费者都消费一次
yml 配置:
spring:
jms:
# 默认情况下activemq提供的是queue模式,若要使用topic模式需要配置下面配置
pub-sub-domain:false
# activemq消息队列
activemq:
broker-url: tcp://172183180:61616
#是否是内存模式(内置MQ,true是 false否)
in-memory:false
# 等待消息发送响应的时间。设置为0等待永远
send-timeout: 0
user:'admin'
password:'admin'
packages:
#信任所有的包
trust-all:true
pool:
#是否替换默认的连接池,使用ActiveMQ的连接池需引入的依赖
enabled:false
现在是队列模式,编写测试类测试
改变配置 将yml中的配置 pub-sub-domain:false 变为pub-sub-domain:true,开启主题模式
假如有10个监听者,那么主题模式下(topic),一个消息将被消费十次
ActiveMQ持久化消息的二种方式;
1、持久化为文件
这个装ActiveMQ时默认就是这种,只要设置消息为持久化就可以了。涉及到的配置和代码有:
<persistenceAdapter>
<kahaDB directory="${activemqbase}/data/kahadb"/>
</persistenceAdapter>
producerSend(request, MsgDeliveryModePersistent, level, TimeSpanMinValue);
2、持久化为MySql
首先需要把MySql的驱动放到ActiveMQ的Lib目录下,我用的文件名字是:mysql-connector-java-504-binjar
接下来修改配置文件
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="${activemqbase}/data" dataSource="#derby-ds"/>
</persistenceAdapter>
在配置文件中的broker节点外增加
<bean id="derby-ds" class="orgapachecommonsdbcpBasicDataSource" destroy-method="close">
<property name="driverClassName" value="commysqljdbcDriver"/>
<property name="url" value="jdbc:mysql://localhost/activemqrelaxAutoCommit=true"/>
<property name="username" value="activemq"/>
<property name="password" value="activemq"/>
<property name="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
从配置中可以看出数据库的名称是activemq,需要手动在MySql中增加这个库。
然后重新启动消息队列,会发现多了3张表
1:activemq_acks
2:activemq_lock
3:activemq_msgs
1、ActiviMq消息队列,解决了服务解耦合的动作,缓解了服务并发量很大,造成服务器无法处理的状况。(kafka、rabbitMQ、activiMQ)
其他作用:异步处理、消息通讯、流量消峰、应用解耦
应用场景:
1、用户注册的时候,重点内容是将用户信息保存到数据库中,发短信验证或者是发邮件增加了业务的复杂度。这时使用MQ将发短信、发邮件通知MQ由另外的服务平台完成。
2、搜索平台、缓存平台
查询数据,建立缓存、索引,不从数据库查询,从缓存或者索引库查询,当数据库发生增加、修改、删除 *** 作时发消息给MQ,缓存平台或者是索引平台从MQ获取到这个消息,更新缓存或者索引。
ActiveMQ使用的是标准的生产者(完成生产消息并发送消息)和消费者(获取消息,完成自己的业务逻辑)模型
有两种数据结构
Topic(发布订阅) 一个生产者对应多个消费者,消息默认不会持久化,需要手动配置持久化。如果A服务器挂了,再生产一条消息的话,会被B服务器拿去使用,就算重新启动,A服务器也不会再拿到消息了
商品系统、库存系统、生成商品详情页面的系统,现在要添加一个商品信息,消息肯定是需要让库存系统以及商品信息详情页面系统知道的。
Queue(点对点)一个生产者对应一个消费者,默认消息持久化
StringMessage
mapMessage
byteMessage
objectMessage
要完成topic模式的消息持久化,需要保证每个消费者有唯一的clientID(本文来自北大青鸟)
我就放队列里发,就是不管,处理 完 消息 后,一般不知道 ActiveMQ 发消息 是异步的,你收不没收到。 所以消息 消息掉了 ,再 还一个消息给 发送端, 因此 可以 让 接收 消息 端
activemq的topic消息一直都会存在数据库中,为什么不会删除
ActiveMQ另问题要软件能挂掉挂掉怕怕挂掉信息给丢所本节析几种持久化式:、持久化文件ActiveMQ默认支持种搜索式要发消息设置消息持久化打安装目录配置文件:D:\ActiveMQ\apache-activemq\conf\activemqxml越80行发现默认配置项
以上就是关于2020-07-28 activeMq 两种模式的测试全部的内容,包括:2020-07-28 activeMq 两种模式的测试、用java代码如何设置activemq消息持久化到数据库中、ActiveMQ是什么是干什么用的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)