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. + +