diff --git a/spring-integration-syslog/src/main/java/org/springframework/integration/syslog/DefaultMessageConverter.java b/spring-integration-syslog/src/main/java/org/springframework/integration/syslog/DefaultMessageConverter.java
index a705bca975..f4bac2f576 100644
--- a/spring-integration-syslog/src/main/java/org/springframework/integration/syslog/DefaultMessageConverter.java
+++ b/spring-integration-syslog/src/main/java/org/springframework/integration/syslog/DefaultMessageConverter.java
@@ -31,11 +31,11 @@ import org.springframework.integration.transformer.SyslogToMapTransformer;
import org.springframework.messaging.Message;
/**
- * Default {@link MessageConverter}; delegates to a {@link SyslogToMapTransformer}
- * to convert the payload to a map of values and also provides some of the map
- * contents as message headers.
- * See @link {@link SyslogHeaders} for the headers that are mapped.
+ * Default {@link MessageConverter}; delegates to a {@link SyslogToMapTransformer} to
+ * convert the payload to a map of values and also provides some of the map contents as
+ * message headers. See @link {@link SyslogHeaders} for the headers that are mapped.
* @author Gary Russell
+ * @author David Liu
* @since 3.0
*
*/
@@ -50,6 +50,15 @@ public class DefaultMessageConverter implements MessageConverter, BeanFactoryAwa
private volatile MessageBuilderFactory messageBuilderFactory = new DefaultMessageBuilderFactory();
+ private volatile boolean asMap = true;
+
+ /**
+ * Set false will leave the payload as the original complete syslog.
+ * @param asMap
+ */
+ public void setAsMap(boolean asMap) {
+ this.asMap = asMap;
+ }
@Override
public final void setBeanFactory(BeanFactory beanFactory) {
@@ -71,7 +80,7 @@ public class DefaultMessageConverter implements MessageConverter, BeanFactoryAwa
out.put(SyslogHeaders.PREFIX + entry.getKey(), entry.getValue());
}
}
- return this.messageBuilderFactory.withPayload(map)
+ return this.messageBuilderFactory.withPayload(this.asMap ? map : message.getPayload())
.copyHeaders(out)
.build();
}
diff --git a/spring-integration-syslog/src/test/java/org/springframework/integration/syslog/inbound/SyslogReceivingChannelAdapterTests.java b/spring-integration-syslog/src/test/java/org/springframework/integration/syslog/inbound/SyslogReceivingChannelAdapterTests.java
index 8ad2439a21..4d70c5194f 100644
--- a/spring-integration-syslog/src/test/java/org/springframework/integration/syslog/inbound/SyslogReceivingChannelAdapterTests.java
+++ b/spring-integration-syslog/src/test/java/org/springframework/integration/syslog/inbound/SyslogReceivingChannelAdapterTests.java
@@ -44,6 +44,7 @@ import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.integration.channel.QueueChannel;
+import org.springframework.integration.syslog.DefaultMessageConverter;
import org.springframework.integration.syslog.config.SyslogReceivingChannelAdapterFactoryBean;
import org.springframework.integration.test.util.SocketUtils;
import org.springframework.integration.test.util.TestUtils;
@@ -52,6 +53,7 @@ import org.springframework.messaging.PollableChannel;
/**
* @author Gary Russell
+ * @author David Liu
* @since 3.0
*
*/
@@ -132,4 +134,33 @@ public class SyslogReceivingChannelAdapterTests {
assertTrue(latch.await(10, TimeUnit.SECONDS));
}
+ @Test
+ public void testAsMapFalse() throws Exception {
+ SyslogReceivingChannelAdapterFactoryBean factory = new SyslogReceivingChannelAdapterFactoryBean(
+ SyslogReceivingChannelAdapterFactoryBean.Protocol.udp);
+ int port = SocketUtils.findAvailableUdpSocket(1514);
+ factory.setPort(port);
+ PollableChannel outputChannel = new QueueChannel();
+ factory.setOutputChannel(outputChannel);
+ factory.setBeanFactory(mock(BeanFactory.class));
+ factory.afterPropertiesSet();
+ factory.start();
+ UdpSyslogReceivingChannelAdapter adapter = (UdpSyslogReceivingChannelAdapter) factory.getObject();
+ DefaultMessageConverter defaultMessageConverter = new DefaultMessageConverter();
+ defaultMessageConverter.setAsMap(false);
+ adapter.setConverter(defaultMessageConverter);
+ Thread.sleep(1000);
+ byte[] buf = "<157>JUL 26 22:08:35 WEBERN TESTING[70729]: TEST SYSLOG MESSAGE".getBytes("UTF-8");
+ DatagramPacket packet = new DatagramPacket(buf, buf.length, new InetSocketAddress("localhost", port));
+ DatagramSocket socket = new DatagramSocket();
+ socket.send(packet);
+ socket.close();
+ Message> message = outputChannel.receive(10000);
+ assertNotNull(message);
+ assertEquals("WEBERN", message.getHeaders().get("syslog_HOST"));
+ assertEquals("<157>JUL 26 22:08:35 WEBERN TESTING[70729]: TEST SYSLOG MESSAGE",
+ new String((byte[]) message.getPayload(), "UTF-8"));
+ adapter.stop();
+ }
+
}
diff --git a/src/reference/docbook/syslog.xml b/src/reference/docbook/syslog.xml
index 3d3b83e9d4..c5727ad440 100644
--- a/src/reference/docbook/syslog.xml
+++ b/src/reference/docbook/syslog.xml
@@ -28,6 +28,13 @@
being the Map of Syslog fields. In addition, all fields except the message
are also made available as headers in the message, prefixed with syslog_.
+
+ Since version 4.1,
+ the DefaultMessageConverter has a property asMap
+ (default true); when it is false, the converter will leave
+ the message payload as the original complete syslog message, in a byte[],
+ while still setting the headers.
+
Example Configuration
]]>
diff --git a/src/reference/docbook/whats-new.xml b/src/reference/docbook/whats-new.xml
index 22257840b5..51e5265446 100644
--- a/src/reference/docbook/whats-new.xml
+++ b/src/reference/docbook/whats-new.xml
@@ -169,6 +169,13 @@
for the JSON transformers. See for more information.
-
+
+ Syslog Adapter
+
+ The default syslog message converter now has an option to retain the original message in
+ the payload, while still setting the headers.
+ See for more information.
+
+