先出结论:如果你的ChannelSftp抛了异常,但又没有明确的报错(例如:no such file等),那么很可能就是因为你的SFtpUtils非线程安全导致的。
如题,这两天生产环境中持续出现了SFtpUtils调用判断文件是否存在的方法(ChannelSftp.stat())出现异常的情况。如下:
找了一天国内外各大网站,都没有对这个报错很好的解答。
其实这两个问题都是因为ChannelSftp以及Channel并非线程安全导致的,复现demo如下:
使用多线程去调用SFtpUtils会随机报错,2,4等等。
提供两种解决思路:一是把ChannelSftp和Channel放到ThreadLocal中,每个线程要使用时,先初始化ThreadLocal中的ChannelSftp及Channel,再进行具体的方法调用。二是把调用的方法加上锁。