2020-07-28 activeMq 两种模式的测试

2020-07-28 activeMq 两种模式的测试,第1张

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是什么是干什么用的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9536071.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存