Hi Mattias
I've just read your javaway blog
(http://blog.jayway.com/2010/08/12/dynamic-ftp-client-using-apache-camel-and-spring/)
and is a great and well written blog entry to explore dynamically ftping
files.
I was also recently asked to develop an FTP client that could transmit
files to various FTP servers as a part of a delivery system. I discovered
"Apache Camel" is the best suited framework for integration. I started
learning Camel from few days ago.
I just followed you as explained above. The only different is that I don't
use Spring. I created the camel context in a java class (in a main method)
and started the context (context.start()). Then I set the FtpProperties and
called ftpSender.sendFile(ftpProperties, file, producer).
Plz note the producer is context.createProducerTemplate().
The main java class is as follows
-------------------------------------------------------------------------
public static void main(String[] args) {
CamelContext context = new DefaultCamelContext();
try {
context.start();
File file = new File("message1.xml");
FtpProperties ftpProperties = new FtpPropertiesImpl("ftp", "dfs",
"******", "dev.e-xxxxx.com", "images", true);
FtpSender ftpSender = new FtpSenderImpl();
ProducerTemplate producer = context.createProducerTemplate();
// Thread.sleep(10000);
// context.stop();
ftpSender.sendFile(ftpProperties, file, producer);
} catch (Exception e) {
System.out.println("Error while Starting Camel " + e);
}
}
-------------------------------------------------------------------------
When I ran the above program I got the following error.
Dec 19, 2010 5:07:20 PM
org.apache.camel.component.file.remote.RemoteFileProducer connectIfNecessary
INFO: Connected and logged in to:
Endpoint[ftp://[email protected]/images?passiveMode=true&password=******]
Dec 19, 2010 5:07:21 PM
org.apache.camel.component.file.remote.RemoteFileProducer handleFailedWrite
WARNING: Writing file failed with: Cannot store file: images/message1.xml
Error while Starting Camel org.apache.camel.CamelExecutionException:
Exception occurred during execution on the exchange: Exchange[Message:
message1.xml]
But I can able to ftp files when I use static router (Created at the coding
time) as follows
----------------------------------------------------------------------
public static void main(String[] args) {public static void main(String[]
args) {
CamelContext context = new DefaultCamelContext();
context.addRoutes(new RouteBuilder() {
public void configure() {
from("file:D:/Niranjan/Books/Camel/camelinaction-source/chapter1/file-copy/data/inbox?noop=true")
.to("ftp://[email protected]/images?password=*******&passiveMode=true");
}
});
context.start();
Thread.sleep(10000);
context.stop();
}
--------------------------------------------------------------------
Am I missing that Spring suppose to do by default??
Any help would be appreciated.
My Environment
The development machine runs Windows-7 and the remote FTP server runs on
some Linux distribution (Linux 215402.215402-web1.decmar.co.uk
2.6.18-194.26.1.el5 #1 SMP Fri Oct 29 14:21:16 EDT 2010 x86_64 x86_64 x86_64
GNU/Linux).
Camel version 2.5.0
MY Full Code
-----------------------------------------------------------------------------------------
public class FtpPropertiesImpl implements FtpProperties {
private String protocol = null;
private String userName = null;
private String password = null;
private String host = null;
private String remoteDirectory = null;
private boolean passiveMode = false;
public FtpPropertiesImpl(String protocol, String userName, String
password, String host, String remoteDirectory, boolean passiveMode) {
this.protocol = protocol;
this.userName = userName;
this.password = password;
this.host = host;
this.remoteDirectory = remoteDirectory;
this.passiveMode = passiveMode;
}
/**
* Gets the protocol
* @return One of {...@code ftp}, {...@code ftps} or {...@code sftp}
*/
public String getProtocol() {
return protocol;
}
/**
* Gets the user name
* @return The name of the user
*/
public String getUserName() {
return userName;
}
/**
* Gets the password
* @return The password
*/
public String getPassword() {
return password;
}
/**
* Gets the FTP host
* @return The FTP host
*/
public String getHost() {
return host;
}
/**
* Gets the name of the directory on the server where the file will be
transferred
* @return The name of the remote directory
*/
public String getRemoteDirectory() {
return remoteDirectory;
}
/**
* Gets the passive mode, e.g. if the server is behind a firewall
* @return whether or not passive mode should be used
*/
public boolean getPassiveMode() {
return passiveMode;
}
}
public class FtpSenderImpl implements FtpSender {
/** Camel URI, format is
ftp://u...@host/fileName?password=secret&passiveMode=true */
private static final String CAMEL_FTP_PATTERN =
"{0}://{...@{2}/{3}?password={4}&passiveMode={5}";
@Override
public void sendFile(FtpProperties ftpProperties, File file,
ProducerTemplate producerTemplate) throws RuntimeException {
producerTemplate.sendBodyAndHeader(createFtpUri(ftpProperties) +
"&binary=true", file, Exchange.FILE_NAME, file.getName());
}
/**
* Creates a Camel FTP URI based on the provided FTP properties
* @param ftpProperties The properties to be used
*/
private String createFtpUri(FtpProperties ftpProperties) {
return MessageFormat.format(CAMEL_FTP_PATTERN,
ftpProperties.getProtocol(),
ftpProperties.getUserName(),
ftpProperties.getHost(),
ftpProperties.getRemoteDirectory(),
ftpProperties.getPassword(),
ftpProperties.getPassiveMode());
}
}
Regards,
Niranjan
--
View this message in context:
http://camel.465427.n5.nabble.com/Dynamic-origin-file-components-tp473618p3311118.html
Sent from the Camel - Users mailing list archive at Nabble.com.