Integrating ServiceMix with WebSphere's SIBus
This article describes how to integrate Apache ServiceMix with WebSphere’s SIBus. More precisely we will explore how to deploy a Camel route that sends messages to a SIBus destination in WebSphere. We assume that connection factories and queue objects are created using the API described in the Programming to use JMS and messaging directly page in the WebSphere infocenter instead of looking them up using JNDI. This makes the configuration considerably simpler because there is no need to create JNDI objects in the WebSphere configuration.
In this scenario, it’s enough to install the SIB thin client and we don’t need the EJB thin client and IBM ORB (as
would be the case in a scenario that uses JNDI lookups). The SIB thin client can be found in the runtimes
directory of
the WebSphere installation. It is actually packaged as an OSGi bundle that can be deployed out of the box in ServiceMix.
This has been successfully tested with the client from WAS 7.0.0.25 and 8.5.5.0. Note that earlier 8.5 versions seem to
have some issues because they actually require the EJB thin client and IBM ORB.
To deploy the SIB thin client, simply use the following command in the ServiceMix console (Adapt the path and version as necessary):
osgi:install -s file:///opt/IBM/WebSphere/AppServer/runtimes/com.ibm.ws.sib.client.thin.jms_8.5.0.jar
The thin client should then appear in the list of deployed bundles as follows (Use the osgi:list
command to display
that list):
[ 182] [Active ] [ ] [ ] [ 80] IBM SIB JMS Thin Client (8.5.0)
We can now create and deploy a Camel route. We will do that using a Spring context file. As mentioned earlier, the
necessary connection factory and queue objects will be created using the
com.ibm.websphere.sib.api.jms.JmsFactoryFactory
API. Since Spring supports creating beans using static and
instance factory methods (including factory methods with parameters) this can be done entirely in the Spring
configuration without writing any code.
The following sample configuration sets up a Camel route that reads files from a directory and sends them to a SIBus destination:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd">
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="file://test"/>
<to uri="sib:queue:testQ"/>
</route>
</camelContext>
<bean id="jmsFactoryFactory" class="com.ibm.websphere.sib.api.jms.JmsFactoryFactory"
factory-method="getInstance"/>
<bean id="testQ"
factory-bean="jmsFactoryFactory" factory-method="createQueue">
<constructor-arg>
<value>queue://test</value>
</constructor-arg>
</bean>
<bean id="testCF" factory-bean="jmsFactoryFactory" factory-method="createConnectionFactory">
<property name="busName" value="test"/>
<property name="providerEndpoints" value="isis:7276:BootstrapBasicMessaging"/>
<property name="targetTransportChain" value="InboundBasicMessaging"/>
</bean>
<bean id="sib" class="org.apache.camel.component.jms.JmsComponent">
<property name="connectionFactory" ref="testCF"/>
<property name="destinationResolver">
<bean class="org.springframework.jms.support.destination.BeanFactoryDestinationResolver"/>
</property>
</bean>
</beans>
To run this sample, change the queue name, bus name and the provider endpoint as required by your environment. Then copy
the Spring context to the deploy
directory in your ServiceMix installation. This should create a test
directory
where you can put the files to be sent to the SIBus destination.