1. ActiveMq 客户端

<!-- 自定义 -->
<bean id="jmsTopicReceive" class="com.pinganfu.paff.runtime.jms.receive.JmsReceiver">
<property name="connectionFactory" ref="jmsFactoryReceive" />
<!-- 指定发送的主题 -->
<property name="destinationName" value="paff.topic" />
<!-- 主题还是队列 -->
<property name="pubSubDomain" value="true" />
<!-- 异步接受回调 方法 -->
<property name="messageListener">
<bean class="com.pinganfu.paff.runtime.jms.MyJmsReceiverListener" />
</property>
<!-- 持久化订阅 配置-->
<property name="subscriptionDurable" value="true"></property>
<property name="clientId" value="connection.system002" />
<property name="durableSubscriptionName" value="subscriptionName.system002"></property>
</bean>

2
修改 clientId 与 durableSubscriptionName的值,每次启动
都会在ActiveMq实列注册持久定阅者,通过控制台可以看到多个持久订阅者,如图

数据库中表记录如下select * from ACTIVEMQ_ACKS

可获知持久的订阅者保存在数据库中ACTIVEMQ_ACKS表中,
其中最重要的一个字段LAST_ACKED_ID中值为,对应表中的ACTIVEMQ_MSGS中的ID值。
在新建持久订阅时者时,LAST_ACKED_ID中的值为ACTIVEMQ_MSGS表中最大ID值。

当此订阅者为在线状态时,会消费主题消息,当消费完成时,LAST_ACKED_ID 又会更新为烊ACTIVEMQ_MSG表中类型为topic消息的最大ID值

LAST_ACKED_ID,相当于每个持久订阅者消费到消息的最大值。

2. 当每个持久订阅者把所有消息消费完成时,数据库中的记录并没有删除。Aactive默认策略是每隔5分钟清除没有用的消息。
可以通过jdbcPersistenceAdapter中属性中cleanupPeriod来改变清除间隔时间


持久化表结构说明:

当在启动ActiveMQ时,先判断表是否存在,如果不存在,将去创建表,如下:
(1)ACTIVEMQ_ACKS:持久订阅者列表
1.CONTAINER:类型://主题
如:topic://basicInfo.topic
2.SUB_DEST:应该是描述,与1内容相同
3.CLIENT_ID:持久订阅者的标志ID,必须唯一
4.SUB_NAME:持久订阅者的名称.(durableSubscriptionName)
5.SELECTOR:消息选择器,consumer可以选择自己想要的
6.LAST_ACKED_ID:最后一次确认ID,这个字段存的该该订阅者最后一次收到的消息的ID

(2)ACTIVEMQ_LOCK:进行数据访问的排斥锁
1.ID:值为1
2.TIME:时间
3.BROKER_NAME:broker的名称
这个表似为集群使用,但现在ActiveMQ并不能共享数据库.

(3)ACTIVEMQ_MSGS:存储Queue和Topic消息的表
1.ID:消息的ID
2.CONTAINER: 类型://主题
如:queue://my.queue
Topic://basicInfo.topic
3.MSGID_PROD:发送消息者的标志
MSGID_PROD =ID:[computerName][…..]
注意computerName,不要使用中文,消息对象中会存储这个部分,解析connectID时会出现Bad String错误.
4.MSGID_SEQ:还不知用处
5.EXPIRATION:到期时间.
6.MSG:消息本身,Blob类型.
可以在JmsTemplate发送配置中,加上<property name=”timeToLive” value=”432000000”/>,5天的生命期,如果消息一直没有被处理,消息会被删除,但是表中会存在CONTAINER为queue://ActiveMQ.DLQ的记录.也就是说,相当于将过期的消息发给了一个ActiveMQ自定义的删除队列..

<二>关于ActiveMQ的持久订阅消息删除操作
1.主题消息只有一条,所有订阅了这个消息的持久订阅者都要收到消息,只有所有订阅者收到消息并确认(Acknowledge)之后.才会删除.
说明:ActiveMQ支持批量(optimizeAcknowledge为true)确认,以提高性能
2.ActiveMQ执行删除Topic消息的cleanup()操作的时间间隔为5 minutes..