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.
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.
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.
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/
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.
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.
Figure 4 - New message now in the Queue.

Tuesday, November 4, 2008

Initializing static fields of Spring beans

New Solution - Updated 4/16/2017

The old solution shown below is very cumbersome. So here is the new solution which is much easier.

Old solution

This solution is courtesy Chris Harris UK.
  • Step 1: Create a bean factory post processor. 
  • Step 2 : Create the simple test class
Step 3 : Finally wire up everything in Spring configuration file