2014-07-25 1 views
0

J'ai un simple WebSocket implémenté dans JavaEE 7 que j'aimerais utiliser comme producteur JMS. Cependant, quand j'essaye d'injecter le ConnectionFactory et le Queue dedans comme JavaEE @Resource je vois toujours qu'il est nul. Mon code ressemble à ceci:Injecter JMS ConnectionFactory et la file d'attente dans un WebSocket?

@Named 
@ServerEndpoint("/hello") 
public class WebSocketA implements Serializable { 

    @Resource(mappedName = "java:/JmsXA") 
    private ConnectionFactory connectionFactory = null; 

    @Resource(mappedName = "java:jboss/exported/jms/queue/test") 
    private Queue testQueue = null; 

    ... 

} 

Y at-il une raison pour laquelle je ne peux pas injecter ces Resource s? Cela n'est-il pas pris en charge dans JavaEE WebSockets? Je déploie sur Wildfly 8.1, et mon application est une simple WAR avec seulement la classe d'implémentation WebSocket à l'intérieur.

+0

Il y a des problèmes connus avec CDI et WebSockets (https://java.net/jira/plugins/servlet/mobile#issue/GLASSFISH-20468) mais AFAIK ils n'affectent pas l'injection '@ Resource'. Avez-vous essayé un serveur différent, peut-être Glassfish 4 pour vous assurer que ce n'est pas un problème de Wildfly? – Baldy

+0

Je n'ai pas. Notre environnement de déploiement est JBoss/Wildfly, nous devons donc nous assurer que nous pouvons le faire fonctionner sur cette plate-forme. Cela ne nous aide pas si cela fonctionne sur Glassfish, malheureusement. – Shadowman

+0

Etes-vous sûr que le nom JNDI configuré est correct? Vous pouvez rechercher manuellement le nom JNDI à tester, voir, par exemple, https://github.com/wildfly/quickstart/blob/master/helloworld-jms/src/main/java/org/jboss/as/quickstarts/jms/ HelloWorldJMSClient.java –

Répondre

1

Il semble qu'il y ait quelques problèmes avec l'injection JMS en utilisant certains beans CDI. J'ai été en mesure de faire fonctionner l'injection en utilisant @javax.inject.Singleton ou @javax.ejb.Stateless. J'ai supprimé l'annotation @Named dans les deux cas. Je n'ai pas testé l'injection du Queue, juste le ConnectionFactory

Je l'ai testé avec la dernière Glassfish 4 build promu avec un projet web simple avec juste la classe WebSocket:

@Stateless 
@ServerEndpoint("/hello") 
public class WsTest implements Serializable { 
    private static final Logger LOG = Logger.getLogger(WsTest.class.getName()); 

    @Resource(mappedName = "java:comp/DefaultJMSConnectionFactory") 
    private ConnectionFactory connectionFactory = null; 

    @OnOpen 
    public void onOpen(Session session) throws IOException { 
     LOG.log(Level.INFO, "onOpen {0}", connectionFactory); 
     session.getBasicRemote().sendText("onOpen"); 
    } 

    @OnMessage 
    public String echo(String message) { 
     LOG.log(Level.INFO, "onMessage({0}) {1}", new Object[]{message, connectionFactory}); 
     return message + " (from your server)"; 
    } 

    @OnError 
    public void onError(Throwable t) { 
     LOG.log(Level.INFO, "onError {0}", connectionFactory); 
    } 

    @OnClose 
    public void onClose(Session session) { 
     LOG.log(Level.INFO, "onClose {0}", connectionFactory); 
    } 
} 
+0

Merci! Je vais m'assurer de faire un essai chez Wildfly/JBoss pour voir si ça marche pour moi. – Shadowman

Questions connexes