Tuesday, December 30, 2008

Changing the root web application in Tomcat 6

These days I am very busy developing a large and complex web application, which is nearing its first release. This web based product runs on Tomcat 6 and will be deployed on http://www.mydomain.com
But if I deploy my web application on Tomcat 6, I need to specify the context root. Well this is no good, why will the users of this website be willing to remember the context root. What if the context root changes. In other words the users would not be interest in typing the following - http://www.mydomain.com/myappcontext to visit this site.
Hence it is necessary that I change the default / root web application of Tomcat and point it to my application. I wanted to try and test this on localhost first. As always I Googled and found a number of posts and none seem to work. I also read the documentation it was helpful in understanding the concepts but was not effective as I could not get it working. Finally after few hours of trial and error one of my colleague Joyeeta Majumdar found the solution. Here it is step by step account.
1> I use Maven 2 + Eclipse 3.4 to build my web application. If I run the Maven 'install' goal the web application is generated in the target folder. It is available both as .war file and in exploded form. In my case it generated as Jing-Web-0.0.1-SNAPSHOT and Jing-Web-0.0.1-SNAPSHOT.war in the folder c:\jingworkspace\Jing-Web-Main\Jing-Web\target
2> Create a folder <engine>/<hostname>. In my case - Catalina\localhost. This folder is created under <Tomcat_Home>/conf. In my case this is C:\tomcat6\conf.
3> Create a file named ROOT.xml (case-sensitive) in the C:\tomcat6\conf\Catalina\localhost folder.
4> Here is the content of my ROOT.xml file
You will need to change the docBase attribute to the location of the exploded web application.
No changes to be made either in server.xml or context.xml located in c:\tomcat6\conf folder.
Now try http://localhost:8080/ and it should take us to Jing-Web application. You may need to delete the contents of your browser cache(press F5) to view the changes. You may also need to delete the contents of <Tomcat_Home>/work directory to get this working.

Sunday, December 21, 2008

Consuming a JMS Message from ActiveMQ using Spring Message Driven POJO

In my last post, I had shown how you can post a JMS message to a ActiveMQ queue. In this post I will show the reverse process. I will not try to consume this message using a Spring Message Driven POJO. I assume your familiarity with Spring MDP. If not you can look here - http://static.springframework.org/spring/docs/2.5.x/reference/jms.html
The operation that I intend to carry out is depicted in Figure 1.
image
Figure 1 - Consuming JMS message using Spring MDP


Step 1 - Create the message listener.
Listing 1 - EventMessageConsumer.java

Step 2 - Wire up the bean in Spring configuration
Listing 2 - spring-activemq-config.xml

Step 3  - Test
Finally you can see the results of message produced and consumed in the Admin web console as shown in Figure 2.
image
Figure 2 - Queue statistics

Sending JMS message to ActiveMQ using Spring 2.5 from a web application


Last Updated 04/16/2017

In this post, I will show how you can send JMS message to ActiveMQ from your Spring web application. I have a Spring 2.5 + JBOSS Richfaces based web application that runs on Tomcat 6 running on JDK 5. Figure 1. depicts what I intend to do.
F1
Figure - 1 Send JMS Message to ActiveMQ using Spring from a web application


Step 1: Drop in the following jars to WEB-INF/lib
  • activemq-core-5.2.0.jar
  • jms.jar
  • geronimo-j2ee-management_1.0_spec-1.0.jar
Step 2: Create the destination/Queue using the ActiveMQ admin web application.

Launch your browser and point it to - http://localhost:8161/admin/
image
Figure 2 - ActiveMQ Admin Console


Click on 'Queues' to navigate to queue list and create screen. You will need to supply the queue name and click on 'Create' to create a new queue destination on ActiveMQ server. This is shown in Figure 3.
image
Figure 3 - Create a new Queue

Step 3. Create a message producer interface.
This may not be necessary, but since I prefer to implement Program to Interface in my application I define a message producer interface.

This interface defines a single method(can have more, but for now this will suffice) which accepts an object (Java bean) which will be passed to the Queue.

Step 4. An implementation of the MessageProducer interface
This class is responsible for sending a particular JavaBean object to the queue (your goal may be different / may want to send something different). The key is the send method. It uses a MessageCreator to consume the supplied Event object. It then uses the JmsTemplate to send this message to the destination.
Step 5. Provide the message creator implementation


Step 6 - Wire up in Spring configuration

Step 7 - Client of the message producer
Now we need a client to use the message producer. The Event business service class will use this message producer.

Step 8 - Configure in Spring application context.
The message producer is injected by the Spring framework. Here is the configuration snippet from the service configuration.

Step 9 - Test for message
Finally I restart my Tomcat when everything is ready, launch the event entry form, fill in data and click on Send button in the screen. The event details are now in the queue. You can test this in the ActiveMQ admin web console as shown in the Figure - 4 below.
image
Figure 4 - New message now in the Queue.