Friday, June 12, 2009

ActiveMQ integration with mule using spring

ActiveMQ integration with mule using spring

There are different ways to integrate ActiveMQ with spring.

1) Run separate ActiveMQ instance
2) Embedded broker activeMQ instance or

Let’s starts with first option (Running separate ActiveMQ instance)

Here I am using mule 2.2, apache-activemq-5.2.0 and spring

Mule-config.xml

<mule xmlns="http://www.mulesource.org/schema/mule/core/2.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:spring="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jms="http://www.mulesource.org/schema/mule/jms/2.2"
xmlns:amq="http://activemq.apache.org/schema/core" xmlns:cxf="http://www.mulesource.org/schema/mule/cxf/2.2"
xmlns:mule="http://www.mulesource.org/schema/mule/core/2.2"
xsi:schemaLocation="
http://www.mulesource.org/schema/mule/core/2.2 http://www.mulesource.org/schema/mule/core/2.2/mule.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.mulesource.org/schema/mule/jms/2.2 http://www.mulesource.org/schema/mule/jms/2.2/mule-jms.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd
http://www.mulesource.org/schema/mule/cxf/2.2 http://www.mulesource.org/schema/mule/cxf/2.2/mule-cxf.xsd">
<spring:beans>
<spring:bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<spring:property name="connectionFactory" ref="connectionFactory" />
</spring:bean>

<spring:bean id="queueFactory"
class="org.springframework.jndi.JndiObjectFactoryBean">
<spring:property name="jndiTemplate" ref="jndiTemplate" />
<spring:property name="jndiName" value="QueueConnectionFactory" />
</spring:bean>

<spring:bean id="jndiTemplate"
class="org.springframework.jndi.JndiTemplate">
<spring:property name="environment">
<spring:props>
<spring:prop key="java.naming.factory.initial">
org.apache.activemq.jndi.ActiveMQInitialContextFactory
</spring:prop>
<spring:prop key="java.naming.provider.url">
tcp://localhost:61616
</spring:prop>
</spring:props>
</spring:property>
</spring:bean>
</spring:beans>

<jms:jmsmessage-to-object-transformer name="JmsMessageToObject" />
<jms:object-to-jmsmessage-transformer name="ObjectToJmsMessage" />

<jms:connector name="AMQConnector"
numberOfConcurrentTransactedReceivers="2"
connectionFactory-ref="queueFactory"
persistentDelivery="true"
specification="1.1" maxRedelivery="2">

<receiver-threading-profile
maxBufferSize="5"
maxThreadsActive="5"
poolExhaustedAction="WAIT" threadWaitTimeout="50"
maxThreadsIdle="5"
threadTTL="55" />
<dispatcher-threading-profile
maxBufferSize="5"
maxThreadsActive="5"
poolExhaustedAction="WAIT"
threadWaitTimeout="55"
maxThreadsIdle="5"
threadTTL="5" />
<default-connector-exception-strategy>
<rollback-transaction exception-pattern="*" />
</default-connector-exception-strategy>
</jms:connector>

<model name="TestJMSModel">
<service name="TestJMSService">
<inbound>

<vm:inbound-endpoint address="vm://JavaTch.Entry.Q ">
<transformers>
<transformer ref="JmsMessageToObject" />
<transformer ref="JaxbXmlToObject" />
</transformers>
</vm:inbound-endpoint>
</inbound>
<outbound>
<pass-through-router>
<jms:outbound-endpoint address="jms:// JavaTch.Exit.Q"
connector-ref="AMQConnector">
<transformers>
<transformer ref="JaxbObjectToXml" />
<transformer ref="ObjectToJmsMessage" />
</transformers>
</jms:outbound-endpoint>
</pass-through-router>
</outbound>
</service>
</model>


Now we need to run this using Mule Client.

TestJMSMuleClient.java

import java.util.UUID;

import org.mule.api.MuleContext;
import org.mule.api.config.ConfigurationBuilder;
import org.mule.config.spring.SpringXmlConfigurationBuilder;
import org.mule.context.DefaultMuleContextFactory;
import org.mule.module.client.MuleClient;


public class TestJMSMuleClient {
public static void main(String[] args) throws Exception {

MuleContext muleContext = new DefaultMuleContextFactory()
.createMuleContext();
ConfigurationBuilder builder = new SpringXmlConfigurationBuilder(
"mule-config.xml");
builder.configure(muleContext);
muleContext.start();
MuleClient client = new MuleClient();
//here you need to create your object
// YourClass objectPayload = new YourClass();
//
client.dispatch("vm://JavaTch.Entry.Q ", objectPayload, null);
}
}



2) Embedded broker activeMQ instance

Modify your mule-config.xml to have embedded activeMQ instance.


<spring:beans>

<amq:broker id="AMQBroker" useJmx="false" persistent="false">
<amq:managementContext>
<amq:managementContext createConnector="false" />
</amq:managementContext>
<amq:transportConnectors>
<amq:transportConnector uri="tcp://localhost:61616" />
</amq:transportConnectors>
</amq:broker>
<amq:connectionFactory id="jmsFactoryCore"
brokerURL="tcp://localhost:61616" />
</spring:beans>


<jms:activemq-connector name="AMQConnector"
brokerURL="tcp://localhost:61616" connectionFactory-ref=
"jmsFactoryCore"/>

The above code will start a activeMQ instance.
Then we can use this connector in the jms endpoint