Overview of the ServiceMix
...
File Binding Example
This document describes how to run ServiceMix's File Binding example and provides details about what it does. For information on the business use case, please refer to: Use Case for File Binding.
...
Info | ||
---|---|---|
| ||
The file to be transmitted from the inbox to outbox must be in XML format. |
Running the File Binding Example
From a command shell, go to the File Binding example directory:
...
Tip | ||
---|---|---|
| ||
Add $SERVICEMIX_HOME/bin directory to $PATH variable to simplify execution of the example. |
Stopping the File Binding Example
To terminate the File Binding example type "CTRL-C" in the command shell in which it is running and answer "y" to the "Terminate batch job (y/n)?" question.
How it Works
The diagram below illustrates the logical flow of the program through the file binding components.
...
Logging information is written to the console as files are transmitted. Typical output looks like the following:
Code Block |
---|
ServiceMix ESB: 1.0.1 Loading ServiceMix from file: servicemix.xml [INFO] XmlBeanDefinitionReader - -Loading XML bean definitions from file [C:\Program Files\servicemix-1.0.1\examples\file-binding\servicemi.xml] [INFO] FileSystemXmlApplicationContext - -Bean factory for application context [org.springframework.context.support.FileSystemXmlApplication Context;hashCode=7486844]: org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [workManager,jbi]; root of BeanFactory hierarchy [INFO] FileSystemXmlApplicationContext - -2 beans defined in application context [org.springframework.context.support.FileSystemXmlApplicationContext;hashCode=7486844] [INFO] CollectionFactory - -JDK 1.4+ collections available [INFO] CollectionFactory - -Commons Collections 3.x available [INFO] FileSystemXmlApplicationContext - -Unable to locate MessageSource with name 'messageSource': using default [org.springframework.conte xt.support.DelegatingMessageSource@1d6776d] [INFO] FileSystemXmlApplicationContext - -Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using defaul t [org.springframework.context.event.SimpleApplicationEventMulticaster@4fce71] [INFO] DefaultListableBeanFactory - -Pre-instantiating singletons in factory [org.springframework.beans.factory.support.DefaultListableBeanF actory defining beans [workManager,jbi]; root of BeanFactory hierarchy] [INFO] DefaultListableBeanFactory - -Creating shared instance of singleton bean 'workManager' [INFO] DefaultListableBeanFactory - -Creating shared instance of singleton bean 'jbi' Created MBeanServer with ID: 203c31:106bd250a5b:-7fff:Lisas:1 [INFO] SpringInitialContextFactory - -Loading JNDI context from: class path resource [jndi.xml] [INFO] XmlBeanDefinitionReader - -Loading XML bean definitions from class path resource [jndi.xml] [INFO] XmlBeanFactory - -Creating shared instance of singleton bean 'jndi' RMIConnectorServer started at: service:jmx:rmi://lisas/jndi/rmi://localhost:1099/defaultJBIJMX [INFO] JBIContainer - -ServiceMix JBI Container (http://servicemix.org/) name: defaultJBI running version: ServiceMix. [INFO] JBIContainer - -Activating component for: [container=defaultJBI,name=fileSender,id=fileSender] with service: fileSender component: org.servicemix.components.file.FileWriter@b1cc87 [INFO] ComponentContextImpl - -Component: fileSender activated endpoint: fileSender : fileSender [INFO] JBIContainer - -Activating component for: [container=defaultJBI,name=filePoller,id=filePoller] with service: filePoller component: or g.servicemix.components.file.FilePoller@183e7de [INFO] ComponentContextImpl - -Component: filePoller activated endpoint: filePoller : filePoller [INFO] DeliveryChannel - -default destination serviceName for filePoller = fileSender |
Note: In the servicemix.xml
file, the "destinationService" attribute of the filePoller component is "foo:fileSender." The last line of output (above) shows the NMR using that to deliver the normalized message to fileSender.
Details
The following table provides more details about the function of each component and bean in the servicemix.xml
file.
Component or Bean ID | Description |
---|---|
filePoller | This component periodically checks the "inbox" directory looking for files. If there is a file or directory present, it adds the file to the "workingSet", which is a collection of files to be processed. The workManger is invoked to schedule the work of processing the file from the workingSet. Another thread is created and the processing of the file begins. Processing consists of marshalling the file (streaming it from disk into a normalized message). The normalized message is sent over the NMR to the fileSender component per the specified "destinationService". The destinationService is specified in the |
fileSender | This component is the "destinationService" for the filePoller. It receives normalized messages from filePoller. The messages it receives are the files that filePollerhas transferred to it via the NMR. It converts the normalized message to its original file format and sends it to the destination directory, the |
workManager | This bean is used by the filePoller to increase the throughput of the application. The workManager is a thread pool whose size can be adjusted declaratively in the |
Useful Code Hints
This section describes the start-up sequence and how the ServiceMix container interacts with the File Bindingapplication. The Java class files are located in the servicemix-1.0.1.jar file in the ServiceMix installation directory. To look at the Java source code, unjar and decompile the .class files or download the source code. Please note: the downloadable source code is slightly different than the compiled binary code.
...
- The ServiceMix container reads the
servicemix.xml
file and sees it needs to instantiate a FilePoller. - The container calls the init() method of FilePoller, as well as the init() methods of its parents.
- The container determines that FilePoller is an MBean and, therefore, calls the start() method of FilePoller, which it inherits from its parent PollingComponentSupport.
- The start() method will: (See: PollingComponentSupport.java code fragment below)
A. Create a timerTask.
B. Schedule the timerTask at a fixed rate. The start() method uses the "timer" (created in the init method) to schedule the timerTask at a fixed rate: timer.scheduleAtFixedRate(timerTask, firstTime, period). Recall "period" is a property of FilePoller. It was assigned the value of 1000ms by dependency injection from theservicemix.xml
file.
C. timer will call the run() method of the timerTask periodically. timerTask's run method() is defined inline. This run() method will get the workManager object (see below for details).
D. The workManager will call "scheduleWork(PollingComponentSupport.this)". _Note:_it passes in PollingComponent support, which by virtue of its inheritance hierarchy, is of type "Work", which is a "Runnable" object.
E. "workManager.scheduleWork(Work)" will get a Thread, passing in a Runnable object, i.e. PollingComponentSupport, and call its run() method.
F. PollingComponent's run() method calls poll(), which is implemented in FilePoller.
G. From this point on the call sequence can be followed in FilePoller...
H. The start() method of PollingComponentSupport, will eventually call super.start(), which propagates up to call the start() method of BaseLifeCycle, which sets the component state to "RUNNING."
...
Code Block | ||||
---|---|---|---|---|
| ||||
timerTask =protected newvoid TimerTaskinit() throws JBIException { public voidif run(scheduler == null) { try { scheduler = new Scheduler(true); } if getWorkManager().scheduleWork(PollingComponentSupport.this);scheduleIterator == null) { scheduleIterator }= new PollScheduleIterator(); } catch (Throwable e) { if (workManager == null) { log.error("Failed to schedule work:ComponentContextImpl "context + e, e= (ComponentContextImpl) getContext(); } workManager }= context.getWorkManager(); }; if (firstTime != null) {} timersuper.scheduleAtFixedRate(timerTask, firstTime, periodinit(); } else { timer.scheduleAtFixedRate(timerTask, delay, period); } } super.start(); |
workManager Details
workManager is a property of the FilePoller object. This property is defined by a local reference, the "ref" attribute in the servicemix.xml
file. The local reference is a bean which instantiates org.activemq.work.SpringWorkManager.
...
Summarizing, when the ServiceMix container instantiates an MBean it firsts sets the property values if there are any, then calls the init() method of the class and its' parent classes, if applicable. Then it calls the start() method of the class. When a Spring bean starts up, the properties are set and then the afterPropertiesSet() method is called.
Related Documentation
For more information on the following topics please see:
...