Инжектиране на 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;

  ...

}

Има ли причина да не мога да инжектирам тези Resources? Това не се поддържа ли в 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), но AFAIK те не засягат @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