Praveen Singh

Spring JMS with Apache ActiveMQ in embedded mode in tomcat

Introduction


SPRING JMS WITH APACHE ACTIVEMQ IN EMBEDDED MODE IN TOMCAT

In my last blog, i gave the basic overview of Spring JMS with ActiveMQ
Introduction of Spring JMS with ActiveMQ

Though above article is good to understand basic working of Spring JMS with ActiveMQ but this is not what we do in software industry or in professional projects.

The most common use case is to use ActiveMQ as embedded JMS broker in any application server.
For this blog i will use Tomcat as application server and we try to embedded the ActiveMQ in that.

Note: If for some reason you are not interested with ActiveMQ, i have another blog page with same stuff with HornetQ
Spring JMS with embeded HornetQ in tomcat


Agenda

  1. Create a web application for sending JMS message: JMSSenderAMQ
  2. Create a web application to listen JMS message: JMSListnerAMQ
  3. Configure Sender and Listner tomcat for embeded ActiveMQ.
  4. Working Demo of Listener and Sender
  5. Enable JMX monitoring.
  6. Write a simple application for JMX monitoring.
  7. Working Demo of JMX Monitoring application.

Prerequisite

  1. Basic knowledge of spring and spring MVC.
  2. Basic knowledge of working of tomcat.

Requirement

  1. two tomact 6 server.
  2. ActiveMQ 5.5.
  3. Spring 3.0.5.RELEASE
  4. Eclipse IDE

Jars





Assumptions


  1. ACTIVE_MQ_PATH: The installation directory of activemq
  2. TOMCAT_SEN_PATH: The installation directory of Tomcat Sender Server
  3. TOMCAT_LIS_PATH: The installation directory of Tomcat Listener Server

Project Structure






We will have two web application, deployed in different server.
First: JMSSenderAMQ will be responsible to create a JMS message and to send it to Listener.
Second: JMXListnerAMQ will consume the JMS message. this application will also be responsible to start the ActiveMQ and provides its configuration parameter.

NOTE: The thumb rule to know that ActiveMQ is running in embedded mode or not ?, is that you never have to stat the ActiveMQ separately, it started by the server and all its configuration is decided by server.

Development




Introduction




JMSSEnder Server configuration
Start the process by dumping all the jars in lib folder of tomcat.
Why ??
Point is when you start the server, its do the JNDI configuration, for this its need activemq jars and spring jars
because of this, you can't bypass this step by just adding your jar in your project.

Next step is to modify the config file in tomcat

TOMCAT_SEN_PATH/conf/server.xml


<resource auth="Container" brokername="FooBroker" brokerurl="tcp://127.0.0.1:61616" description="JMS Connection Factory" factory="org.apache.activemq.jndi.JNDIReferenceFactory" name="jms/ConnectionFactory" type="org.apache.activemq.ActiveMQConnectionFactory"></resource>

<resource auth="Container" description="A sample queue" factory="org.apache.activemq.jndi.JNDIReferenceFactory" name="jms/FooQueue" physicalname="TEST.Q1" type="org.apache.activemq.command.ActiveMQQueue"></resource>




TOMCAT_SEN_PATH/conf/context.xml

<resourcelink global="jms/ConnectionFactory" name="jms/ConnectionFactory"></resourcelink>
<resourcelink global="jms/FooQueue" name="jms/FooQueue">
</resourcelink>




Building JMSSenderAMQ

Now lets start building the sender web application
Update the web.xml as below

/WEB-INF/web.xml

  1. Application context setup with servlet context
  2. JNDI setup for connection
  3. JNDI setup for queue name



<web-app version="2.4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/j2ee" xsi:schemalocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    
    <context-param>
      <param-name>log4jConfigLocation</param-name><param-value>/WEB-INF/classes/log4j.xml</param-value></context-param>
    <listener>
      <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
    
    <context-param>
      <param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring/jms-context.xml</param-value></context-param>
    <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
      <servlet-name>JMSSenderAMQ</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
      <servlet-name>JMSSenderAMQ</servlet-name>
      <url-pattern>*.html</url-pattern>
    </servlet-mapping>
    
    <resource-ref>
      <description>JMS Connection</description>
      <res-ref-name>jms/ConnectionFactory</res-ref-name>
      <res-type>org.apache.activemq.ActiveMQConnectionFactory</res-type>
      <res-auth>Container</res-auth>
      <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>
    
    <resource-ref>
      <res-ref-name>jms/FooQueue</res-ref-name>
      <res-type>javax.jms.Queue</res-type>
      <res-auth>Container</res-auth>
      <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>
  </web-app>




/WEB-INF/JMSSenderAMQ-servlet.xml
Next is to update the servlet contexy of sender application
Nothing special, just need annotation configuration for controller






<beans xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemalocation="
  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">

  <context:component-scan base-package="com.icodingclub.jms.web"></context:component-scan>
  
  <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"></bean>
  
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"></bean>
  
</beans>




/WEB-INF/spring/jms-context.xml
This is the first, very important file.
Things to note down here are
  1. JNDI setup for connection
  2. JNDI setup for queue name
  3. connection and session pooling (cachedConnectionFactory)




<beans xmlns:jee="http://www.springframework.org/schema/jee" xmlns:jms="http://www.springframework.org/schema/jms" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemalocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
    http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd">

  <jee:jndi-lookup cache="true" expected-type="org.apache.activemq.ActiveMQConnectionFactory" id="connectionFactory" jndi-name="java:comp/env/jms/ConnectionFactory" lookup-on-startup="true" proxy-interface="javax.jms.ConnectionFactory" resource-ref="true"></jee:jndi-lookup>

  <jee:jndi-lookup cache="true" expected-type="org.apache.activemq.command.ActiveMQQueue" id="fooQueue" jndi-name="java:comp/env/jms/FooQueue" lookup-on-startup="true" proxy-interface="javax.jms.Queue" resource-ref="true"></jee:jndi-lookup>


  <bean class="org.springframework.jms.connection.CachingConnectionFactory" id="cachedConnectionFactory" p:sessioncachesize="10" p:targetconnectionfactory-ref="connectionFactory"></bean>


  <bean class="org.springframework.jms.core.JmsTemplate" id="jmsTemplate" p:connectionfactory-ref="cachedConnectionFactory" p:defaultdestination-ref="fooQueue"></bean>

  <bean class="com.icodingclub.jms.service.AMQMsgSenderService" id="messageSenderService" p:jmstemplate-ref="jmsTemplate"></bean>

</beans>




com.icodingclub.jms.web.ProducerController

This is sender controller, nothing special here



package com.icodingclub.jms.web;

import java.io.IOException;
import java.util.Calendar;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.icodingclub.jms.service.MsgSenderService;

/**
 * @author Praveen k Singh
 * 
 */
@Controller
public class ProducerController
{

 private static final Logger LOG = Logger.getLogger(ProducerController.class);

        @Autowired
 private AMQMsgSenderService messageSenderService;

 @RequestMapping(value = "/amqTest.html", method = RequestMethod.GET)
 public void amqLoadTest() throws IOException
 {
  LOG.info("Inside Controller");

  Calendar cal = Calendar.getInstance();
  try
  {
   messageSenderService.sendMessage("Message on: " + cal);
  }
  catch (Exception e)
  {
   e.printStackTrace();
  }
 }

}


com.icodingclub.jms.service.AMQMsgSenderService
Service class for sender its task is to create the JMS message.
Right now it is TextMessage, but can be changed to any other message type




package com.icodingclub.jms.service;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.log4j.Logger;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;


/**
 * @author Praveen k Singh
 * 
 */
public class AMQMsgSenderService
{

  private static final Logger LOG = Logger.getLogger(AMQMsgSenderService.class);
  
  private JmsTemplate jmsTemplate;

  public void sendMessage(final String msg) throws JMSException
  {
    jmsTemplate.send(new MessageCreator()
    {
      public Message createMessage(Session session) throws JMSException
      {
        LOG.info("SENDING: " + msg);
        TextMessage message = session.createTextMessage(msg);
        return message;
      }
    });
  }

  public void setJmsTemplate(JmsTemplate jmsTemplate)
  {
    this.jmsTemplate = jmsTemplate;
  }

}



Building JMSListnerAMQ

Lest start building the JMSListner jar.
It will be new web project


JMSListner Server configuration
Dump all jars again in Listner server
do the config changes

TOMCAT_LIS_PATH/conf/server.xml


<resource auth="Container" brokername="FooBroker" brokerurl="vm://localhost?brokerConfig=xbean:conf/activemq.xml" description="JMS Connection Factory" factory="org.apache.activemq.jndi.JNDIReferenceFactory" name="jms/ConnectionFactory" type="org.apache.activemq.ActiveMQConnectionFactory"></resource>
  
  <resource auth="Container" description="A sample queue" factory="org.apache.activemq.jndi.JNDIReferenceFactory" name="jms/FooQueue" physicalname="TEST.Q1" type="org.apache.activemq.command.ActiveMQQueue"></resource>




TOMCAT_LIS_PATH/conf/context.xml



<resourcelink global="jms/ConnectionFactory" name="jms/ConnectionFactory">
  <resourcelink global="jms/FooQueue" name="jms/FooQueue">
</resourcelink></resourcelink>





/WEB-INF/web.xml

  1. Application context setup with servlet context
  2. JNDI setup for connection
  3. JNDI setup for queue name



<web-app id="WebApp_ID" version="2.5" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <context-param>
    <param-name>log4jConfigLocation</param-name><param-value>/WEB-INF/classes/log4j.xml</param-value></context-param>
  <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring/jms-context.xml</param-value></context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <servlet>
    <servlet-name>JMSListnerAMQ</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>JMSListnerAMQ</servlet-name>
    <url-pattern>*.html</url-pattern>
  </servlet-mapping>
  <resource-ref>
    <description>JMS Connection</description>
    <res-ref-name>jms/ConnectionFactory</res-ref-name>
    <res-type>org.apache.activemq.ActiveMQConnectionFactory</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
  </resource-ref>
  <resource-ref>
    <res-ref-name>jms/FooQueue</res-ref-name>
    <res-type>javax.jms.Queue</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
  </resource-ref>
</web-app>






/WEB-INF/JMXListnerAMQ-servlet.xml




<beans xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemalocation="
  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">
  <context:component-scan base-package="com">
  <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp">
</bean></bean></context:component-scan></beans>
</pre><br />
<br />
<br />
<u>/WEB-INF/spring/jms-context.xml</u><br />
<br />
<br />
<pre class="prettyprint lang-xml"><beans xmlns:jee="http://www.springframework.org/schema/jee" xmlns:jms="http://www.springframework.org/schema/jms" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemalocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
    http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd">

  <jee:jndi-lookup cache="true" expected-type="org.apache.activemq.ActiveMQConnectionFactory" id="connectionFactory" jndi-name="java:comp/env/jms/ConnectionFactory" lookup-on-startup="true" proxy-interface="javax.jms.ConnectionFactory" resource-ref="true"></jee:jndi-lookup>

  <jee:jndi-lookup cache="true" expected-type="org.apache.activemq.command.ActiveMQQueue" id="fooQueue" jndi-name="java:comp/env/jms/FooQueue" lookup-on-startup="true" proxy-interface="javax.jms.Queue" resource-ref="true"></jee:jndi-lookup>


  <bean class="org.springframework.jms.connection.CachingConnectionFactory" id="cachedConnectionFactory" p:sessioncachesize="10" p:targetconnectionfactory-ref="connectionFactory"></bean>

  <bean class="com.icodingclub.jms.listner.MessageListenerImpl" id="simpleMessageListener"></bean>

  <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer" id="jmsContainer">
    <property name="connectionFactory" ref="cachedConnectionFactory"></property>
    <property name="destination" ref="fooQueue"></property>
    <property name="messageListener" ref="simpleMessageListener"></property>
    <property name="maxConcurrentConsumers" value="1"></property>
  </bean>

</beans>




conf/activemq.xml
The configuration file for ActiveMQ




<beans xmlns:amq="http://activemq.apache.org/schema/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.3.0.xsd">

  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"></bean>

  <broker brokername="FooBroker" datadirectory="C:/activemq-5.5.0/data/" usejmx="true" xmlns="http://activemq.apache.org/schema/core">

    <managementcontext>
      <managementcontext connectorport="1099" jmxdomainname="my-broker"></managementcontext>
    </managementcontext>

    <persistenceadapter>
      
      <kahadb directory="C:/activemq-5.5.0/data/kahadb"></kahadb>
    </persistenceadapter>
    <systemusage>
      <systemusage>
        <memoryusage>
          <memoryusage limit="128 mb"></memoryusage>
        </memoryusage>
        <storeusage>
          <storeusage limit="1 gb"></storeusage>
        </storeusage>
        <tempusage>
          <tempusage limit="100 mb"></tempusage>
        </tempusage>
      </systemusage>
    </systemusage>

    <transportconnectors>
      <transportconnector name="openwire" uri="tcp://127.0.0.1:61616"></transportconnector>
    </transportconnectors>

  </broker>

</beans>



com.icodingclub.jms.listner.MessageListenerImpl

package com.icodingclub.jms.listner;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.apache.log4j.Logger;

public class MessageListenerImpl implements MessageListener
{
 private static final Logger LOG = Logger.getLogger(MessageListenerImpl.class);

 public void onMessage(Message message)
 {
  if ((message instanceof TextMessage))
  {
   try
   {
    LOG.info("RECEIVED: MESSAGE ID: " + message.getJMSMessageID());
    LOG.info("RECEIVED: MESSAGE TEXT: " + ((TextMessage) message).getText());
   }
   catch (JMSException e)
   {
    e.printStackTrace();
   }
  }
 }
}



rc/log4j.xml
 This is the common log4j file, will be used in both the application





<log4j:configuration debug="false" xmlns:log4j="http://jakarta.apache.org/log4j/">

  <appender class="org.apache.log4j.ConsoleAppender" name="CONSOLE-INFO">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%-5p - %-30c{1} - %m%n" /></layout>
    <filter class="org.apache.log4j.varia.LevelMatchFilter">
      <param name="levelToMatch" value="info" /><param name="acceptOnMatch" value="true" /></filter>
    <filter class="org.apache.log4j.varia.DenyAllFilter">
  </filter></appender>

  <logger name="org.apache">
    <level value="WARN">
  </level></logger>
  <logger name="org.springframework">
    <level value="debug">
  </level></logger>
  <logger name="org.apache.activemq">
    <level value="info">
  </level></logger>
  <logger name="org.apache.activemq.store.kahadb">
    <level value="warn">
  </level></logger>
  <logger name="com.icodingclub.jms">
    <level value="debug">
  </level></logger>

  <root>
    <priority value="debug">
    <appender-ref ref="CONSOLE-INFO">
  </appender-ref></priority></root>

</log4j:configuration>




JMX Code
Lets move to the JMX portion.
We have this simple class to monitor queue

package com.monitor;

import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

import org.apache.activemq.broker.jmx.BrokerViewMBean;
import org.apache.activemq.broker.jmx.QueueViewMBean;

public class AMQMonitorManger
{

 public static void main(String[] args) throws Exception
 {
  JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi");
  JMXConnector connector = JMXConnectorFactory.connect(url, null);
  connector.connect();
  MBeanServerConnection connection = connector.getMBeanServerConnection();
  ObjectName name = new ObjectName("my-broker:BrokerName=FooBroker,Type=Broker");

  BrokerViewMBean mbean = (BrokerViewMBean) MBeanServerInvocationHandler.newProxyInstance(
    connection, name, BrokerViewMBean.class, true);

  for (ObjectName queueName : mbean.getQueues())
  {
   QueueViewMBean queueMbean = (QueueViewMBean) MBeanServerInvocationHandler
     .newProxyInstance(connection, queueName, QueueViewMBean.class, true);

   if (queueMbean.getName().equals("TEST.Q1"))
   {
    System.out.println("enqueueCount: " + queueMbean.getEnqueueCount());
    System.out.println("dequeueCount: " + queueMbean.getDequeueCount());
    System.out.println("inFlightCount: " + queueMbean.getInFlightCount());
   }

  }
 }
}



Demo Video









Code


  1. JMSSenderAMQ.zip
  2. JMSListnerAMQ.zip
  3. AMQJMX.zip


19 comments:

  1. hi praveen good tuts and it is very helpful.
    i have a question.
    why do we need two tomcat cant we do it one both sender and listener configs.plz reply

    ReplyDelete
  2. @RizwanDec 2, 2011 06:59 AM
    Because it won't be a normal prod senario. Sender will be mostly on different JVM/box/network/etc.. Producer&Broker likely on same JVM (at least in smaller companies). Some may prefer to different JVMs for all.

    ReplyDelete
  3. hi Praveen,
    This post is very heplful to me .., i have one question
    ..
    delete or remove massage from mq ?

    ReplyDelete
  4. Hi Praveen,
    I tried to follow your example step by step on the listener and I am running into the following exception when deploying in tomcat:

    SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'connectionFactory': Invocation of init method failed; nested exception is javax.naming.NamingException: Cannot create resource instance


    Any ideas on what I could be missing

    ReplyDelete
    Replies
    1. Sorry I meant to say I followed your example step by step on the sender and I am getting the stack trace above

      Delete
    2. This comment has been removed by the author.

      Delete
  5. can u please share with us what was the issue, even i am facing the same problem

    ReplyDelete
    Replies
    1. This comment has been removed by the author.

      Delete
    2. use ResourceLink instead of resourcelink !!

      Delete
  6. Can u share all the required jars ?

    ReplyDelete
  7. hi Praveen,

    1). I have a JMS provider SonicMQ at server side, I have to bridge it with ActiveMQ or OpenJMS (client side)

    2). Client side JMS needs to communicate with MSMQ (Micro soft Other machine)

    For item 1 I am planning to use ActiveMQ and Camel
    For Item 2(Bridging JMS to MSMQ) what do you suggest?

    Regards,
    Pandu

    ReplyDelete
  8. This comment has been removed by the author.

    ReplyDelete
  9. Hi praveen...thanks for the pain that you took to explain...can u plz update this for jboss also....

    ReplyDelete
  10. Hi praveen can you please post the HornetQ with Jetty server....

    Thank You In Advance

    ReplyDelete
  11. Hi Praveen,
    in activemq.xml, is this datadirectory="C:/activemq-5.5.0/data/" really required activemq installation directory or can it be any path?
    how to create a durable subscriber with activemq?
    will kahaDB deallocates the memory after consuming the message from topic?

    Thanks In Advance,
    Rajesh

    ReplyDelete
  12. Hi Praveen,

    I got the below error:

    SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'connectionFactory': Invocation of init method failed; nested exception is org.springframework.jndi.TypeMismatchNamingException: Object of type [class org.apache.activemq.ActiveMQConnectionFactory] available at JNDI location [java:comp/env/jms/ConnectionFactory] is not assignable to [org.apache.activemq.ActiveMQConnectionFactory].

    Iam using ResourceLink. But still getting error.

    Thanks,
    Hari

    ReplyDelete
  13. Hi,

    It would be great if any one throw a light on how to resolve the JNDI issue that i have posted earlier (on 18th June).

    Thanks,
    Hari

    ReplyDelete
  14. Hi,

    JMS Sender is not sending messages (though no errors). Actually jmsTemplate.send is not doing any thing. If any one has come across such issue, please let me know the resolution for it.

    Thanks,
    Hari

    ReplyDelete