Lazy resolution of the JMS message
Previously, any `javax.jms.Message` was converted eagerly to the Message abstraction. This leads to unnecessary conversion if the Payload is not requested by the underlying method (i.e. if the `javax.jms.Message` is injected directly). This commit returns a `Message` implementation that holds the `javax.jms.Message` and lazily resolve the payload or the headers on demand (that is the first time they are requested). Issue: SPR-13777
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2015 the original author or authors.
|
||||
* Copyright 2002-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -16,7 +16,6 @@
|
||||
|
||||
package org.springframework.jms.support.converter;
|
||||
|
||||
import java.util.Map;
|
||||
import javax.jms.JMSException;
|
||||
import javax.jms.Session;
|
||||
|
||||
@@ -24,7 +23,7 @@ import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.jms.support.JmsHeaderMapper;
|
||||
import org.springframework.jms.support.SimpleJmsHeaderMapper;
|
||||
import org.springframework.messaging.Message;
|
||||
import org.springframework.messaging.support.MessageBuilder;
|
||||
import org.springframework.messaging.MessageHeaders;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
@@ -104,12 +103,7 @@ public class MessagingMessageConverter implements MessageConverter, Initializing
|
||||
if (message == null) {
|
||||
return null;
|
||||
}
|
||||
Map<String, Object> mappedHeaders = this.headerMapper.toHeaders(message);
|
||||
Object convertedObject = extractPayload(message);
|
||||
MessageBuilder<Object> builder = (convertedObject instanceof org.springframework.messaging.Message) ?
|
||||
MessageBuilder.fromMessage((org.springframework.messaging.Message<Object>) convertedObject) :
|
||||
MessageBuilder.withPayload(convertedObject);
|
||||
return builder.copyHeadersIfAbsent(mappedHeaders).build();
|
||||
return new LazyResolutionMessage(message);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -127,4 +121,44 @@ public class MessagingMessageConverter implements MessageConverter, Initializing
|
||||
return this.payloadConverter.toMessage(payload, session);
|
||||
}
|
||||
|
||||
private MessageHeaders extractHeaders(javax.jms.Message message) {
|
||||
return this.headerMapper.toHeaders(message);
|
||||
}
|
||||
|
||||
|
||||
private class LazyResolutionMessage implements Message<Object> {
|
||||
|
||||
private final javax.jms.Message message;
|
||||
|
||||
private Object payload;
|
||||
|
||||
private MessageHeaders headers;
|
||||
|
||||
public LazyResolutionMessage(javax.jms.Message message) {
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getPayload() {
|
||||
if (this.payload == null) {
|
||||
try {
|
||||
this.payload = extractPayload(this.message);
|
||||
}
|
||||
catch (JMSException ex) {
|
||||
throw new MessageConversionException(
|
||||
"Failed to extract payload from [" + this.message + "]", ex);
|
||||
}
|
||||
}
|
||||
return this.payload;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageHeaders getHeaders() {
|
||||
if (this.headers == null) {
|
||||
this.headers = extractHeaders(this.message);
|
||||
}
|
||||
return this.headers;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user