我在JavaEE 7中实现了一个简单的WebSocket,我想充当JMS生产者。但是,当我尝试将ConnectionFactory
和Queue
作为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实现类。
答案 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);
}
}