ActiveMQ的可靠性和保存数据到mysql中

消息的成功消费通常包括三个步骤:client接收消息 ==> client处理消息 == >消息被确认
持久化的消息

默认是持久化

非持久:
messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT)
当服务器宕机,消息不存在
持久化:
在生产者端开启持久化
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT)
当服务器宕机,消息依旧存在
消息订阅
客户端首先向MQ注册一个自己的身份ID识别号(connection.setClientID(“XX”)),当这个客户端处于离线时,生产者会为这个ID保存所有发送到主题的消息
当客户再次连接到MQ时,会根据消费者的ID得到所有当自己处于离线时发送到的主题消息

生产者:在创建完connection后,不直接启动,而是在生产者设置持久化后启动
消费者:在创建完目的地,session创建订阅之后,connection.start

生产者偏事务,消费者偏签收
produce事务

//3.创建session  p1: 事务; p2: 签收
        Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

producer提交时的事务
false:只要执行send,消息就发送到队列中
那第二个签收参数的设置需要有效
ture:表示开启事务,消息需要先send,然后再commit,消息才被真正的提交到队列中
消息需要批量发送,需要缓冲区处理

consumer签收
在produce设置非事务情况下
自动签收: Session.AUTO_ACKNOWLEDGE
手动签收: Session.CLIENT_ACKNOWLEDGE.客户端调用acknowledge方法签收

textMessage.acknowledge();

在produce设置事务情况下
生产事务开启,只有commit后才能将全部消息变成已消费(不写ack也可以)

session.commit();

事务与签收的关系
在事务性会话中,当一个事务被成功提交则消息被自动签收
如果事务回滚,则消息会被再次传送

非事务性会话中,消息何时被确认取决于创建会话时的应答模式(ack mode)

将数据写入mysql中
先导入数据库jar包到activeMQ的lib目录下
createTablesOnStartup=“false” 在配置文件中,是否一启动activeMQ就创建表

	<persistenceAdapter>
            <jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="false"/>
     </persistenceAdapter>

在这里插入图片描述
不加useSSL可能会报错.The last packet successfully received from the server

<bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> 
    		<property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    		<property name="url" value="jdbc:mysql://192.168.31.252/activemq?relaxAutoCommit=true&amp;useSSL=false"/> 
    		<property name="username" value="root"/> 
    		<property name="password" value="123456"/> 
    		<property name="poolPreparedStatements" value="true"/> 
</bean> 

在点对点类型中
当DeliveryMode设置为NON_PERSISTENCE时,消息被保存在内存中,可能丢失
当DeliveryMode设置为PERSISTENCE时,消息保存在broker的相应文件或者数据库中
当消息一但被消费,就会从broker中删除

messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);

如果是queue
在没有消费者消费的情况下会将信息保存到activemq_msgs表中,只要有任意一个消费者已经消费过,那么这些信息就会被立即删除

如果是topic
一般是先启动消费订阅然后在生产的情况下会将消息保存到activemq_acks
当订阅者取消订阅之后,它之前持久化的消息也会被删除

mysql journal增强
先将数据写入缓存,而不是直接与数据库交互,在一段时间后还没有被消费,则会被存入数据库中


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值