我已将JDBCMessageStore
绑定到Delayer
组件,这样我们可以避免在系统故障时丢失消息,而不是在系统关闭时擦除的内存MessageStore
。
我创建了表格INT_MESSAGE
,INT_MESSAGE_GROUP
和INT_GROUP_TO_MESSAGE
。在测试时,看起来表格正在插入。
在INT_MESSAGE
收到邮件后,我看到INT_MESSAGE_GROUP
,Delayer
为空,这是功能吗?在Delayer
获取这些消息后,要从持久性存储中删除消息?我仍然在INT_GROUP_TO_MESSAGE
中看到COMPLETE
,LAST_RELEASED_SEQUENCE
和MARKED
全部为0的条目,是否使用了这些条目?每次有消息的进入和退出时,UDPATED_DATE
列都会更新。我如何知道消息传递给绑定到持久消息存储的Spring组件的状态。
系统恢复后,Delayer
会查看哪一列来接收邮件?
答案 0 :(得分:2)
我看到Delayer选中消息后INT_MESSAGE,INT_MESSAGE_GROUP为空,这是功能吗?
是的,确实如此。 DelayHandler
执行:
if (removeDelayedMessageFromMessageStore(message)) {
if (!(this.messageStore instanceof SimpleMessageStore)) {
this.messageStore.removeMessagesFromGroup(this.messageGroupId, message);
}
this.handleMessageInternal(message);
}
因此,在使用后将消息从数据库中删除是完全正确的。
COMPLETE
,LAST_RELEASED_SEQUENCE
和MARKED
用于Aggregator
和Resequencer
,但为了节省数据库中的某些位置,它们都使用相同的表格MessageStore
抽象。
每次有消息的进入和退出时,
UDPATED_DATE
列都会更新。
这是正确的,因为DelayHandler
中的所有邮件都是通过其id
:http://docs.spring.io/spring-integration/reference/html/messaging-endpoints-chapter.html#delayer-message-store进行分组的。请参阅GROUP_KEY
列。它必须是UUID.toString()
表示。
我如何知道消息传递给绑定到持久性消息存储库的Spring组件的状态。
没有州。如果需要延迟,则消息存储在DB中。当任务执行时,它会对该消息执行拾取和删除操作。在这种情况下,group
记录也会更新。
在系统恢复后,Delayer会查看哪一列来接收邮件?
没有这样的标签。如果邮件在商店中,则必须重新安排延迟或由于延迟超时过期而返回outputChannel
。
因此,DelayHandler
只是在应用程序启动后读取商店中的所有消息:
for (final Message<?> message : messageGroup.getMessages()) {
getTaskScheduler().schedule(new Runnable() {
@Override
public void run() {
// This is fine to keep the reference to the message,
// because the scheduled task is performed immediately.
long delay = determineDelayForMessage(message);
if (delay > 0) {
releaseMessageAfterDelay(message, delay);
}
else {
releaseMessage(message);
}
}
}, new Date());
}