ActiveMQ:spring/springboot整合,KahaDB,JDBC数据持久化配置

Spring整合ActiveMQ

xml 配置: 主题,队列
 <!--开启包的自动扫描-->
<context:component-scan base-package="com.atguigu.activemq"/>

<!--配置生产者-->
<bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
    <property name="connectionFactory">
        <bean class="org.apache.activemq.ActiveMQConnectionFactory">
            <property name="brokerURL" value="tcp://192.168.0.103:61616"/>
        </bean>
    </property>
    <property name="maxConnections" value="100"></property>
</bean>

<!--队列目的地,点对点-->
<bean id="destinationQueue" class="org.apache.activemq.command.ActiveMQQueue">
    <constructor-arg index="0" value="spring-active-queue"/>
</bean>

<!--主题-->
<bean id="destinationTopic" class="org.apache.activemq.command.ActiveMQTopic">
    <constructor-arg index="0" value="spring-active-topic1"/>
</bean>

<!--spring提供的JMS工具类,它可以进行消息发送,接收等-->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="jmsFactory"/>
    <property name="defaultDestination" ref="destinationTopic"/>
    <property name="messageConverter">
        <bean class="org.springframework.jms.support.converter.SimpleMessageConverter"/>
    </property>
</bean>

<!--配置消费者监听模式,使程序启动时,消费者自动启动.异步监听模式就,非阻塞-->
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="jmsFactory"/>
    <property name="destination" ref="destinationTopic"/>
    <property name="messageListener" ref="myMessageListener"/>
</bean>

配置实现:自启消费者,非阻塞模式
@Component
public class MyMessageListener implements MessageListener {
@Override
public void onMessage(Message message){
if(null !=message && message instanceof TextMessage){
TextMessage textMessage=(TextMessage)message;
try{
System.out.println(“自启消费者,监听模式接收到的消息”+textMessage.getText());
}catch (JMSException e){
e.printStackTrace();
}
}
}
}

Springboot整合ActiveMQ(基于配置与注解即可实现,默认持久化保存(MQ宕机,数据不丢失))
队列
主题

ActiveMQ的传输协议
TCP 默认使用, ActiveMQ中默认的消息协议就是openwire(TCP)
NIO 高效能

activemq.xml







TCP->NIO
1 activemq.xml
添加NIO传输协议


2 修改,生产者、消费者服务协议即可。

设置ActiveMQ自动配置多种协议传输支持
1

2 再修改,生产者、消费者代码里的服务协议即可。

ActiveMQ持久化与永久存储(MQ挂了,消息不会丢失。外部设置的持久化)
持久化机制:
复制的LevelDB存储(Replicated LevelDB)
KahaDB

持久化机制:
1 ActiveMQ的消息持久化机制有JDBC、AMQ、KahaDB和LevelDB,无论使用哪种持久化方式,消息的存储逻辑都是一致的。

2 就是在发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件、内存数据库或者远程数据库等再试图将消息发送
给接收者,成功则将消息从存储中删除,失败则继续尝试发送。

3 消息中心启动以后,首先要检查指定的存储位置,如果有未发送成功的消息,则需要把消息发送出去。

kahaDB, ActiveMQ5.4以后,默认存储机制。
kahaDB存储原理机制:
一个存储数据的日志,和一个存储全部索引的文件。
db-.log 存储数据的日志文件,它随着消息数量的增多,number数值也会随着递增。例如:32M为一个文件。满32M时,则再创建一个日志文件。
db-1.log、db-2.log

db.data 该文件包含了持久化的BTree索引。索引了消息数据记录中的消息,它是消息的索引文件。B树(分段寻找机制实现,快速索引定位)

db.free 当前db.data文件里哪些页面是空闲的,文件具体内容是所有空闲页的ID

db.redo 用来进行消息恢复,如果KahaDB消息存储在强制退出后启动,用于恢复BTree索引

lock文件锁,表示当前获得kahadb读写权限的broker。

JDBC消息存储:(存储到mysql中)
1 activemq ./bin/引入mysql驱动jar包
2 activemq.xml 配置



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

3 activemq.xml 配置dataSource 的 bean







4 运行代码,自动从数据库中,创建相应的表。

5 重启activemq: activemq自动完成建表操作

在点对点类型中:
当DeliveryMode设置为NON_PERSISTENCE时,消息被保存在内存中
当DeliveryMode设置为PERSISTENCE时,消息保存在broker的相应的文件或者数据库中。

而且:点对点类型中消息一旦被Consumer消费,就从broker中删除。

6 运行代码,查看数据库即可。

注意:ActiveMQ配置MySQL驱动jar包,配置mysql bean时,注意相关连接池的类型,以便需要导入相关的jar包。默认dbcp2(不需要引入额外jar包)

ActiveMQ Journal,使用高速缓存写入技术,大大提高了性能。(JDBC存储的性能)
例如:
生成者生产1000条消息,者1000条消息会保存到journal文件,如果消费者的消费速度很快的情况下,
在journal文件还没有同步到DB之前,消费者已经消费了90%的以上的消息,那么这个时候只需要同步剩余的10%的消息到DB.

如果消费者的消费速度很慢,这个时候journal文件可以使消息以批量方式写到DB.

配置:activemq.xml


©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页