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:
Gary Russell
2014-03-06 19:09:40 +02:00
committed by Artem Bilan
parent 4c775bce9d
commit ff845b5069
115 changed files with 1763 additions and 426 deletions

View File

@@ -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();
}

View File

@@ -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) {