ServiceMix File
The ServiceMix File component provides JBI integration to the file system. It can be used to read & write files via URI or to periodically poll directories for new files.
Note that this component is only available in releases >= 3.1.
URI
You can use the familiar file URI to communicate with files
file:foo.xml file://path/to/something
Endpoints
<file:sender service="test:service" endpoint="endpoint" directory="file:target/pollerFiles" />
<file:poller service="test:poller" endpoint="poller" targetService="test:receiver" file="file:target/pollerFiles" />
Poller generates an InOnly message
Poller endpoint attributes
Name |
Type |
Description |
Default |
---|---|---|---|
service |
QName |
the service name of the endpoint |
required to be spec'd |
endpoint |
string |
the endpoint name of the endpoint |
required to be spec'd |
interfaceName |
QName |
the interface name of the endpoint |
|
targetService |
QName |
the service name of the target endpoint |
|
targetEndpoint |
string |
the endpoint name of the target endpoint |
|
targetInterface |
QName |
the interface name of the target endpoint |
|
targetUri |
string |
the uri of the target endpoint |
|
autoCreateDirectory |
boolean |
creates dir if doesn't exist |
true |
firstTime |
date |
datetime before first poll can take place |
null (first poll right after start) |
delay |
long |
amount of time first polling is delayed after start |
0 |
period |
long |
amount of time between polls |
5000 |
file |
string |
sets the file or directory to poll |
null (must be spec'd) |
deleteFile |
boolean |
delete file when it is processed |
true |
recursive |
boolean |
process sub directories |
true |
marshaler |
class |
org.apache.servicemix.components.util.FileMarshaler |
DefaultFileMarshaler |
lockManager |
class |
org.apache.servicemix.locks.LockManager |
SimpleLockManager |
filter |
class |
java.io.FileFilter (optional filter) |
null - no filter |
scheduler |
class |
org.apache.servicemix.components.varscheduler.Scheduler |
new Scheduler(true) |
comparator |
class |
implementation of java.util.Comparator<File> interface |
null - no ordering |
archive |
string |
sets the directory to archive files before deleting them |
null (no archiving) |
Sender endpoint attributes
Name |
Type |
Description |
Default |
---|---|---|---|
service |
QName |
the service name of the endpoint |
required to be spec'd |
endpoint |
string |
the endpoint name of the endpoint |
required to be spec'd |
directory |
file |
|
required to be spec'd |
autoCreateDirectory |
boolean |
|
true |
append |
boolean |
append to an existing file instead of overwriting it (3.3 or above) |
false |
marshaler |
class |
org.apache.servicemix.components.util.FileMarshaler |
DefaultFileMarshaler |
tempFilePrefix |
string |
|
"servicemix-" |
tempFileSuffix |
string |
|
".xml" |
For all xbean file endpoint configuration take a look at Xml schemas
Filtering
Filtering of files to use during the polling process can be accomplished by configuring the filter property.
<file:poller service="test:poller" endpoint="poller" file="file:inbox" targetService="test:service" targetEndpoint="endpoint" period="10000" recursive="true"> <property name="filter"> <bean class="org.apache.oro.io.GlobFilenameFilter"> <constructor-arg value="*.xml" /> </bean> </property> </file:poller>
In the example above, the Apache ORO jar must be in the classpath. See: http://jakarta.apache.org/oro/
<file:poller service="test:poller" endpoint="poller" file="file:inbox" targetService="test:service" targetEndpoint="endpoint" period="10000" recursive="true"> <property name="filter"> <bean class="org.apache.commons.io.filefilter.WildcardFilter"> <constructor-arg value="*.csv" /> </bean> </property> </file:poller>
In the example above it uses Apache Commons IO WildcardFilter as it implements FileFilter. The Apache Commons IO jar file must be in the classpath. See: http://commons.apache.org/io/
Comparators
You can define an implementation of the java.util.Comparator interface to specifies the process order of the files.
For example, you can process file sorted by file name. You can implement the following comparator:
public class NameComparator implements Comparator<File> { /* * (non-Javadoc) * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ public int compare(File file1, File file2) { return file1.getPath().compareTo(file2.getPath()); } }
and use it in the endpoint definition:
<file:poller service="test:poller" endpoint="poller" file="file:inbox" targetService="test:service" targetEndpoint="endpoint" period="10000" recursive="true"> <property name="comparator"> <bean class="your.package.NameComparator"/> </property> </file:poller>
We provide the following comparators:
Provided Comparator
Class Name |
Description |
---|---|
org.apache.servicemix.file.comparator.FileNameComparator |
Compare the files based on the file name/path (alphanumeric sorted) |
org.apache.servicemix.file.comparator.LastModificationDateComparator |
Compare the files based on the last modification date (from oldest to newest) |
org.apache.servicemix.file.comparator.SizeComparator |
Compare the files based on the file length (from smallest to biggest) |
Marshalers
By default, poller endpoints expect the content of the file to be in xml format.
<file:sender service="test:service" endpoint="endpoint" directory="file:target/componentOutput"> <file:marshaler> <sm:defaultFileMarshaler> <sm:fileName> <!-- lets use a header from the message --> <sm:xpathString xpath="concat($name, '.xml')"/> </sm:fileName> </sm:defaultFileMarshaler> </file:marshaler> </file:sender>
Below is an example of a non-XML file marshaler that moves a file from an inbox to an outbox directory. The binary marshaler sends a message with the file attached. This allows any file to be processed.
The contents below were used in an xbean.xml file for a service unit named filemover
<?xml version="1.0"?> <beans xmlns:f="http://servicemix.apache.org/file/1.0" xmlns:proj="http://servicemix.apache.org/samples/filemover" xmlns:sm="http://servicemix.apache.org/config/1.0"> <f:sender service="proj:fileSender" endpoint="endpoint" directory="file:///C:/opensrc/test/myOutbox" autoCreateDirectory="true"> <property name="marshaler"> <bean class="org.apache.servicemix.components.util.BinaryFileMarshaler" /> </property> </f:sender> <f:poller service="proj:filePoller" endpoint="poller" file="file:///C:/opensrc/test/myInbox" targetService="proj:fileSender" targetEndpoint="endpoint" period="60000" recursive="true" autoCreateDirectory="true"> <property name="marshaler"> <bean class="org.apache.servicemix.components.util.BinaryFileMarshaler" /> </property> </f:poller> </beans>