SpringBoot整合ActiveMQ大全

SpringBoot整合ActiveMQ

背景知识点

JMS:Java Message Service Java消息服务

消息队列:消息的传输过程中保存消息的容器

消息队列主要特点:异步处理

主要目的:减少请求响应时间和解耦

使用场景:将比较耗时而且不需要即时(同步)返回结果的操作作为消息放入消息队列

ActiceMQ相关概念

1.Destination

目的地,JMS Provider(消息中间件)维护,用于对Message进行管理的对象。

MessageProducer需要指定Destination才能发送消息,MessageConsumer需要指定Destination才能接收消息。

2.Producer

消息生成者(客户端,生成消息),负责发送Message到目的地。应用接口为MessageProducer

3.Consumer【Receiver】

消息消费者(处理消息),负责从目的地中消费【处理|监听|订阅】Message。应用接口为MessageConsumer

4.Message

消息(Message),消息封装一次通信的内容。常见类型有:StreamMessage、BytesMessage、TextMessage、ObjectMessage、MapMessage。

5.ConnectionFactory
链接工厂, 用于创建链接的工厂类型。 注意,不能和 JDBC 中的 ConnectionFactory 混
淆。

6.Connection
链接. 用于建立访问 ActiveMQ 连接的类型, 由链接工厂创建. 注意,不能和 JDBC 中的
Connection 混淆。

7.Session
会话, 一次持久有效有状态的访问. 由链接创建. 是具体操作消息的基础支撑。

8.Queue&Topic

Queue是队列目的地,Topic是主题目的地。都是Destination的子接口。

Queue特点:队列中的消息,默认只能有唯一的一个消费者处理。

Topic特点:主题中的消息,会发送给所有的消费者同时处理。只有在消息可以重复处理的业务场景中可使用。

9.PTP

Point to Point。点对点消息模型,就是基于Queue实现的消息处理方式。

10.PUB&SUB

Publish&Subscribe。消息的发布/订阅模型。是基于Topic实现的消息处理方式。

PTP 和 PUB/SUB对比

QueueTopic
概要Point-to-Point点对点Publis Subscribe messaging发布订阅消息
有无状态Queue数据默认会在mq服务器上以文件形式保存,比如Actice MQ一般保存在$AMQ_HOME\data\kahadb 下面。也可以配置成 DB 存储topic数据默认不落地,是无状态的
完整性保障Queue保证每条数据都能被receiver接受,消息不超时???此处不确定b并不保证publisher发布的每条数据,subscriber都能接收到
消息是否会丢失Sender发送消息到目的Queue,receiver可以异步接受这个Queue上的消息。Queue上的消息如果暂时没有receiver来取,也不会丢失。前提是消息不超时一般来说 publisher 发布消息到某一个 topic 时,只有正在监听该 topic

地址的 sub 能够接收到消息;如果没
有 sub 在监听,该 topic 就丢失了。 |
| 消息发布接受策略 | 一对一的消息发布接受策略,一个sender发送的消息,只能有一个receiver接受。receiver接受完后,通知mq服务器已接受,mq服务器对queue里的消息采取删除或其他操作 | 一对多的消息发布接收策略,监听同一个topic地址的多个sub都能收到publisher发送的消息。Sub接收完通知mq服务器 |

安全认证

暂时未用到,此处有待添加

持久化

1.kahadb方式

是 ActiveMQ 默认的持久化策略。kahadb 是一个文件型数据库。是使用内存+文件保证
数据的持久化的。kahadb 可以限制每个数据文件的大小。不代表总计数据容量。

<persistenceAdapter>
<!-- directory:保存数据的目录; journalMaxFileLength:保存消息的文件大小 -->
<kahaDB directory="${activemq.data}/kahadb" journalMaxFileLength="16mb"/>
</persistenceAdapter>

特性是:1、日志形式存储消息;2、消息索引以 B-Tree 结构存储,可以快速更新;3、
完全支持 JMS 事务;4、支持多种恢复机制;

2.AMQ方式(过时不推荐)

3.JDBC持久化

下述文件为 activemq.xml 配置文件部分内容。不要完全复制。
首先定义一个 mysql-ds 的 MySQL 数据源,然后在 persistenceAdapter 节点中配置
jdbcPersistenceAdapter 并且引用刚才定义的数据源。

dataSource 指定持久化数据库的 bean,createTablesOnStartup 是否在启动的时候创建数
据表,默认值是 true,这样每次启动都会去创建数据表了,一般是第一次启动的时候设置为
true,之后改成 false。

<broker brokerName="test-broker" persistent="true" xmlns="http://activemq.apache.org/schema/core">
    <persistenceAdapter>
        <jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="false"/>
    </persistenceAdapter>
</broker>
<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
        <property name="username" value="activemq"/>
        <property name="password" value="activemq"/>
        <property name="maxActive" value="200"/>
        <property name="poolPreparedStatements" value="true"/>
</bean>

相关表介绍:

activemq_msgs

用于存储消息,Queue 和 Topic 都存储在这个表中:
ID:自增的数据库主键
CONTAINER:消息的 Destination
MSGID_PROD:消息发送者客户端的主键
MSG_SEQ:是发送消息的顺序,MSGID_PROD+MSG_SEQ 可以组成 JMS 的 MessageID
EXPIRATION:消息的过期时间,存储的是从 1970-01-01 到现在的毫秒数
MSG:消息本体的 Java 序列化对象的二进制数据
PRIORITY:优先级,从 0-9,数值越大优先级越高
activemq_acks

用于存储订阅关系。如果是持久化 Topic,订阅者和服务器的订阅关系在这个表保存:
主要的数据库字段如下:
CONTAINER:消息的 Destination
SUB_DEST:如果是使用 Static 集群,这个字段会有集群其他系统的信息
CLIENT_ID:每个订阅者都必须有一个唯一的客户端 ID 用以区分
SUB_NAME:订阅者名称
SELECTOR:选择器,可以选择只消费满足条件的消息。条件可以用自定义属性实现,
可支持多属性 AND 和 OR 操作
LAST_ACKED_ID:记录消费过的消息的 ID。
activemq_lock

在集群环境中才有用,只有一个 Broker 可以获得消息,称为 Master Broker,其他的只能作为备份等待 Master Broker 不可用,才可能成为下一个 Master Broker。这个表用于记录哪个 Broker 是当前的 Master Broker。只有在消息必须保证有效,且绝对不能丢失的时候。使用 JDBC 存储策略。如果消息可以容忍丢失,或使用集群/主备模式保证数据安全的时候,建议使用 levelDB或 Kahadb。

SrpingBoot集成ActiveMQ

启动activemq

生产者

@Service("producer")
public class Producer {
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
    public void sendMessage(Destination destination, final String message){
        jmsMessagingTemplate.convertAndSend(destination,message);
    }
}

消费者

@Component
public class Consumer {
    @JmsListener(destination = "mytest1.queue")
    public void receiveQueue(String text){
        System.out.println("Consumer接收到的报文为:"+text);
    }

}

测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloActivemqApplicationTests {
    @Autowired
    private Producer producer;
    @Test
    public void contextLoads() {
        System.out.println("上下文加载开始");
        Destination destination=new ActiveMQQueue("mytest1.queue");
        for (int i = 0; i <100 ; i++) {
            producer.sendMessage(destination,"my name is yinjian");
        }
        System.out.println("上下文加载结束");
    }

}

result

上下文加载开始
Consumer接收到的报文为:my name is yinjian
Consumer接收到的报文为:my name is yinjian
Consumer接收到的报文为:my name is yinjian
Consumer接收到的报文为:my name is yinjian
Consumer接收到的报文为:my name is yinjian
...诸如类似
上下文加载结束
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值