Kevin Gretener created CAMEL-21474:
--------------------------------------

             Summary: > Camel-SMBProducer is never disconnecting
                 Key: CAMEL-21474
                 URL: https://issues.apache.org/jira/browse/CAMEL-21474
             Project: Camel
          Issue Type: Bug
          Components: camel-smb
    Affects Versions: 4.8.1, 4.8.0, 4.7.0
            Reporter: Kevin Gretener


I'm using the SMB component as a producer, which was introduced in camel 4.7.0.

When I'm running my example route for more than 15 minutes, I noticed some 
exceptions in the log like this one:
{code:java}
from("scheduler://period20min?delay=1200000&repeatCount=12") //
    .setBody(constant("Lorem ipsum")) //
    .setHeader("CamelFileName", simple("Testfile${date:now:HH_mm_ss}.txt")) //
    .to("smb:localhost:445/Test?username=test&password=test"); {code}
 
{code:java}
com.hierynomus.protocol.transport.TransportException: java.net.SocketException: 
Connection reset
    at 
com.hierynomus.smbj.transport.tcp.direct.DirectTcpPacketReader.doRead(DirectTcpPacketReader.java:53)
    at 
com.hierynomus.smbj.transport.PacketReader.readPacket(PacketReader.java:75)
    at com.hierynomus.smbj.transport.PacketReader.run(PacketReader.java:53)
    at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: java.net.SocketException: Connection reset
    at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:318)
    at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:346)
    at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:796)
    at java.base/java.net.Socket$SocketInputStream.read(Socket.java:1099)
    at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:291)
    at java.base/java.io.BufferedInputStream.read1(BufferedInputStream.java:347)
    at 
java.base/java.io.BufferedInputStream.implRead(BufferedInputStream.java:420)
    at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:399)
    at 
com.hierynomus.smbj.transport.tcp.direct.DirectTcpPacketReader.readFully(DirectTcpPacketReader.java:70)
    at 
com.hierynomus.smbj.transport.tcp.direct.DirectTcpPacketReader.readTcpHeader(DirectTcpPacketReader.java:59)
    at 
com.hierynomus.smbj.transport.tcp.direct.DirectTcpPacketReader.doRead(DirectTcpPacketReader.java:48)
    ... 3 common frames omitted
 {code}
I found out this is related to this 
[issue|https://github.com/hierynomus/smbj/issues/365] in the SMBJ project. But 
at the same time I challenged why the connection is keeped open despite i'm 
currently not writing to the smb-fileshare. So I realized the disconnect-method 
on smbProducer is never called. I think it should be called from doStop(), 
otherwise the separated Thread of DirectTcpPacketReader.class never gets 
stopped.

 

*Workarounds*

First option: Call the disconnect-method manually and decrease the Logging-Level
{code:java}
.process(exchange -> {
  try (Producer producer = getCamelContext()
      .getEndpoint("smb:localhost:445/Test?username=test&password=test")
      .createProducer()) {
    producer.start();
    producer.process(exchange);
    producer.stop();
    if (producer instanceof SmbProducer smbProducer) {
      smbProducer.disconnect(); // Should be called from SmbProducer.doStop()
    } else {
      log.warn("Producer is not an instance of SmbProducer instead:{}", 
producer.getClass().getName());
    }
}}) {code}
Second Option: Use the camel-jcifs component of the camel-extra project.

*Expected Behaviour*

After writing a file with the smbProducer the connection should be closed and 
no Warning/Info logs about timeouts or unclosed sessions are written.

 

*Additional Information*

SmbConsumers SessionHandling was updated by CAMEL-21263, probably a similar 
solution would work for the producer.

Other improvements are planned with CAMEL-21352.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to