try { delayValue = this.delayExpression.getValue(this.evaluationContext, delayedMessageWrapper != null ? delayedMessageWrapper.getOriginal() : message); ? delayedMessageWrapper.getRequestDate() : System.currentTimeMillis(); delay = ((Date) delayValue).getTime() - current;
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)); }
try { delayValue = this.delayExpression.getValue(this.evaluationContext, delayedMessageWrapper != null ? delayedMessageWrapper.getOriginal() : message); ? delayedMessageWrapper.getRequestDate() : System.currentTimeMillis(); delay = ((Date) delayValue).getTime() - current;
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)); }
/** * Checks if 'requestMessage' wasn't delayed before ({@link #releaseMessageAfterDelay} * and {@link DelayHandler.DelayedMessageWrapper}). Than determine 'delay' for * 'requestMessage' ({@link #determineDelayForMessage}) and if {@code delay > 0} * schedules 'releaseMessage' task after 'delay'. * @param requestMessage - the Message which may be delayed. * @return - {@code null} if 'requestMessage' is delayed, otherwise - 'payload' from * 'requestMessage'. * @see #releaseMessage */ @Override protected Object handleRequestMessage(Message<?> requestMessage) { boolean delayed = requestMessage.getPayload() instanceof DelayedMessageWrapper; if (!delayed) { long delay = determineDelayForMessage(requestMessage); if (delay > 0) { releaseMessageAfterDelay(requestMessage, delay); return null; } } // no delay return delayed ? ((DelayedMessageWrapper) requestMessage.getPayload()).getOriginal() : requestMessage; }
assertEquals(message1, ((DelayHandler.DelayedMessageWrapper) payload).getOriginal());
assertEquals(message1, ((DelayHandler.DelayedMessageWrapper) payload).getOriginal());
assertEquals(message1, ((DelayHandler.DelayedMessageWrapper) payload).getOriginal());
Message<String> original1 = (Message<String>) ((DelayHandler.DelayedMessageWrapper) payload).getOriginal(); messageInStore = iterator.next(); Message<String> original2 = (Message<String>) ((DelayHandler.DelayedMessageWrapper) messageInStore.getPayload()) .getOriginal(); assertThat(message1, Matchers.anyOf(Matchers.is(original1), Matchers.is(original2)));
/** * Checks if 'requestMessage' wasn't delayed before ({@link #releaseMessageAfterDelay} * and {@link DelayHandler.DelayedMessageWrapper}). Than determine 'delay' for * 'requestMessage' ({@link #determineDelayForMessage}) and if {@code delay > 0} * schedules 'releaseMessage' task after 'delay'. * @param requestMessage - the Message which may be delayed. * @return - {@code null} if 'requestMessage' is delayed, otherwise - 'payload' from * 'requestMessage'. * @see #releaseMessage */ @Override protected Object handleRequestMessage(Message<?> requestMessage) { boolean delayed = requestMessage.getPayload() instanceof DelayedMessageWrapper; if (!delayed) { long delay = determineDelayForMessage(requestMessage); if (delay > 0) { releaseMessageAfterDelay(requestMessage, delay); return null; } } // no delay return delayed ? ((DelayedMessageWrapper) requestMessage.getPayload()).getOriginal() : requestMessage; }