Delayer JDBCMessageStore

时间:2016-07-22 14:48:32

标签: spring-integration

我已将JDBCMessageStore绑定到Delayer组件,这样我们可以避免在系统故障时丢失消息,而不是在系统关闭时擦除的内存MessageStore

我创建了表格INT_MESSAGEINT_MESSAGE_GROUPINT_GROUP_TO_MESSAGE。在测试时,看起来表格正在插入。 在INT_MESSAGE收到邮件后,我看到INT_MESSAGE_GROUPDelayer为空,这是功能吗?在Delayer获取这些消息后,要从持久性存储中删除消息?我仍然在INT_GROUP_TO_MESSAGE中看到COMPLETELAST_RELEASED_SEQUENCEMARKED全部为0的条目,是否使用了这些条目?每次有消息的进入和退出时,UDPATED_DATE列都会更新。我如何知道消息传递给绑定到持久消息存储的Spring组件的状态。

系统恢复后,Delayer会查看哪一列来接收邮件?

1 个答案:

答案 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);
    }

因此,在使用后将消息从数据库中删除是完全正确的。

COMPLETELAST_RELEASED_SEQUENCEMARKED用于AggregatorResequencer,但为了节省数据库中的某些位置,它们都使用相同的表格MessageStore抽象。

  

每次有消息的进入和退出时,UDPATED_DATE列都会更新。

这是正确的,因为DelayHandler中的所有邮件都是通过其idhttp://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());
    }