我开发了一个基于Web的应用程序,允许客户端/用户将文件上传到JVM内存。服务器端代码然后FTP将文件发送到另一台服务器。这一切在我的本地机器上工作得很好,但我现在遇到问题,让它在我们的测试环境服务器上工作。
在测试环境服务器上,代码成功连接并登录到远程Windows服务器,但在文件传输期间挂起。在目标服务器上创建一个空文件,但不传输任何字节。来自JVM的堆栈跟踪最终杀死了该线程:
[10/08/11 14:45:24:234 BST] 00000003 ThreadMonitor W WSVR0605W: Thread "WebContainer : 2" (00000033) has been active for 666083 milliseconds and may be hung. There is/are 1 thread(s) in total in the server that may be hung.
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:431)
at java.net.ServerSocket.implAccept(ServerSocket.java:464)
at java.net.ServerSocket.accept(ServerSocket.java:432)
at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:693)
at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:551)
at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1704)
... (my own app code stack trace from here on down)
看起来像套接字问题,但任何人都可以帮我弄清楚问题出在哪台机器上?它是测试环境JVM还是目标Windows服务器?我猜它是测试环境服务器,否则我会在本地机器上看到这个问题?如果它在测试环境服务器上,是否需要打开端口(如果是这样,我要求什么)?任何最感谢的帮助。
答案 0 :(得分:2)
这听起来像是防火墙问题,可以通过为FTP客户端使用被动模式来解决。在活动模式下,FTP服务器在传输文件时尝试启动与FTP客户端的连接,防火墙/ WAS可能不喜欢。
根据公共ftpclient的docs,默认模式是ACTIVE,所以在你的代码中,尝试调用
ftpclient.enterLocalPassiveMode();
连接后,但在文件传输之前。