Q:

Problema ao tentar transferir arquivos utilizando a implementação de FTP do Apache em Java

Estou realizando transferência de arquivos via FTP utilizando JAVA.
Estou utilizando as classes FTPClient e FTPServer do Apache. Em um ambiente específico, algumas vezes os arquivos não são transferidos. Eu chamo o método enterLocalPassiveMode do FTPClient antes de chamar o método login e mesmo assim algumas vezes o arquivo não é transferido. 
O método storeFile do FTPCLient retorna "false". 
O método getReplyString do FTPClient retorna "200 Command TYPE okay".
O método list do FTPClient retorna "227".
Quando o arquivo é transferido com sucesso os retornos são os seguintes:
O método list do FTPCLlient retorna 150.
O método getReplyString do FTPClient retorna "150 File status okay; about to open data connection".
É algum problema de Firewall?
Eu tentei usar range de portas passivas no FTPServer usando o método setPassivePorts da classe DataConnectionConfigurationFactory, mas o problema continua.
Existe alguma forma de setar um range de portas no lado do cliente?
Como eu posso checar se a conexão realmente está utilizando o modo passivo?
Desde já, agradeço.

A:

É algum problema de Firewall?

Não tive como ter certeza. O correto seria desbloquear o firewall ou abrir uma exceção para a aplicação. Porém nenhuma das duas opções eram possíveis. O fato é que no ambiente de desenvolvimento não dá nenhum problema, mas no ambiente de produção ocorre. O que provavelmente está acontecendo é o firewall bloqueando as portas.

Existe alguma forma de setar um range de portas no lado do cliente? Como eu posso checar se a conexão realmente está utilizando o modo passivo?

É possível setar a porta que será utilizada pelo client no próprio método connect() do FTPClient:
this.getFtpClientUtil().connect(settingsService.getServer(), settingsService.getFtpServerCommandChannelPort(), 
                InetAddress.getLocalHost(), getLocalPort());

Sobre verificar se a conexão está utilizando o modo passivo, o método getPassivePort() do FTPClient irá retornar -1 se não estiver sendo utilizada a conexão passiva. Na pergunta, eu comentei que quando o arquivo não é enviado com sucesso, o método list() do FTPClient retorna o código 227. Esse código também é um indício que a conexão está em modo passivo. Eu estava imaginando que esse era o código do erro, mas na verdade ocorreu algum problema após entrar em modo passivo e foi retornado o reply do comando anterior, que nesse caso é o 227.
Apesar de estar configurando também a porta local, o problema continuava. Talvez porque a porta local que eu estou configurando é somente para o canal de comandos. As portas do canal de transferência continuam sendo aleatórias.
A solução foi tentar transferir o arquivo novamente. Se a transferência do arquivo falhar, eu desconecto o client, conecto novamente utilizando outras portas e tento transferir novamente. Em todos os testes que fiz, na segunda tentativa o arquivo é transferido com sucesso. Coloquei para tentar somente 3 vezes.
Ao se conectar novamente, se a mesma porta for utilizada poderá ser lançado um erro de "java.net.BindException: Address already in use". Mesmo após desconectar o client, a porta pode ficar presa por uns instantes. Nesse caso, eu verifico antes se a porta está em uso, e se for o caso, eu tento conectar o client em outra porta.

