0 Replies Latest reply on Jul 15, 2009 5:53 AM by martin buettler


    martin buettler Newbie

      Hi guys...

      Hope you can help me.

      I got a ftp-listener with the following config :


      The special thing here is that the files on the ftp are in subdirectories of the directory (see input-suffix).

      The listenere config is here:

       schedule-frequency="@bhi2unio.ftp.pollfrequency@" maxThreads="1" >
       <property name="composer-class" value="com.unio.rmc.transfer.listener.RemoteToLocalMessageComposer"/>
       <property name="local-mirror-dir" value="@local-mirror-dir@"/>

      Then i wrote a MessageComposer which writes some properties in the message and downloads the file from the ftp server to my local hd..

      Thats the code:

      public class RemoteToLocalMessageComposer<T extends File> implements
       MessageComposer<T> {
       static Logger log = Logger.getLogger(RemoteToLocalMessageComposer.class);
       public static final String LOCAL_MIRROR_DIR_TAG = "local-mirror-dir";
       public static final String PN_MIRROR_FILE_NAME = "com.unio.rmc.mirror.file.name";
       public static final String PN_FILE_PATH_RELATIVE = "com.unio.rmc.file.path.relative";
       public static final String WORKING_FILE_SUFFIX = ".esbInProcess";
       private FTPEpr ftpEpr;
       private File downloadDir;
       private MessagePayloadProxy payloadProxy;
       private File localFileDir;
       public void setConfiguration(ConfigTree config)
       throws ConfigurationException {
       EPR epr = ListenerUtil.assembleEpr(config);
       if (!(epr instanceof FTPEpr)) {
       throw new ConfigurationException(
       "This Gateway only accepts FTP and SFTP.");
       ftpEpr = (FTPEpr) epr;
       // This may look a bit odd... The "file" input dir is our FTP download
       // dir...>
       downloadDir = UnioAbstractFileGateway.getFileInputDirectory(config);
       payloadProxy = new MessagePayloadProxy(config);
       localFileDir = getLocalFileDir(config);
       private File getLocalFileDir(ConfigTree config)
       throws ConfigurationException {
       String uriStr = config.getAttribute(LOCAL_MIRROR_DIR_TAG);
       URI uri = null;
       if (uriStr != null) {
       try {
       uri = new URI(uriStr);
       } catch (URISyntaxException e) {
       throw new ConfigurationException("Invalid '"
       + LOCAL_MIRROR_DIR_TAG + "' value '"
       + uriStr + "'. Must be a valid URI.");
       } else {
       try {
       return new File(uri);
       } catch (Exception e) {
       return new File(uri.getPath());
       public Message compose(T inputFile) throws MessageDeliverException {
       AssertArgument.isNotNull(inputFile, "inputFile");
       File localFile = null;
       try {
       localFile = writeRemoteToLocalFile(inputFile);
       } catch (IOException e) {
       throw new MessageDeliverException(
       "Error reading remote input file '"
       + inputFile.getPath() + "'.", e);
       } catch (RemoteFileSystemException e) {
       throw new MessageDeliverException(
       "Error reading remote input file '"
       + inputFile.getPath() + "'.", e);
       Message message = MessageFactory.getInstance().getMessage();
       payloadProxy.setPayload(message, getPayload(inputFile));
       PN_MIRROR_FILE_NAME, localFile.getAbsolutePath());
       log.info("message " + message);
       message.getProperties().setProperty(PN_FILE_PATH_RELATIVE, getRelativeFilePath(inputFile));
       return message;
       private String getRelativeFilePath(File remoteFile) {
       String relativeFilePath = remoteFile.getPath();
       // remove file name
       if (relativeFilePath.contains(File.separator)) {
       relativeFilePath = relativeFilePath.substring(0, relativeFilePath.lastIndexOf(File.separator));
       } else {
       relativeFilePath = "";
       return relativeFilePath;
       protected Object getPayload(T inputFile) {
       // we leave the body empty
       return new byte[] {};
       public Object decompose(Message message, T inputMessage)
       throws MessageDeliverException {
       return payloadProxy.getPayload(message);
       private File writeRemoteToLocalFile(File remoteFile) throws IOException,
       RemoteFileSystemException {
       File localFile = null;
       RemoteFileSystem remoteFileSystem = null;
       String localFileName = remoteFile.toString();
       if (localFileName.endsWith(WORKING_FILE_SUFFIX)) {
       localFileName = localFileName.substring(0, localFileName
       try {
       localFile = new File(localFileDir, localFileName);
       localFile.mkdirs(); // file could be stored in a sub-directory
       remoteFileSystem = RemoteFileSystemFactory.getRemoteFileSystem(ftpEpr, true);
       String old = remoteFileSystem.getRemoteDir();
       if (remoteFile.toString().contains(File.separator)){
       int index = remoteFile.toString().lastIndexOf(File.separator);
       remoteFileSystem.setRemoteDir(remoteFileSystem.getRemoteDir() +"/" + remoteFile.toString().substring(0, index));
       remoteFile = new File(remoteFile.toString().substring(index + 1));
       log.info("remoteDir : " + remoteFileSystem.getRemoteDir());
       log.info("remoteFile : " + remoteFile.toString());
       remoteFileSystem.downloadFile(remoteFile.toString(), localFile.getAbsolutePath());
       log.info("download done to " + localFile.getAbsolutePath());
       } finally {
       if (null != remoteFileSystem){
       return localFile;

      The file will be downloaded but if all goes well the esb cant delete the file on the ftp.....

      11:42:51,895 ERROR [AbstractFileGateway] File test\stx3.xml 2.zip has been processed and renamed to test\stx3.xml 2.zip.esbInProcess, but th
      ere were problems deleting it from the input directory
      org.jboss.soa.esb.listeners.gateway.GatewayException: org.jboss.soa.esb.util.RemoteFileSystemException: Failed to delete remote file: 550 te
      st\stx3.xml 2.zip.esbInProcess: No such file or directory
       at org.jboss.soa.esb.listeners.gateway.RemoteGatewayListener.deleteFile(RemoteGatewayListener.java:128)
       at org.jboss.soa.esb.listeners.gateway.AbstractFileGateway.processingComplete(AbstractFileGateway.java:206)
       at org.jboss.soa.esb.listeners.gateway.AbstractFileGateway.onSchedule(AbstractFileGateway.java:198)
       at org.jboss.soa.esb.schedule.ScheduleProvider$ESBScheduledJob.execute(ScheduleProvider.java:227)
       at org.quartz.core.JobRunShell.run(JobRunShell.java:203)
       at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)
      Caused by: org.jboss.soa.esb.util.RemoteFileSystemException: Failed to delete remote file: 550 test\stx3.xml 2.zip.esbInProcess: No such fil
      e or directory
       at org.jboss.internal.soa.esb.util.FtpImpl.deleteRemoteFile(FtpImpl.java:284)
       at org.jboss.soa.esb.listeners.gateway.RemoteGatewayListener.deleteFile(RemoteGatewayListener.java:120)
       ... 5 more

      I know the problem is that the filename on the ftp is the wrong... But how can i change it?

      I hope u understand me...

      Greets dinozzo