A favorite feature of mine in the next
Apache Camel is a new feature to use
file name patterns in the
file component. What we have introduced is a new language, the
file language, so you can leverage this feature anywhere in Camel where it uses Expressions, Languages etc. The file language currently support both the
file and the
FTP component as well.
As a lot of integrations is file based you need to be able to read (consume) or write (produce) files. Then you need to be able to specify file names. What's new in Camel 1.5.0 is that you can express this using patterns, for instance directly in the configuration of your endpoints. Prior you had to do this in Java code.
Simple exampleLets image you need to move consumed files into a backup folder after processing.
Now you can express this using the pattern:
backup/${file:name}Well then you need to use .bak as extension, and the pattern is:
backup/${file:name}.bakOkay next issue is that the backup folder should be grouped by dates using the
yyyyMMdd pattern. Well the expression support the
java.text.SimpleDateFormat patterns also.
The pattern is:
backup/${date:now:yyyyMMdd}/${file:name}.bak where
now means current date. You can substitute this with different commands such as
file for using the timestamp on the file instead.
Advanced exampleIn this sample you need to produce files (save) and you need to save the file using a generate unique filename. We use the divide and conquer pattern for this so you create a POJO class that generates the unique filename, then you as the developer have the full power how to do this. And then its very easy to unit test as its plain POJO that can be tested very easily with JUnit. Next step is to express this as a file pattern. As your POJO is a bean we use the
bean langauge to invoke your pojo.
So the pattern is:
myfile-${bean:myguidgenerator.generateid}.txt
Where myguidgenerator is the bean id of your POJO and generateid is the method name. You can omit the method name if there is no ambiguity which method Camel should invoke.
Camel routes
This feature is configurable directly in camel routing on your endpoints. So what we can do now is:
from("file://inbox?expression=backup/${date:now:yyyyMMdd}/${file:name}.bak").to("bean:processFile");
The route will consume files and process the files in the processFile bean, that is a plain POJO class. After processing the files is moved (renamed) using the pattern in the expression. So the file is moved to the backup subfolder, for example: backup/20081014/report-october-2008.bak
More to come
Well there is a ton of new features and improvements in Camel 1.5.0. Check out the current release note.