From 29bd9e981f65e3174f0ce933ebf07173dd90009b Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Sun, 23 Feb 2014 13:37:15 -0500 Subject: [PATCH] INT-3310 Fix Syslog Error on Socket Close https://jira.springsource.org/browse/INT-3310 Previously, the syslog adapter tried to convert the ErrorMessage that results from a socket error to a syslog packet, resulting in a stack trace on stderr. Test for the ErrorMessage and log at DEBUG. --- .../SyslogReceivingChannelAdapterSupport.java | 13 +++++++++-- .../SyslogReceivingChannelAdapterTests.java | 23 ++++++++++++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/spring-integration-syslog/src/main/java/org/springframework/integration/syslog/inbound/SyslogReceivingChannelAdapterSupport.java b/spring-integration-syslog/src/main/java/org/springframework/integration/syslog/inbound/SyslogReceivingChannelAdapterSupport.java index 3090b944ed..d88b1d6e4d 100644 --- a/spring-integration-syslog/src/main/java/org/springframework/integration/syslog/inbound/SyslogReceivingChannelAdapterSupport.java +++ b/spring-integration-syslog/src/main/java/org/springframework/integration/syslog/inbound/SyslogReceivingChannelAdapterSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 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. @@ -17,9 +17,11 @@ package org.springframework.integration.syslog.inbound; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import org.springframework.integration.Message; import org.springframework.integration.MessagingException; import org.springframework.integration.endpoint.MessageProducerSupport; +import org.springframework.integration.message.ErrorMessage; import org.springframework.integration.syslog.DefaultMessageConverter; import org.springframework.integration.syslog.MessageConverter; @@ -70,7 +72,14 @@ public abstract class SyslogReceivingChannelAdapterSupport extends MessageProduc protected void convertAndSend(Message message) { try { - this.sendMessage(this.converter.fromSyslog(message)); + if (message instanceof ErrorMessage) { + if (logger.isDebugEnabled()) { + logger.debug("Error on syslog socket:" + ((ErrorMessage) message).getPayload().getMessage()); + } + } + else { + this.sendMessage(this.converter.fromSyslog(message)); + } } catch (Exception e) { throw new MessagingException(message, e); 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 a4551aff85..8abb4792d8 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 @@ -19,8 +19,11 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import java.net.DatagramPacket; import java.net.DatagramSocket; @@ -31,10 +34,12 @@ import java.util.concurrent.TimeUnit; import javax.net.SocketFactory; +import org.apache.commons.logging.Log; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; +import org.springframework.beans.DirectFieldAccessor; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEventPublisher; import org.springframework.integration.Message; @@ -42,7 +47,7 @@ import org.springframework.integration.channel.QueueChannel; import org.springframework.integration.core.PollableChannel; import org.springframework.integration.syslog.config.SyslogReceivingChannelAdapterFactoryBean; import org.springframework.integration.test.util.SocketUtils; - +import org.springframework.integration.test.util.TestUtils; /** * @author Gary Russell * @since 3.0 @@ -95,11 +100,27 @@ public class SyslogReceivingChannelAdapterTests { factory.afterPropertiesSet(); factory.start(); TcpSyslogReceivingChannelAdapter adapter = (TcpSyslogReceivingChannelAdapter) factory.getObject(); + Log logger = spy(TestUtils.getPropertyValue(adapter, "logger", Log.class)); + doReturn(true).when(logger).isDebugEnabled(); + final CountDownLatch sawLog = new CountDownLatch(1); + doAnswer(new Answer(){ + + @Override + public Void answer(InvocationOnMock invocation) throws Throwable { + if (((String) invocation.getArguments()[0]).contains("Error on syslog socket")) { + sawLog.countDown(); + } + invocation.callRealMethod(); + return null; + } + }).when(logger).debug(anyString()); + new DirectFieldAccessor(adapter).setPropertyValue("logger", logger); Thread.sleep(1000); byte[] buf = "<157>JUL 26 22:08:35 WEBERN TESTING[70729]: TEST SYSLOG MESSAGE\n".getBytes("UTF-8"); Socket socket = SocketFactory.getDefault().createSocket("localhost", port); socket.getOutputStream().write(buf); socket.close(); + assertTrue(sawLog.await(10, TimeUnit.SECONDS)); Message message = outputChannel.receive(10000); assertNotNull(message); assertEquals("WEBERN", message.getHeaders().get("syslog_HOST"));