protected void rescheduleAt(final Message<?> message, Date startTime) { getTaskScheduler() .schedule(() -> releaseMessage(message), startTime); }
private void releaseMessageAfterDelay(final Message<?> message, long delay) { Message<?> delayedMessage = message; DelayedMessageWrapper messageWrapper = null; if (message.getPayload() instanceof DelayedMessageWrapper) { messageWrapper = (DelayedMessageWrapper) message.getPayload(); } else { messageWrapper = new DelayedMessageWrapper(message, System.currentTimeMillis()); delayedMessage = getMessageBuilderFactory() .withPayload(messageWrapper) .copyHeaders(message.getHeaders()) .build(); this.messageStore.addMessageToGroup(this.messageGroupId, delayedMessage); } Runnable releaseTask; if (this.messageStore instanceof SimpleMessageStore) { final Message<?> messageToSchedule = delayedMessage; releaseTask = () -> releaseMessage(messageToSchedule); } else { final UUID messageId = delayedMessage.getHeaders().getId(); releaseTask = () -> { Message<?> messageToRelease = getMessageById(messageId); if (messageToRelease != null) { releaseMessage(messageToRelease); } }; } getTaskScheduler().schedule(releaseTask, new Date(messageWrapper.getRequestDate() + delay)); }
/** * Used for reading persisted Messages in the 'messageStore' to reschedule them e.g. * upon application restart. The logic is based on iteration over * {@code messageGroup.getMessages()} and schedules task for 'delay' logic. This * behavior is dictated by the avoidance of invocation thread overload. */ @Override public synchronized void reschedulePersistedMessages() { MessageGroup messageGroup = this.messageStore.getMessageGroup(this.messageGroupId); for (final Message<?> message : messageGroup.getMessages()) { getTaskScheduler() .schedule(() -> { // 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()); } }
protected void rescheduleAt(final Message<?> message, Date startTime) { getTaskScheduler() .schedule(() -> releaseMessage(message), startTime); }
private void releaseMessageAfterDelay(final Message<?> message, long delay) { Message<?> delayedMessage = message; DelayedMessageWrapper messageWrapper = null; if (message.getPayload() instanceof DelayedMessageWrapper) { messageWrapper = (DelayedMessageWrapper) message.getPayload(); } else { messageWrapper = new DelayedMessageWrapper(message, System.currentTimeMillis()); delayedMessage = getMessageBuilderFactory() .withPayload(messageWrapper) .copyHeaders(message.getHeaders()) .build(); this.messageStore.addMessageToGroup(this.messageGroupId, delayedMessage); } Runnable releaseTask; if (this.messageStore instanceof SimpleMessageStore) { final Message<?> messageToSchedule = delayedMessage; releaseTask = () -> releaseMessage(messageToSchedule); } else { final UUID messageId = delayedMessage.getHeaders().getId(); releaseTask = () -> { Message<?> messageToRelease = getMessageById(messageId); if (messageToRelease != null) { releaseMessage(messageToRelease); } }; } getTaskScheduler().schedule(releaseTask, new Date(messageWrapper.getRequestDate() + delay)); }
/** * Used for reading persisted Messages in the 'messageStore' to reschedule them e.g. * upon application restart. The logic is based on iteration over * {@code messageGroup.getMessages()} and schedules task for 'delay' logic. This * behavior is dictated by the avoidance of invocation thread overload. */ @Override public synchronized void reschedulePersistedMessages() { MessageGroup messageGroup = this.messageStore.getMessageGroup(this.messageGroupId); for (final Message<?> message : messageGroup.getMessages()) { getTaskScheduler() .schedule(() -> { // 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()); } }