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)