
Using Logback 0.9.24 and SLF4J 1.6.1. I'm trying to resolve a hang problem with the ch.qos.logback.classic.net.SMTPAppender in an integration test and using SubethaSMTP as the email server. We have many tests working with SubethaSMTP that send emails, but not with Logback, so I know it works for the non-Logback configuration. I've also seen SMTPAppender work in a different situation to the production email server. So I think I have a config error somewhere with Logback setup to SubethaSMTP, but not sure what, or there is an issue in the LB & SS interaction. This is the SMTPAppender config: <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender"> <layout class="ch.qos.logback.classic.html.HTMLLayout"> <pattern>%date%contextName%thread%-5level%-55logger{55}%mdc%marker%msg</pattern> <throwableRenderer class="ch.qos.logback.classic.html.DefaultThrowableRenderer" /> </layout> <SMTPHost>${mail.host.name}</SMTPHost> <SMTPPort>${mail.port.number}</SMTPPort> <From>${batch.email.address.from}</From> <To>${batch.email.address.to.cmrdevelopers}</To> <Subject>${batch.email.subject.prefix}Log Email: %msg</Subject> <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator"> <marker>EMAIL_DEVS</marker> </evaluator> </appender> It hangs on call to SocketInputStream.socketRead0(), which is a native method. Anyone seen/solved this before? The timeout value is 0 on the socket read (means wait forever), so it is waiting for a response to read. While I'm trying to resolve this, one thing I'd like to do is set the timeout value so at least it doesn't hang. I'm not sure how to do that with SMTPAppender - anyone know how? The SMTPAppender/SMTPAppenderBase class does not have a timeout property, but SMTPAppenderBase does pull system properties. I'm hoping there is a config file-based approach to do this though... The following is a call stack captured in the Eclipse debugger; the next line-step would go into socketRead0() and hang. org.eclipse.jdt.internal.junit.runner.RemoteTestRunner at localhost:3598 Thread [main] (Suspended) SocketInputStream.read(byte[], int, int) line: 129 TraceInputStream.read(byte[], int, int) line: 97 BufferedInputStream.fill() line: 218 BufferedInputStream.read() line: 237 LineInputStream.readLine() line: 75 SMTPTransport.readServerResponse() line: 1440 SMTPTransport.openServer(String, int) line: 1260 SMTPTransport.protocolConnect(String, int, String, String) line: 370 SMTPTransport(Service).connect(String, int, String, String) line: 275 SMTPTransport(Service).connect(String, String, String) line: 156 SMTPTransport(Service).connect() line: 105 Transport.send0(Message, Address[]) line: 168 Transport.send(Message) line: 98 SMTPAppender(SMTPAppenderBase<E>).sendBuffer(E) line: 292 SMTPAppender(SMTPAppenderBase<E>).append(E) line: 159 SMTPAppender(AppenderBase<E>).doAppend(E) line: 85 AppenderAttachableImpl<E>.appendLoopOnAppenders(E) line: 64 Logger.appendLoopOnAppenders(ILoggingEvent) line: 283 Logger.callAppenders(ILoggingEvent) line: 270 Logger.buildLoggingEventAndAppend(String, Marker, Level, String, Object[], Throwable) line: 471 Logger.filterAndLog_0_Or3Plus(String, Marker, Level, String, Object[], Throwable) line: 425 Logger.error(Marker, String) line: 592 LoggerEmailTest.testEmailSend() line: 99 NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39 DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25 Method.invoke(Object, Object...) line: 597 FrameworkMethod$1.runReflectiveCall() line: 44 FrameworkMethod$1(ReflectiveCallable).run() line: 15 FrameworkMethod.invokeExplosively(Object, Object...) line: 41 InvokeMethod.evaluate() line: 20 RunBefores.evaluate() line: 28 RunBeforeTestMethodCallbacks.evaluate() line: 74 RunAfters.evaluate() line: 31 RunAfterTestMethodCallbacks.evaluate() line: 82 SpringRepeat.evaluate() line: 72 SpringJUnit4ClassRunner.runChild(FrameworkMethod, RunNotifier) line: 240 SpringJUnit4ClassRunner(BlockJUnit4ClassRunner).runChild(Object, RunNotifier) line: 50 ParentRunner$3.run() line: 193 ParentRunner$1.schedule(Runnable) line: 52 SpringJUnit4ClassRunner(ParentRunner<T>).runChildren(RunNotifier) line: 191 ParentRunner<T>.access$000(ParentRunner, RunNotifier) line: 42 ParentRunner$2.evaluate() line: 184 RunBeforeTestClassCallbacks.evaluate() line: 61 RunAfterTestClassCallbacks.evaluate() line: 70 SpringJUnit4ClassRunner(ParentRunner<T>).run(RunNotifier) line: 236 SpringJUnit4ClassRunner.run(RunNotifier) line: 180 JUnit4TestClassReference(JUnit4TestReference).run(TestExecution) line: 46 TestExecution.run(ITestReference[]) line: 38 RemoteTestRunner.runTests(String[], String, TestExecution) line: 467 RemoteTestRunner.runTests(TestExecution) line: 683 RemoteTestRunner.run() line: 390 RemoteTestRunner.main(String[]) line: 197 Thread [ReaderThread] (Running) Thread [org.subethamail.smtp.server.SMTPServer] (Running) Thread [org.subethamail.smtp.server.Session-/127.0.0.1:3601] (Running)