INT-3309 Pluggable MessageBuilder
This is still a work in process. There are a bunch of TODOs in classes that are not managed by Spring and so need to have the MessageBuilderFactory injected. But I am looking for feedback on the approach. INT-3309 Resolve TODOs Provide access to the MessageBuilderFactory in all classes. INT-3309 Polishing + Tests * Fallback to 'fromMessage()' if mutating and inbound message is not MutableMessage * Add 'alwaysMutate' boolean to MutableMessageBuilderFactory - coerces 'fromMessage' calls to 'mutateMessage' * Add tests INT-3309 Polishing; PR Comments Also add tests to parent/child contexts where the parent has the default message builder and the child has a mutable message builder. INT-3309 More Polish; PR Comments Also fix removeHeader in MMB.
This commit is contained in:
committed by
Artem Bilan
parent
4c775bce9d
commit
ff845b5069
@@ -22,9 +22,13 @@ import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.messaging.Message;
|
||||
import org.springframework.integration.support.MessageBuilder;
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.beans.factory.BeanFactoryAware;
|
||||
import org.springframework.integration.context.IntegrationContextUtils;
|
||||
import org.springframework.integration.support.DefaultMessageBuilderFactory;
|
||||
import org.springframework.integration.support.MessageBuilderFactory;
|
||||
import org.springframework.integration.transformer.SyslogToMapTransformer;
|
||||
import org.springframework.messaging.Message;
|
||||
|
||||
/**
|
||||
* Default {@link MessageConverter}; delegates to a {@link SyslogToMapTransformer}
|
||||
@@ -35,13 +39,28 @@ import org.springframework.integration.transformer.SyslogToMapTransformer;
|
||||
* @since 3.0
|
||||
*
|
||||
*/
|
||||
public class DefaultMessageConverter implements MessageConverter {
|
||||
public class DefaultMessageConverter implements MessageConverter, BeanFactoryAware {
|
||||
|
||||
private final SyslogToMapTransformer transformer = new SyslogToMapTransformer();
|
||||
|
||||
public static final Set<String> SYSLOG_PAYLOAD_ENTRIES = new HashSet<String>(
|
||||
Arrays.asList(new String[] {SyslogToMapTransformer.MESSAGE, SyslogToMapTransformer.UNDECODED}));
|
||||
|
||||
private volatile BeanFactory beanFactory;
|
||||
|
||||
private volatile MessageBuilderFactory messageBuilderFactory = new DefaultMessageBuilderFactory();
|
||||
|
||||
|
||||
@Override
|
||||
public final void setBeanFactory(BeanFactory beanFactory) {
|
||||
this.beanFactory = beanFactory;
|
||||
this.messageBuilderFactory = IntegrationContextUtils.getMessageBuilderFactory(this.beanFactory);
|
||||
}
|
||||
|
||||
protected MessageBuilderFactory getMessageBuilderFactory() {
|
||||
return messageBuilderFactory;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Message<?> fromSyslog(Message<?> message) throws Exception {
|
||||
Map<String, ?> map = this.transformer.doTransform(message);
|
||||
@@ -52,7 +71,7 @@ public class DefaultMessageConverter implements MessageConverter {
|
||||
out.put(SyslogHeaders.PREFIX + entry.getKey(), entry.getValue());
|
||||
}
|
||||
}
|
||||
return MessageBuilder.withPayload(map)
|
||||
return this.messageBuilderFactory.withPayload(map)
|
||||
.copyHeaders(out)
|
||||
.build();
|
||||
}
|
||||
|
||||
@@ -42,6 +42,8 @@ public abstract class SyslogReceivingChannelAdapterSupport extends MessageProduc
|
||||
|
||||
private volatile MessageConverter converter = new DefaultMessageConverter();
|
||||
|
||||
private volatile boolean converterSet;
|
||||
|
||||
/**
|
||||
* @return The port on which this adapter listens.
|
||||
*/
|
||||
@@ -68,6 +70,15 @@ public abstract class SyslogReceivingChannelAdapterSupport extends MessageProduc
|
||||
*/
|
||||
public void setConverter(MessageConverter converter) {
|
||||
this.converter = converter;
|
||||
this.converterSet = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onInit() {
|
||||
super.onInit();
|
||||
if (!converterSet) {
|
||||
((DefaultMessageConverter) this.converter).setBeanFactory(this.getBeanFactory());
|
||||
}
|
||||
}
|
||||
|
||||
protected void convertAndSend(Message<?> message) {
|
||||
|
||||
Reference in New Issue
Block a user