@Override public void afterMessageHandled( Message<?> msg, MessageChannel ch, MessageHandler handler, @Nullable Exception ex) { Runnable task = (Runnable) msg.getHeaders().get(OrderedMessageSender.COMPLETION_TASK_HEADER); if (task != null) { task.run(); } } }
/** * A constructor accepting the headers of an existing message to copy. * @param message a message to copy the headers from, or {@code null} if none */ public MessageHeaderAccessor(@Nullable Message<?> message) { this.headers = new MutableMessageHeaders(message != null ? message.getHeaders() : null); }
@Override @Nullable protected String getDestination(Message<?> message) { return SimpMessageHeaderAccessor.getDestination(message.getHeaders()); }
/** * Encodes the given STOMP {@code message} into a {@code byte[]}. * @param message the message to encode * @return the encoded message */ public byte[] encode(Message<byte[]> message) { return encode(message.getHeaders(), message.getPayload()); }
@Override protected Object convertFromInternal(Message<?> message, Class<?> targetClass, @Nullable Object conversionHint) { Charset charset = getContentTypeCharset(getMimeType(message.getHeaders())); Object payload = message.getPayload(); return (payload instanceof String ? payload : new String((byte[]) payload, charset)); }
@Override public void afterSendCompletion( Message<?> message, MessageChannel channel, boolean sent, @Nullable Exception ex) { if (!sent) { SimpMessageType messageType = SimpMessageHeaderAccessor.getMessageType(message.getHeaders()); if (SimpMessageType.DISCONNECT.equals(messageType)) { logger.debug("Detected unsent DISCONNECT message. Processing anyway."); handleMessage(message); } } } }
@Override protected void addSubscriptionInternal( String sessionId, String subsId, String destination, Message<?> message) { Expression expression = getSelectorExpression(message.getHeaders()); this.subscriptionRegistry.addSubscription(sessionId, subsId, destination, expression); this.destinationCache.updateAfterNewSubscription(destination, sessionId, subsId); }
@Override public void handleMessage(Message<?> message) throws MessagingException { if (SimpMessageType.HEARTBEAT == SimpMessageHeaderAccessor.getMessageType(message.getHeaders())) { return; } this.queue.add(message); }
@Override public void handleMessage(Message<?> message) throws MessagingException { MessageChannel replyChannel = (MessageChannel) message.getHeaders().getReplyChannel(); replyChannel.send(new GenericMessage<>("response")); } });
@Test public void handleSubscribe() { given(this.brokerChannel.send(Mockito.any(Message.class))).willReturn(true); this.handler.handleMessage(createWith(SimpMessageType.SUBSCRIBE, "joe", SESSION_ID, "/user/queue/foo")); ArgumentCaptor<Message> captor = ArgumentCaptor.forClass(Message.class); Mockito.verify(this.brokerChannel).send(captor.capture()); Message message = captor.getValue(); assertEquals("/queue/foo-user123", SimpMessageHeaderAccessor.getDestination(message.getHeaders())); }
@Test public void toMessageUtf16() { MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); MimeType contentType = new MimeType("application", "json", StandardCharsets.UTF_16BE); Map<String, Object> map = new HashMap<>(); map.put(MessageHeaders.CONTENT_TYPE, contentType); MessageHeaders headers = new MessageHeaders(map); String payload = "H\u00e9llo W\u00f6rld"; Message<?> message = converter.toMessage(payload, headers); assertEquals("\"" + payload + "\"", new String((byte[]) message.getPayload(), StandardCharsets.UTF_16BE)); assertEquals(contentType, message.getHeaders().get(MessageHeaders.CONTENT_TYPE)); }
@Test public void toMessageWithPayloadAndHeaders() { MessageHeaders headers = new MessageHeaders(Collections.<String, Object>singletonMap("foo", "bar")); Message<?> message = this.converter.toMessage("payload", headers); assertEquals("payload", message.getPayload()); assertEquals("bar", message.getHeaders().get("foo")); }
@Test public void testHeaderValues() { Message<String> message = MessageBuilder.withPayload("test") .setHeader("foo", "bar") .setHeader("count", 123) .build(); assertEquals("bar", message.getHeaders().get("foo", String.class)); assertEquals(new Integer(123), message.getHeaders().get("count", Integer.class)); }
@Test public void createIdRegenerated() { Message<String> message1 = MessageBuilder.withPayload("test") .setHeader("foo", "bar").build(); Message<String> message2 = MessageBuilder.fromMessage(message1).setHeader("another", 1).build(); assertEquals("bar", message2.getHeaders().get("foo")); assertNotSame(message1.getHeaders().getId(), message2.getHeaders().getId()); }
@Test public void toMessageContentTypeHeader() { Message<?> message = this.converter.toMessage("ABC", null); assertEquals(MimeTypeUtils.TEXT_PLAIN, message.getHeaders().get(MessageHeaders.CONTENT_TYPE)); }
@Test public void toMessageWithPayloadAndMutableHeaders() { MessageHeaderAccessor accessor = new MessageHeaderAccessor(); accessor.setHeader("foo", "bar"); accessor.setLeaveMutable(true); MessageHeaders headers = accessor.getMessageHeaders(); Message<?> message = this.converter.toMessage("payload", headers); assertEquals("payload", message.getPayload()); assertSame(headers, message.getHeaders()); assertEquals("bar", message.getHeaders().get("foo")); } }
@Test public void jmsCorrelationIdIgnoredIfIncorrectType() throws JMSException { Message<String> message = initBuilder() .setHeader(JmsHeaders.CORRELATION_ID, new Date()).build(); javax.jms.Message jmsMessage = new StubTextMessage(); mapper.fromHeaders(message.getHeaders(), jmsMessage); assertNull(jmsMessage.getJMSCorrelationID()); }
@Test public void createFromMessage() { Message<String> message1 = MessageBuilder.withPayload("test") .setHeader("foo", "bar").build(); Message<String> message2 = MessageBuilder.fromMessage(message1).build(); assertEquals("test", message2.getPayload()); assertEquals("bar", message2.getHeaders().get("foo")); }
@Test public void convertAndSendPayloadWithPostProcessorToDestination() { this.template.convertAndSend("somewhere", "payload", this.postProcessor); assertEquals("somewhere", this.template.destination); assertNotNull(this.template.message); assertEquals("expected 'id' and 'timestamp' headers only", 2, this.template.message.getHeaders().size()); assertEquals("payload", this.template.message.getPayload()); assertNotNull(this.postProcessor.getMessage()); assertSame(this.template.message, this.postProcessor.getMessage()); }
@Test public void convertAndSendPayloadWithPostProcessor() { this.template.setDefaultDestination("home"); this.template.convertAndSend((Object) "payload", this.postProcessor); assertEquals("home", this.template.destination); assertNotNull(this.template.message); assertEquals("expected 'id' and 'timestamp' headers only", 2, this.template.message.getHeaders().size()); assertEquals("payload", this.template.message.getPayload()); assertNotNull(this.postProcessor.getMessage()); assertSame(this.template.message, this.postProcessor.getMessage()); }