...
But Camel can be smarter and we want to dynamic set the filename based on some of the input parameters, how can we do this?
Well the obvious solution is to compute and set the filename from the webservice implementation, but then the webservice implementation has such logic and we want this decoupled, so we could create our own POJO bean that has a method to compute the filename. We could then instruct the routing to invoke this method to get the computed filename. This is a string feature in Camel, its Bean binding. So lets show how this can be done:
Using Bean Language to compute the filename
First we create our plain java class that computes the filename, and it has 100% no dependencies to Camel what so ever.
...
The class is very simple and we could easily create unit tests for it to verify that it works as expected. So what we want now is to let Camel invoke this class and its generateFilename with the input parameters and use the output as the filename. Pheeeww is this really possible out-of-the-box in Camel? Yes it is. So lets get on with the show. We have the code that computes the filename, we just need to call it from our route using the Bean languageLanguage:
Code Block | ||||
---|---|---|---|---|
| ||||
public void configure() throws Exception { from("direct:start") // set the filename using the bean language and call the FilenameGenerator class. // the 2nd null parameter is optional methodname, to be used to avoid ambiguity. // if not provided Camel will try to figure out the best method to invoke, as we // only have one method this is very simple .setHeader(FileComponent.HEADER_FILE_NAME, BeanLanguage.bean(FilenameGenerator.class, null)) .to("velocity:MailBody.vm") .to("file://target/subfolder"); } |
Notice that we use the bean language where we supply the class with our bean to invoke. Camel will instantiate an instance of the class and invoke the suited method. For completeness and ease of code readability we add the methodname method name as the 2nd parameter
Code Block | ||||
---|---|---|---|---|
| ||||
.setHeader(FileComponent.HEADER_FILE_NAME, BeanLanguage.bean(FilenameGenerator.class, "generateFilename")) |
Then other developers can understand what the parameter is, instead of null
.
Notice: The Bean language is far more advanced that what is shown here. We will get back to this in later parts. For now this is a solution we can use.
Now we have a nice solution, but as a sidetrack I want to demonstrate the Camel has other languages out-of-the-box, and that scripting language is a first class citizen in Camel where it etc. can be used in content based routing. However we want it to be used for the filename generation.
...
Notice the import static also applies for all the other languages, such as the Bean language Language we used previously.
#Resources
...