public Object getCorrelationId() { return this.get(CORRELATION_ID); }
public boolean equals(Object obj) { if (this == obj) { return true; } if (obj != null && obj instanceof GenericMessage) { GenericMessage<?> other = (GenericMessage<?>) obj; if (!this.headers.getId().equals(other.headers.getId())) { return false; } return this.headers.equals(other.headers) && this.payload.equals(other.payload); } return false; }
/** * Create a new message with the given payload. The id will be generated by * the default {@link IdGenerator} strategy. The headers will be populated * with the provided header values. * * @param payload the message payload * @param headers message headers */ public GenericMessage(T payload, Map<String, Object> headers) { Assert.notNull(payload, "payload must not be null"); if (headers == null) { headers = new HashMap<String, Object>(); } else { headers = new HashMap<String, Object>(headers); } this.headers = new MessageHeaders(headers); this.payload = payload; }
private Properties getStringTypedHeaders(Message<?> message) { Properties properties = new Properties(); MessageHeaders headers = message.getHeaders(); for (String key : headers.keySet()) { Object value = headers.get(key); if (value instanceof String) { properties.setProperty(key, (String) value); } } return properties; }
String processId = ((ProcessContext) message.getHeaders().get(MessageRegistryConstants.MSG_HEADER_CTX)).getProcessId(); try { (String) message.getHeaders().get(MessageRegistryConstants.MSG_HEADER_ID), channels.size()-1); } catch (MessageRegistryException e) { .setSequenceNumber(sequenceNumber++) .setSequenceSize(sequenceSize) .setCorrelationId(message.getHeaders().getId()) .setHeader(MessageHeaders.ID, UUID.randomUUID()) .build()); .setSequenceNumber(sequenceNumber++) .setSequenceSize(sequenceSize) .setCorrelationId(message.getHeaders().getId()) .setHeader(MessageHeaders.ID, UUID.randomUUID()) .build();
@Override protected final void handleRequestMessage(Message<?> message, ReplyMessageHolder replyHolder) { Object result = this.splitMessage(message); if (result == null) { return; } Object correlationId = (message.getHeaders().getCorrelationId() != null) ? message.getHeaders().getCorrelationId(): message.getHeaders().getId(); if (result instanceof Collection) { Collection<?> items = (Collection<?>) result; int sequenceNumber = 0; int sequenceSize = items.size(); for (Object item : items) { this.addReply(replyHolder, item, correlationId, ++sequenceNumber, sequenceSize); } } else if (result.getClass().isArray()) { Object[] items = (Object[]) result; int sequenceNumber = 0; int sequenceSize = items.length; for (Object item : items) { this.addReply(replyHolder, item, correlationId, ++sequenceNumber, sequenceSize); } } else { this.addReply(replyHolder, result, correlationId, 1, 1); } }
@Override protected boolean canAddMessage(Message<?> message, MessageBarrier<SortedSet<Message<?>>> barrier) { if (!super.canAddMessage(message, barrier)) { return false; } Integer lastReleasedSequenceNumber = barrier.getAttribute(LAST_RELEASED_SEQUENCE_NUMBER); if (barrier.messages.contains(message) || lastReleasedSequenceNumber >= message.getHeaders().getSequenceNumber()) { logger.debug("A message with the same sequence number has been already received: " + message); return false; } if (message.getHeaders().getSequenceSize() < message.getHeaders().getSequenceNumber()) { logger.debug("The message has a sequence number which is larger than the sequence size: "+ message); return false; } if (!barrier.getMessages().isEmpty() && ! message.getHeaders().getSequenceSize().equals(barrier.getMessages().first().getHeaders().getSequenceSize())) { logger.debug("The message has a sequence size which is different from other messages handled so far: " + message + ", expected value is " + barrier.getMessages().first().getHeaders().getSequenceNumber()); return false; } return true; }
public boolean dispatch(Message<?> message) { boolean dispatched = false; int sequenceNumber = 1; List<MessageHandler> handlers = this.getHandlers(); int sequenceSize = handlers.size(); for (final MessageHandler handler : handlers) { final Message<?> messageToSend = (!this.applySequence) ? message : MessageBuilder.fromMessage(message) .setSequenceNumber(sequenceNumber++) .setSequenceSize(sequenceSize) .setCorrelationId(message.getHeaders().getId()) .setHeader(MessageHeaders.ID, UUID.randomUUID()) .build(); if (this.taskExecutor != null) { this.taskExecutor.execute(new Runnable() { public void run() { invokeHandler(handler, messageToSend); } }); dispatched = true; } else { boolean success = this.invokeHandler(handler, messageToSend); dispatched = (success || dispatched); } } return dispatched; }
private Message<?> doSendAndReceive(Message<?> request, MessageChannel channel) { Object originalReplyChannelHeader = request.getHeaders().getReplyChannel(); Object originalErrorChannelHeader = request.getHeaders().getErrorChannel(); TemporaryReplyChannel replyChannel = new TemporaryReplyChannel(this.receiveTimeout); request = MessageBuilder.fromMessage(request) .setReplyChannel(replyChannel) .setErrorChannel(replyChannel) .build(); if (!this.doSend(request, channel)) { throw new MessageDeliveryException(request, "failed to send message to channel"); } Message<?> reply = this.doReceive(replyChannel); if (reply != null) { reply = MessageBuilder.fromMessage(reply) .setHeader(MessageHeaders.REPLY_CHANNEL, originalReplyChannelHeader) .setHeader(MessageHeaders.ERROR_CHANNEL, originalErrorChannelHeader) .build(); } return reply; }
protected final MessageChannel resolveReplyChannelFromMessage(Message<?> message) { Object replyChannel = message.getHeaders().getReplyChannel(); if (replyChannel != null) { if (replyChannel instanceof MessageChannel) { return (MessageChannel) replyChannel; } if (logger.isWarnEnabled()) { logger.warn("Aggregator can only reply to a 'replyChannel' of type MessageChannel."); } } return null; }
public int compare(Message<?> message1, Message<?> message2) { Integer s1 = message1.getHeaders().getSequenceNumber(); Integer s2 = message2.getHeaders().getSequenceNumber(); if (s1 == null) { s1 = 0; } if (s2 == null) { s2 = 0; } return s1.compareTo(s2); }
public boolean accept(Message<?> message) { Long expirationDate = message.getHeaders().getExpirationDate(); if (expirationDate == null) { return true; } return expirationDate > System.currentTimeMillis(); }
public int compare(Message<?> message1, Message<?> message2) { MessagePriority priority1 = message1.getHeaders().getPriority(); MessagePriority priority2 = message2.getHeaders().getPriority(); priority1 = priority1 != null ? priority1 : MessagePriority.NORMAL; priority2 = priority2 != null ? priority2 : MessagePriority.NORMAL; return priority1.compareTo(priority2); } }
private MessageChannel resolveErrorChannel(Message<?> failedMessage) { if (this.defaultErrorChannel == null && this.channelResolver != null) { this.defaultErrorChannel = this.channelResolver.resolveChannelName( IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME); } if (failedMessage == null || failedMessage.getHeaders().getErrorChannel() == null) { return this.defaultErrorChannel; } Object errorChannelHeader = failedMessage.getHeaders().getErrorChannel(); if (errorChannelHeader instanceof MessageChannel) { return (MessageChannel) errorChannelHeader; } Assert.isInstanceOf(String.class, errorChannelHeader, "Unsupported error channel header type. Expected MessageChannel or String, but actual type is [" + errorChannelHeader.getClass() + "]"); return this.channelResolver.resolveChannelName((String) errorChannelHeader); }
@Override protected void processBarrier(MessageBarrier<List<Message<?>>> barrier) { if (!barrier.isComplete() && !CollectionUtils.isEmpty(barrier.getMessages())) { if (this.completionStrategy.isComplete(barrier.getMessages())) { barrier.setComplete(); } } if (barrier.isComplete()) { this.removeBarrier(barrier.getCorrelationKey()); Message<?> result = this.aggregateMessages(barrier.getMessages()); if (result != null) { if (result.getHeaders().getCorrelationId() == null) { result = MessageBuilder.fromMessage(result) .setCorrelationId(barrier.getCorrelationKey()) .build(); } this.sendReply(result, this.resolveReplyChannelFromMessage(barrier.getMessages().get(0))); } } }
String processId = ((ProcessContext) message.getHeaders().get(MessageRegistryConstants.MSG_HEADER_CTX)).getProcessId(); try { (String) message.getHeaders().get(MessageRegistryConstants.MSG_HEADER_ID), channels.size()-1); } catch (MessageRegistryException e) { .setSequenceNumber(sequenceNumber++) .setSequenceSize(sequenceSize) .setCorrelationId(message.getHeaders().getId()) .setHeader(MessageHeaders.ID, UUID.randomUUID()) .build()); .setSequenceNumber(sequenceNumber++) .setSequenceSize(sequenceSize) .setCorrelationId(message.getHeaders().getId()) .setHeader(MessageHeaders.ID, UUID.randomUUID()) .build();
@Override protected void processBarrier(MessageBarrier<SortedSet<Message<?>>> barrier) { if (hasReceivedAllMessages(barrier)) { barrier.setComplete(); } List<Message<?>> releasedMessages = releaseAvailableMessages(barrier); if (!CollectionUtils.isEmpty(releasedMessages)) { Message<?> lastMessage = releasedMessages.get(releasedMessages.size()-1); if (lastMessage.getHeaders().getSequenceNumber().equals(lastMessage.getHeaders().getSequenceSize())) { this.removeBarrier(barrier.getCorrelationKey()); } this.sendReplies(releasedMessages, this.resolveReplyChannelFromMessage(releasedMessages.get(0))); } }
.setSequenceNumber(sequenceNumber++) .setSequenceSize(sequenceSize) .setCorrelationId(message.getHeaders().getId()) .setHeader(MessageHeaders.ID, UUID.randomUUID()) .build();
@Override protected void handleRequestMessage(Message<?> requestMessage, ReplyMessageHolder replyMessageHolder) { if (requestMessage.getHeaders().getReplyChannel() == null) { this.verifyOutputChannel(); } replyMessageHolder.set(requestMessage); }
private List<Message<?>> releaseAvailableMessages(MessageBarrier<SortedSet<Message<?>>> barrier) { if (this.releasePartialSequences || barrier.isComplete()) { ArrayList<Message<?>> releasedMessages = new ArrayList<Message<?>>(); Iterator<Message<?>> it = barrier.getMessages().iterator(); Integer lastReleasedSequenceNumber = barrier.getAttribute(LAST_RELEASED_SEQUENCE_NUMBER); while (it.hasNext()) { Message<?> currentMessage = it.next(); if (lastReleasedSequenceNumber == currentMessage.getHeaders().getSequenceNumber() - 1) { releasedMessages.add(currentMessage); lastReleasedSequenceNumber = currentMessage.getHeaders().getSequenceNumber(); it.remove(); } else { break; } } barrier.setAttribute(LAST_RELEASED_SEQUENCE_NUMBER, lastReleasedSequenceNumber); return releasedMessages; } else { return new ArrayList<Message<?>>(); } }