Spring EJB 3 Integration
Integrating Spring with EJB allows Session and Message Driven Beans leverage existing Spring infrastructure easily. In this post, I will show how to access Spring beans from a Message Driven Bean. This post builds on my previous “EJB 3 Message Driven Beans in WebLogic 10.3” post.
Step 1: Add the following Spring jar files to the APP-INFlib folder of the EAR project.
org.springframework.aop-3.0.0.RELEASE.jar
org.springframework.asm-3.0.0.RELEASE.jar
org.springframework.aspects-3.0.0.RELEASE.jar
org.springframework.beans-3.0.0.RELEASE.jar
org.springframework.context.support-3.0.0.RELEASE.jar
org.springframework.context-3.0.0.RELEASE.jar
org.springframework.core-3.0.0.RELEASE.jar
org.springframework.expression-3.0.0.RELEASE.jar
org.springframework.jms-3.0.0.RELEASE.jar
commons-logging.jar
log4j-1.2.14.jar
Step 2: The next step is to create a Spring context file in the EJB project to hold the bean definitions. Here is the application-Context.xml file with a simple Spring bean:
When deployed, the application-Context file should be at the root of the EJB jar.
Step 3: The next step is to modify the Message Driven Bean to use the messageSuffix Spring bean. Here is the modified MDB:
public class TestMdb implements MessageListener { @Autowired @Qualifier("messageSuffix") private String messageSuffix; public void onMessage(Message message) { System.out.println(message + ". " + messageSuffix); } }
Step 4: To next step is to add SpringBeanAutowiringInterceptor to the MDB. The SpringBeanAutowiringInterceptor is an EJB 3 compliant interceptor that injects Spring beans into @AutoWired annotated fields and methods. Here is the complete MDB:
package com.inflinx.blog.springmdb; import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.interceptor.Interceptors; import javax.jms.Message; import javax.jms.MessageListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor; @MessageDriven( mappedName = "jndi.blogQueue", activationConfig = { @ActivationConfigProperty( propertyName = "destinationType", propertyValue = "javax.jms.Queue" )} ) @Interceptors(SpringBeanAutowiringInterceptor.class) public class TestMdb implements MessageListener { @Autowired @Qualifier("messageSuffix") private String messageSuffix; public void onMessage(Message message) { System.out.println(message + ". " + messageSuffix); } }
The SpringBeanAutowiringInterceptor by default looks for a beanRefContext.xml file in the classpath to create an ApplicationContext. Create the beanRefContext.xml file with the following content:
This completes the Spring EJB integration. Deploy the EJB and run the MessageGenerator test class. You should see the message “TextMessage[ID:<655281.1269371402940.0>, null]. Now With Spring!!” in the server console.
Download the source code for this project here.