public MutableMessage(T payload, @Nullable Map<String, Object> headers) { this(payload, new MutableMessageHeaders(headers)); }
@Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj != null && obj instanceof MutableMessage<?>) { MutableMessage<?> other = (MutableMessage<?>) obj; UUID thisId = this.headers.getId(); UUID otherId = other.headers.getId(); return (ObjectUtils.nullSafeEquals(thisId, otherId) && this.headers.equals(other.headers) && this.payload.equals(other.payload)); } return false; }
Map<String, Object> getRawHeaders() { return this.headers.getRawHeaders(); }
public MutableMessageHeaders(@Nullable Map<String, Object> headers) { super(headers, extractId(headers), extractTimestamp(headers)); }
@Test public void testMessageHeaderIsSettable() { Object payload = new Object(); Map<String, Object> headerMap = new HashMap<>(); Map<String, Object> additional = new HashMap<>(); MutableMessage<Object> mutableMessage = new MutableMessage<>(payload, headerMap); MutableMessageHeaders headers = mutableMessage.getHeaders(); // Should not throw an UnsupportedOperationException headers.put("foo", "bar"); headers.put("eep", "bar"); headers.remove("eep"); headers.putAll(additional); assertThat(headers.getRawHeaders(), hasEntry("foo", "bar")); }
.transform(new GenericTransformer<Message<String>, Message<String>>() { @Override public Message<String> transform(Message<String> message) { //incorrectly instantiated MutableMessageHeaders headers = new MutableMessageHeaders(); headers.put("Content-Type", "application/json"); headers.put("Accept", "application/json"); Message<String> request = new GenericMessage<String>(json.toString(), headers); return request; } })
@Test public void testMessageHeaderIsSerializable() { Object payload = new Object(); UUID uuid = UUID.nameUUIDFromBytes(((System.currentTimeMillis() - System.nanoTime()) + "").getBytes()); Long timestamp = System.currentTimeMillis(); // UUID as String; timestamp as String Map<String, Object> headerMapStrings = new HashMap<>(); headerMapStrings.put(MessageHeaders.ID, uuid.toString()); headerMapStrings.put(MessageHeaders.TIMESTAMP, timestamp.toString()); MutableMessage<Object> mutableMessageStrings = new MutableMessage<>(payload, headerMapStrings); assertEquals(uuid, mutableMessageStrings.getHeaders().getId()); assertEquals(timestamp, mutableMessageStrings.getHeaders().getTimestamp()); // UUID as byte[]; timestamp as Long Map<String, Object> headerMapByte = new HashMap<>(); byte[] uuidAsBytes = ByteBuffer.allocate(16) .putLong(uuid.getMostSignificantBits()) .putLong(uuid.getLeastSignificantBits()) .array(); headerMapByte.put(MessageHeaders.ID, uuidAsBytes); headerMapByte.put(MessageHeaders.TIMESTAMP, timestamp); MutableMessage<Object> mutableMessageBytes = new MutableMessage<>(payload, headerMapByte); assertEquals(uuid, mutableMessageBytes.getHeaders().getId()); assertEquals(timestamp, mutableMessageBytes.getHeaders().getTimestamp()); }
public static void putSendResult(MutableMessage message, SendResult sendResult) { message.getHeaders().put(ROCKET_SEND_RESULT, sendResult); }
@Override public int hashCode() { return this.headers.hashCode() * 23 + ObjectUtils.nullSafeHashCode(this.payload); }
public MutableMessageHeaders(@Nullable Map<String, Object> headers) { super(headers, extractId(headers), extractTimestamp(headers)); }
public static void putSendResult(MutableMessage message, SendResult sendResult) { message.getHeaders().put(ROCKET_SEND_RESULT, sendResult); }
@Override public int hashCode() { return this.headers.hashCode() * 23 + ObjectUtils.nullSafeHashCode(this.payload); }
@Override public MessageHeaders read(Kryo kryo, Input input, Class<MessageHeaders> type) { @SuppressWarnings("unchecked") Map<String, Object> headers = kryo.readObject(input, HashMap.class); return new MutableMessageHeaders(headers); }
@Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj != null && obj instanceof MutableMessage<?>) { MutableMessage<?> other = (MutableMessage<?>) obj; UUID thisId = this.headers.getId(); UUID otherId = other.headers.getId(); return (ObjectUtils.nullSafeEquals(thisId, otherId) && this.headers.equals(other.headers) && this.payload.equals(other.payload)); } return false; }
@Test public void testMessageIdTimestampRemains() { UUID uuid = UUID.randomUUID(); long timestamp = System.currentTimeMillis(); Object payload = new Object(); Map<String, Object> headerMap = new HashMap<>(); headerMap.put(MessageHeaders.ID, uuid); headerMap.put(MessageHeaders.TIMESTAMP, timestamp); MutableMessage<Object> mutableMessage = new MutableMessage<>(payload, headerMap); MutableMessageHeaders headers = mutableMessage.getHeaders(); assertThat(headers.getRawHeaders(), hasEntry(MessageHeaders.ID, uuid)); assertThat(headers.getRawHeaders(), hasEntry(MessageHeaders.TIMESTAMP, timestamp)); }
@Override public T convert(JsonNode root, DeserializationContext ctxt) throws IOException { Map<String, Object> headers = this.mapper.readValue(root.get("headers").traverse(), TypeFactory.defaultInstance().constructMapType(HashMap.class, String.class, Object.class)); Object payload = this.mapper.readValue(root.get("payload").traverse(), this.payloadType); return buildMessage(new MutableMessageHeaders(headers), payload, root, ctxt); }
Map<String, Object> getRawHeaders() { return this.headers.getRawHeaders(); }
return new GenericMessage<>(payload, new MutableMessageHeaders(headers));
/** * Create a builder for a new {@link Message} instance with the provided payload. * The {@code generateHeaders} flag allows to disable {@link MessageHeaders#ID} * and {@link MessageHeaders#TIMESTAMP} headers generation. * @param payload the payload for the new message * @param generateHeaders whether generate {@link MessageHeaders#ID} * and {@link MessageHeaders#TIMESTAMP} headers * @param <T> The type of the payload. * @return A MutableMessageBuilder. * @since 5.0 */ public static <T> MutableMessageBuilder<T> withPayload(T payload, boolean generateHeaders) { MutableMessage<T> message; if (generateHeaders) { message = new MutableMessage<>(payload); } else { message = new MutableMessage<>(payload, new MutableMessageHeaders(null, MessageHeaders.ID_VALUE_NONE, -1L)); } return fromMessage(message); }
@SuppressWarnings("unchecked") @Override public Message<?> toMessage(TcpConnection connection, @Nullable Map<String, Object> headers) throws Exception { Message<Object> message = null; Object payload = connection.getPayload(); if (payload != null) { AbstractIntegrationMessageBuilder<Object> messageBuilder; if (this.bytesMessageMapper != null && payload instanceof byte[]) { messageBuilder = (AbstractIntegrationMessageBuilder<Object>) getMessageBuilderFactory() .fromMessage(this.bytesMessageMapper.toMessage((byte[]) payload)); } else { messageBuilder = getMessageBuilderFactory() .withPayload(payload); } MessageHeaders messageHeaders = new MutableMessageHeaders(null); addStandardHeaders(connection, messageHeaders); addCustomHeaders(connection, messageHeaders); message = messageBuilder .copyHeaders(messageHeaders) .copyHeadersIfAbsent(headers) .build(); } else { if (this.logger.isWarnEnabled()) { this.logger.warn("Null payload from connection " + connection.getConnectionId()); } } return message; }