utilisant ejb 3.1, Servlet 3.0 (serveur GlassFish v3)Injecter ressource de dans servlets et les meilleures pratiques pour MDB
Scénario: Je MDB qui écoutent jms messages et donner un traitement à un autre grain de session (Stateless) . Servlet injectant une ressource jms.
Question 1: Pourquoi la servlet ne peut-elle pas injecter des ressources jms lorsqu'elle utilise une déclaration statique?
@Resource(mappedName = "jms/Tarturus")
private static ConnectionFactory connectionFactory;
@Resource(mappedName = "jms/StyxMDB")
private static Queue queue;
private Connection connection;
et
@PostConstruct
public void postConstruct() {
try {
connection = connectionFactory.createConnection();
} catch (JMSException e) {
e.printStackTrace();
}
}
@PreDestroy
public void preDestroy() {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
L'erreur que je reçois est:
[# | 2010-05-03T15: 18: 17.118 + 0300 | AVERTISSEMENT | glassfish3.0 | javax .enterprise.system.container.web.com.sun.enterprise.web | _ThreadID = 35; _ThreadName = Thread-1; | StandardWrapperValve [WorkerServlet]: PWC1382: allocation d'une exception pour le servlet WorkerServlet com.sun.enterprise.conta iner.common.spi.util.InjectionException: Erreur de création objet géré pour classe ua.co.rufous.server.services.WorkerServiceImpl à com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.createManagedObject (InjectionManagerImpl.java:312) à com.sun.enterprise.web.WebContainer.createServletInstance (WebContainer.java:709) à com.sun.enterprise.web.WebModule.createServletInstance (WebModule.java:1937) au org.apache.catalina.core.StandardWrapper.loadServlet (StandardWrapper.java:1252) Causé par: com.sun.enterprise.container.common.spi.util.InjectionException: Exception essayant d'injecter Unresolved message-destination-Ref ua.co.rufous.server.services.WorkerServiceImpl/file d'attente @ java.lang.String @ null dans la classe ua.co.rufous.server.services.WorkerServiceImpl au com.sun.enterprise.conteneur.common.impl.util.InjectionManagerImpl._inject (InjectionManagerImpl.java:614) au com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.inject (InjectionManagerImpl.java: 384) à com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.injectInstance (InjectionManagerImpl.java:141) à com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.injectInstance (Inje ctionManagerImpl.java:127) à com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.createManagedObject (InjectionManagerImpl.java:306) ... 27 plus Causée par: com.sun.enterprise.container .common.spi.util.InjectionException: L'utilisation illégale de champ statique privé javax.jms.Queue statique ua.co.rufous.server.services.WorkerServiceImpl.queue sur la classe qui ne supporte que l'injection à base d'instance à com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject (InjectionManagerImpl.java:532) ...31 plus | #]
mon MDB:
/**
* asadmin commands
* asadmin create-jms-resource --restype javax.jms.ConnectionFactory jms/Tarturus
* asadmin create-jms-resource --restype javax.jms.Queue jms/StyxMDB
* asadmin list-jms-resources
*/
@MessageDriven(mappedName = "jms/StyxMDB", activationConfig =
{
@ActivationConfigProperty(propertyName = "connectionFactoryJndiName", propertyValue = "jms/Tarturus"),
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class StyxMDB implements MessageListener {
@EJB
private ActivationProcessingLocal aProcessing;
public StyxMDB() {
}
public void onMessage(Message message) {
try {
TextMessage msg = (TextMessage) message;
String hash = msg.getText();
GluttonyLogger.getInstance().writeInfoLog("geted jms message hash = " + hash);
} catch (JMSException e) {
}
}
}
tout fonctionne bien sans déclaration statique:
@Resource(mappedName = "jms/Tarturus")
private ConnectionFactory connectionFactory;
@Resource(mappedName = "jms/StyxMDB")
private Queue queue;
private Connection connection;
Question 2: quelle est la meilleure pratique pour travailler avec MDB: traitement requête complète dans onMessage() ou appel d'un autre bean (bean Stateless dans mon cas) dans la méthode onMessage() qui le traiterait. Traitement comprenant quelques appels aux services de savon, de sorte que le temps de traitement complet pourrait être de 3 secondes.
Merci.
Merci, Justin. –
Ma servlet est une servlet GWT en réalité, donc je vais devoir tester si GWT est compatible avec la méthode asynchrone de Servlet 3.0. En réalité, gwt possède sa propre méthode GWT.runAsync(), mais n'a pas encore regardé à l'intérieur si elle supporte naturellement la même méthode async que servlet 3.0 ou si elle fonctionne avec les méthodes asynchrones 3.0 de servlet. –
Ok, On dirait que je peux gérer tout ce dont j'ai besoin sans MDB dans mon cas. À propos de GWT.runAsync() - c'est différent. Excellente présentation, merci! –