Внедрить JMS ConnectionFactory и Queue в WebSocket?

У меня есть простой WebSocket, реализованный в JavaEE 7, и я хотел бы выступать в качестве производителя 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.


person Shadowman    schedule 25.07.2014    source источник
comment
Известны проблемы с CDI и WebSockets (java.net/jira/plugins /servlet/mobile#issue/GLASSFISH-20468), но, насколько я знаю, они не влияют на @Resource внедрение. Вы пробовали другой сервер, возможно, Glassfish 4, чтобы убедиться, что это не проблема Wildfly?   -  person Baldy    schedule 29.07.2014
comment
Я не. Наша среда развертывания — JBoss/Wildfly, поэтому нам нужно убедиться, что мы сможем заставить ее работать на этой платформе. К сожалению, нам не поможет, если он работает на Glassfish.   -  person Shadowman    schedule 30.07.2014
comment
Вы уверены, что сконфигурированное имя JNDI правильное? Вы можете вручную найти имя JNDI для проверки, см., например, github.com/wildfly/quickstart/blob/master/helloworld-jms/src/   -  person Alexander Langer    schedule 31.07.2014


Ответы (1)


Похоже, что есть некоторые проблемы с внедрением JMS с использованием определенных компонентов CDI. Я смог заставить инъекцию работать, используя @javax.inject.Singleton или @javax.ejb.Stateless. Я удалил аннотацию @Named в обоих случаях. Я не проверял впрыск Queue, только ConnectionFactory

Я протестировал последнюю сборку Glassfish 4 с простым веб-проектом только с классом 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);
    }
}
person Baldy    schedule 30.07.2014
comment
Спасибо! Я обязательно попробую это в Wildfly/JBoss, чтобы посмотреть, сработает ли это для меня. - person Shadowman; 30.07.2014