将JMS ConnectionFactory和Queue注入WebSocket?

时间:2014-07-25 14:28:46

标签: java-ee jboss websocket jms wildfly

我在JavaEE 7中实现了一个简单的WebSocket,我想充当JMS生产者。但是,当我尝试将ConnectionFactoryQueue作为JavaEE @Resource注入其中时,我总是看到它为空。我的代码如下所示:

@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;

  ...

}

我有没有理由不能注入这些Resource?这是JavaEE WebSockets中不支持的吗?我在Wildfly 8.1上部署,我的应用程序是一个简单的WAR,其中只包含WebSocket实现类。

1 个答案:

答案 0 :(得分:1)

似乎使用某些CDI bean注入JMS存在一些问题。我可以使用@javax.inject.Singleton@javax.ejb.Stateless让注射工作正常。我在两种情况下都删除了@Named注释。我没有测试Queue的注入,只测试ConnectionFactory

我使用最新的Glassfish 4升级版本进行了测试,其中包含一个只有WebSocket类的简单Web项目:

@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);
    }
}