|
Page Edited :
SM :
servicemix-bean
servicemix-bean has been edited by Torsten Mielke (May 19, 2008). Change summary: added sample code for accessing message content as string in "Message processing example" ServiceMix BeanThe ServiceMix Bean component provides integration with beans (POJOs) with the JBI bus to make it easy to use POJOs to process JBI message exchanges. Like in an Message Driven Bean in J2EE a POJO will receive a message from the NMR and process it in any way it likes. Unlike in a JMS component where the coding is already done the Bean component gives the developer the freedom to create any type of message handling but it must be hand coded all the way. POJOsThere are several kind of POJOs you can deploy to servicemix-bean. MessageExchangeListenerThe first kind of POJOs you can deploy implement the MessageExchagneListener These POJOs are low-level POJOs: you need to understand the JBI Api and Message Exchange Patterns to correctly handle incoming exchanges. Note that at this point (v 3.1), there is no base class that you can inherit to speed you in this process of implementing a POJO to handle JBI exchanges, but hopefully it will come in the future.
DisclaimerIn versions 3.1 to 3.1.2 the ServiceMix Bean component will not handle asynchronous messages correctly because the final send of the message marked as DONE back to the NMR will be handled as a consumer message and that fails because there is no corresponding provider message. The only workaround is to send the messages synchronously. Note: This was resolved in 3.1.3, 3.2.x and later via SM-1110 DeploymentCurrently (v 3.1), servicemix-bean supports two different deployment models. The first one uses an xbean.xml configuration file where one can configure the different endpoints / beans that will be used. The other one only works with a static configuration file (servicemix.xml) and can not be used with standard JBI packaging but allows automatic detection of the beans to expose. xbean.xml<beans xmlns:bean="http://servicemix.apache.org/bean/1.0"> <bean:endpoint service="test:service" endpoint="endpoint" bean="#listenerBean"/> <bean id="listenerBean" class="org.apache.servicemix.bean.beans.ListenerBean"/> </beans> Attention: The Bean Endpoint schema allows to set a Bean or a Bean Name. The Bean will create a single instance of the POJO per endpoint whereas the Bean Name will create an instance per request (message exchange). Static configurationWhen used in a static configuration, beans can be automatically discovered amongst spring configured beans: <beans xmlns:sm="http://servicemix.apache.org/config/1.0" xmlns:bean="http://servicemix.apache.org/bean/1.0" xmlns:test="urn:test"> <sm:container id="jbi" embedded="true" createMBeanServer="false"> <sm:activationSpecs> <sm:activationSpec> <sm:component> <bean:component/> </sm:component> </sm:activationSpec> </sm:activationSpecs> </sm:container> <bean id="consumerBean" class="org.apache.servicemix.bean.beans.ConsumerBean"/> <bean id="listenerBean" class="org.apache.servicemix.bean.beans.ListenerBean"/> <bean id="annotatedBean" class="org.apache.servicemix.bean.beans.AnnotatedBean"/> <bean id="plainBean" class="org.apache.servicemix.bean.beans.PlainBean"/> </beans> Such beans can be accessed by resolving a URI: DocumentFragment epr = URIResolver.createWSAEPR("bean:annotatedBean");
ServiceEndpoint se = client.getContext().resolveEndpointReference(epr);
exchange.setEndpoint(se);
Beans can also be discovered by searching within defined packages: <beans xmlns:sm="http://servicemix.apache.org/config/1.0" xmlns:bean="http://servicemix.apache.org/bean/1.0" xmlns:test="urn:test"> <sm:container id="jbi" embedded="true" createMBeanServer="false"> <sm:activationSpecs> <sm:activationSpec> <sm:component> <bean:component searchPackages="org.apache.servicemix.bean.beans"/> </sm:component> </sm:activationSpec> </sm:activationSpecs> </sm:container> </beans> In such a case, beans must have the @Endpoint annotation. Of course, you can use the endpoint xml element to configure your POJOs: <beans xmlns:sm="http://servicemix.apache.org/config/1.0" xmlns:bean="http://servicemix.apache.org/bean/1.0" xmlns:test="urn:test"> <sm:container id="jbi" embedded="true" createMBeanServer="false"> <sm:activationSpecs> <sm:activationSpec> <sm:component> <bean:component> <bean:endpoints> <bean:endpoint service="test:service" endpoint="endpoint" bean="#listenerBean"/> </bean:endpoints> </bean:component> </sm:component> </sm:activationSpec> </sm:activationSpecs> </sm:container> <bean id="listenerBean" class="org.apache.servicemix.bean.beans.ListenerBean"/> </beans> Note: Please make sure that the namespace specified at the top xmlns:test does match to the namespace used in the endpoint's service test:service. When calling the service by the service name then you need to add the namespace in order to find the service like {urn:test}service. MessageExchange dispatchingIf the POJO deployed implements the org.apache.servicemix.MessageExchangeListener, every message received for this POJO will be dispatched to the onMessageExchange method. In other cases, exchanges in a provider role will be dispatched according to the MethodInvocationStrategy configured on the endpoint. The default one try to find the method according to the operation name defined on the exchange. If there is only a single method acting as an operation, it will always be used. AnnotationsThe servicemix-bean component can accept different kind of POJOs. These POJOs may be annotated to customize their behavior. All the following annotations belong to the org.apache.servicemix.bean package.
In addition, standard annotations can be used:
The following interfaces are part of this API:
ExamplesURIYou can use a handy URI to refer to beans using the Spring names of beans. bean:someName The above would refer to the bean named someName in the Spring ApplicationContext which is used to boot up the bean component. |
Unsubscribe or edit your notifications preferences
