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.
If there are multiple MDBs, will the spring context be loaded for each MDB?
Is there any way to access this spring application context with in a jar from this ejb(assume ejb n jar are part of ear)
Thanks