How to create a MDB 3.0 singleton ?
You can specify the maximum number of JMS Sessions that are available to concurrently deliver messages to an MDB using the maxSession property. Here is an example:
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "maxSessions", propertyValue = "1"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "TASK.QUEUE")
})
public class BuildTasksMessageListener implements MessageListener {
@Override
public void onMessage(Message message) {
try {
doSomethingUseful();
} catch (JMSException e) {
// Why can't I throw a JMS Exception
throw new RuntimeException(e);
}
}
// This is the only "useful" code in the class
private void doSomethingUseful() {
}
}
You can also set the max-session attribute in the XML descriptor:
<activation-config>
<activation-config-property>
<activation-config-property-name>maxSession</activation-config-property-name>
<activation-config-property-value>1</activation-config-property-value>
</activation-config-property>
</activation-config>
By setting max-session to 1 will essentially give you a singleton MDB.
Warning: a Message Driven Bean configured to run as Singleton can soon become a bottleneck for your application. If you want a higher scalability / availability of your MDB you should consider increasing the number of MDB session instead.
Older JBoss versions
If you are running JBoss 4/5/6 you can configure this at EJB container level by changing the server/$/deploy/ejb3-interceptors-aop.xml file:
<annotation expr="!class(@org.jboss.annotation.ejb.DefaultActivationSpecs)">
@org.jboss.annotation.ejb.DefaultActivationSpecs (value={@~ActivationConfigProperty(propertyName = "maxSession", propertyValue = "1")})
</annotation>
This will set the default for all message driven beans.
Recommended Articles
Learn How to Code Simple Message-Driven Bean (MDB) and Client Interaction in Enterprise Java
Master coding a simple MDB and Client interaction for asynchronous messaging with this tutorial. #EnterpriseJava #MDB #CloudNative
Exposing Stateless Session Bean as SOAP Web Service with JAX-WS
Learn how to expose a Stateless Session Bean as a SOAP web service endpoint in Java EE, including pros and cons compared to exposing POJOs.
Create Type Safe Instances Using EJB QL in Enterprise Java
Learn how to use EJB QL for type-safe object creation and property selection in Enterprise Java. #EnterpriseJava #EJBQL #TypeSafety
Mastering EJB 3: Simplifying Enterprise Java Development with Annotations
Learn how to simplify your EJB 3 development process using metadata annotations and declarative programming. Discover the power of session beans, stateless beans, and more in this comprehensive guide.