Author: davsclaus Date: Tue Jul 6 15:16:00 2010 New Revision: 960914 URL: http://svn.apache.org/viewvc?rev=960914&view=rev Log: CAMEL-2912: Added timeout options to camel-ftp to make it easier to configure timeouts instead of messing with ftpClient properties. Also connect timeout is now possible with SFTP.
Added: camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeout2Test.java - copied, changed from r960894, camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeoutTest.java camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConnectTimeoutTest.java (contents, props changed) - copied, changed from r960894, camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientDataTimeoutTest.java Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpOperations.java camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpEndpoint.java camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java?rev=960914&r1=960913&r2=960914&view=diff ============================================================================== --- camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java (original) +++ camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpEndpoint.java Tue Jul 6 15:16:00 2010 @@ -37,6 +37,7 @@ public class FtpEndpoint<T extends FTPFi protected Map<String, Object> ftpClientParameters; protected Map<String, Object> ftpClientConfigParameters; protected int soTimeout; + protected int dataTimeout; public FtpEndpoint() { } @@ -51,6 +52,11 @@ public class FtpEndpoint<T extends FTPFi } @Override + public RemoteFileConfiguration getConfiguration() { + return (RemoteFileConfiguration) super.getConfiguration(); + } + + @Override protected RemoteFileConsumer<FTPFile> buildConsumer(Processor processor) { try { return new FtpConsumer(this, processor, createRemoteFileOperations()); @@ -76,12 +82,27 @@ public class FtpEndpoint<T extends FTPFi client = createFtpClient(); } + // set any endpoint configured timeouts + if (getConfiguration().getConnectTimeout() > -1) { + client.setConnectTimeout(getConfiguration().getConnectTimeout()); + } + if (getConfiguration().getSoTimeout() > -1) { + soTimeout = getConfiguration().getSoTimeout(); + } + dataTimeout = getConfiguration().getTimeout(); + + // then lookup ftp client parameters and set those if (ftpClientParameters != null) { // setting soTimeout has to be done later on FTPClient (after it has connected) Object timeout = ftpClientParameters.remove("soTimeout"); if (timeout != null) { soTimeout = getCamelContext().getTypeConverter().convertTo(int.class, timeout); } + // and we want to keep data timeout so we can log it later + timeout = ftpClientParameters.remove("dataTimeout"); + if (timeout != null) { + dataTimeout = getCamelContext().getTypeConverter().convertTo(int.class, dataTimeout); + } IntrospectionSupport.setProperties(client, ftpClientParameters); } @@ -93,6 +114,14 @@ public class FtpEndpoint<T extends FTPFi IntrospectionSupport.setProperties(ftpClientConfig, ftpClientConfigParameters); } + if (dataTimeout > 0) { + client.setDataTimeout(dataTimeout); + } + + if (log.isDebugEnabled()) { + log.debug("Created FTPClient [connectTimeout: " + client.getConnectTimeout() + ", soTimeout: " + getSoTimeout() + ", dataTimeout: " + dataTimeout + "]: " + client); + } + FtpOperations operations = new FtpOperations(client, getFtpClientConfig()); operations.setEndpoint(this); return operations; @@ -137,7 +166,9 @@ public class FtpEndpoint<T extends FTPFi } /** - * Sets the soTimeout option to be used by FTPClient. + * Sets the soTimeout option. + * <p/> + * Used by FTPClient */ public void setSoTimeout(int soTimeout) { this.soTimeout = soTimeout; Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpOperations.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpOperations.java?rev=960914&r1=960913&r2=960914&view=diff ============================================================================== --- camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpOperations.java (original) +++ camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpOperations.java Tue Jul 6 15:16:00 2010 @@ -77,7 +77,7 @@ public class FtpOperations implements Re } if (log.isTraceEnabled()) { - log.trace("Connecting to " + configuration.remoteServerInformation()); + log.trace("Connecting to " + configuration.remoteServerInformation() + " using connection timeout: " + client.getConnectTimeout()); } boolean connected = false; Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java?rev=960914&r1=960913&r2=960914&view=diff ============================================================================== --- camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java (original) +++ camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpsEndpoint.java Tue Jul 6 15:16:00 2010 @@ -42,6 +42,7 @@ public class FtpsEndpoint extends FtpEnd protected Map<String, Object> ftpClientTrustStoreParameters; public FtpsEndpoint() { + super(); } public FtpsEndpoint(String uri, RemoteFileComponent<FTPFile> remoteFileComponent, RemoteFileConfiguration configuration) { @@ -120,12 +121,26 @@ public class FtpsEndpoint extends FtpEnd client = (FTPSClient) createFtpClient(); } + // set any endpoint configured timeouts + if (getConfiguration().getConnectTimeout() > -1) { + client.setConnectTimeout(getConfiguration().getConnectTimeout()); + } + if (getConfiguration().getSoTimeout() > -1) { + soTimeout = getConfiguration().getSoTimeout(); + } + dataTimeout = getConfiguration().getTimeout(); + if (ftpClientParameters != null) { // setting soTimeout has to be done later on FTPClient (after it has connected) Object timeout = ftpClientParameters.remove("soTimeout"); if (timeout != null) { soTimeout = getCamelContext().getTypeConverter().convertTo(int.class, timeout); } + // and we want to keep data timeout so we can log it later + timeout = ftpClientParameters.remove("dataTimeout"); + if (timeout != null) { + dataTimeout = getCamelContext().getTypeConverter().convertTo(int.class, dataTimeout); + } IntrospectionSupport.setProperties(client, ftpClientParameters); } @@ -137,6 +152,14 @@ public class FtpsEndpoint extends FtpEnd IntrospectionSupport.setProperties(ftpClientConfig, ftpClientConfigParameters); } + if (dataTimeout > 0) { + client.setDataTimeout(dataTimeout); + } + + if (log.isDebugEnabled()) { + log.debug("Created FTPSClient [connectTimeout: " + client.getConnectTimeout() + ", soTimeout: " + getSoTimeout() + ", dataTimeout: " + dataTimeout + "]: " + client); + } + FtpsOperations operations = new FtpsOperations(client, getFtpClientConfig()); operations.setEndpoint(this); return operations; Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java?rev=960914&r1=960913&r2=960914&view=diff ============================================================================== --- camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java (original) +++ camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileConfiguration.java Tue Jul 6 15:16:00 2010 @@ -31,6 +31,9 @@ public abstract class RemoteFileConfigur private String password; private boolean binary; private boolean passiveMode; + private int connectTimeout = 10000; + private int timeout = 30000; + private int soTimeout; public RemoteFileConfiguration() { } @@ -127,4 +130,42 @@ public abstract class RemoteFileConfigur this.passiveMode = passiveMode; } + public int getConnectTimeout() { + return connectTimeout; + } + + /** + * Sets the connect timeout for waiting for a connection to be established + * <p/> + * Used by both FTPClient and JSCH + */ + public void setConnectTimeout(int connectTimeout) { + this.connectTimeout = connectTimeout; + } + + public int getTimeout() { + return timeout; + } + + /** + * Sets the data timeout for waiting for reply + * <p/> + * Used only by FTPClient + */ + public void setTimeout(int timeout) { + this.timeout = timeout; + } + + public int getSoTimeout() { + return soTimeout; + } + + /** + * Sets the so timeout + * <p/> + * Used only by FTPClient + */ + public void setSoTimeout(int soTimeout) { + this.soTimeout = soTimeout; + } } Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java?rev=960914&r1=960913&r2=960914&view=diff ============================================================================== --- camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java (original) +++ camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/RemoteFileEndpoint.java Tue Jul 6 15:16:00 2010 @@ -19,6 +19,7 @@ package org.apache.camel.component.file. import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.apache.camel.component.file.GenericFile; +import org.apache.camel.component.file.GenericFileConfiguration; import org.apache.camel.component.file.GenericFileEndpoint; import org.apache.camel.component.file.GenericFileProducer; import org.apache.camel.impl.DefaultExchange; @@ -44,6 +45,11 @@ public abstract class RemoteFileEndpoint } @Override + public RemoteFileConfiguration getConfiguration() { + return (RemoteFileConfiguration) this.configuration; + } + + @Override public Exchange createExchange(GenericFile<T> file) { Exchange answer = new DefaultExchange(this); if (file != null) { Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpEndpoint.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpEndpoint.java?rev=960914&r1=960913&r2=960914&view=diff ============================================================================== --- camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpEndpoint.java (original) +++ camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpEndpoint.java Tue Jul 6 15:16:00 2010 @@ -18,6 +18,7 @@ package org.apache.camel.component.file. import com.jcraft.jsch.ChannelSftp; import org.apache.camel.Processor; +import org.apache.camel.component.file.GenericFileConfiguration; import org.apache.camel.component.file.GenericFileProducer; /** @@ -33,6 +34,11 @@ public class SftpEndpoint extends Remote } @Override + public RemoteFileConfiguration getConfiguration() { + return (RemoteFileConfiguration) super.getConfiguration(); + } + + @Override protected RemoteFileConsumer<ChannelSftp.LsEntry> buildConsumer(Processor processor) { return new SftpConsumer(this, processor, createRemoteFileOperations()); } Modified: camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java?rev=960914&r1=960913&r2=960914&view=diff ============================================================================== --- camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java (original) +++ camel/trunk/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java Tue Jul 6 15:16:00 2010 @@ -80,11 +80,25 @@ public class SftpOperations implements R if (session == null || !session.isConnected()) { LOG.trace("Session isn't connected, trying to recreate and connect."); session = createSession(configuration); - session.connect(); + if (endpoint.getConfiguration().getConnectTimeout() > 0) { + LOG.trace("Connecting use connectTimeout: " + endpoint.getConfiguration().getConnectTimeout() + " ..."); + session.connect(endpoint.getConfiguration().getConnectTimeout()); + } else { + LOG.trace("Connecting ..."); + session.connect(); + } } + LOG.trace("Channel isn't connected, trying to recreate and connect."); channel = (ChannelSftp) session.openChannel("sftp"); - channel.connect(); + + if (endpoint.getConfiguration().getConnectTimeout() > 0) { + LOG.trace("Connecting use connectTimeout: " + endpoint.getConfiguration().getConnectTimeout() + " ..."); + channel.connect(endpoint.getConfiguration().getConnectTimeout()); + } else { + LOG.trace("Connecting ..."); + channel.connect(); + } LOG.info("Connected to " + configuration.remoteServerInformation()); } Copied: camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeout2Test.java (from r960894, camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeoutTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeout2Test.java?p2=camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeout2Test.java&p1=camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeoutTest.java&r1=960894&r2=960914&rev=960914&view=diff ============================================================================== --- camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeoutTest.java (original) +++ camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientSoTimeout2Test.java Tue Jul 6 15:16:00 2010 @@ -27,10 +27,10 @@ import org.junit.Test; /** * @version $Revision$ */ -public class FromFtpClientSoTimeoutTest extends FtpServerTestSupport { +public class FromFtpClientSoTimeout2Test extends FtpServerTestSupport { private String getFtpUrl() { - return "ftp://ad...@localhost:" + getPort() + "/timeout/?password=admin&ftpClient.soTimeout=5000"; + return "ftp://ad...@localhost:" + getPort() + "/timeout/?password=admin&soTimeout=5000"; } @Override Copied: camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConnectTimeoutTest.java (from r960894, camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientDataTimeoutTest.java) URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConnectTimeoutTest.java?p2=camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConnectTimeoutTest.java&p1=camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientDataTimeoutTest.java&r1=960894&r2=960914&rev=960914&view=diff ============================================================================== --- camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FromFtpClientDataTimeoutTest.java (original) +++ camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConnectTimeoutTest.java Tue Jul 6 15:16:00 2010 @@ -16,48 +16,27 @@ */ package org.apache.camel.component.file.remote; -import org.apache.camel.Endpoint; -import org.apache.camel.Exchange; -import org.apache.camel.Producer; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; -import org.junit.Before; import org.junit.Test; /** * @version $Revision$ */ -public class FromFtpClientDataTimeoutTest extends FtpServerTestSupport { +public class FtpConnectTimeoutTest extends FtpServerTestSupport { private String getFtpUrl() { - return "ftp://ad...@localhost:" + getPort() + "/timeout/?password=admin&ftpClient.dataTimeout=5000"; + return "ftp://ad...@localhost:" + getPort() + "/timeout/?password=admin&connectTimeout=2000"; } - @Override - @Before - public void setUp() throws Exception { - super.setUp(); - prepareFtpServer(); - } - @Test public void testTimeout() throws Exception { MockEndpoint mock = getMockEndpoint("mock:result"); mock.expectedBodiesReceived("Hello World"); - - mock.assertIsSatisfied(); - } - private void prepareFtpServer() throws Exception { - // prepares the FTP Server by creating a file on the server - Endpoint endpoint = context.getEndpoint(getFtpUrl()); - Exchange exchange = endpoint.createExchange(); - exchange.getIn().setBody("Hello World"); - exchange.getIn().setHeader(Exchange.FILE_NAME, "hello.txt"); - Producer producer = endpoint.createProducer(); - producer.start(); - producer.process(exchange); - producer.stop(); + sendFile(getFtpUrl(), "Hello World", "hello.txt"); + + mock.assertIsSatisfied(); } protected RouteBuilder createRouteBuilder() throws Exception { Propchange: camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConnectTimeoutTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/FtpConnectTimeoutTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date