eclipse-ee4j / glassfish

Eclipse GlassFish
https://eclipse-ee4j.github.io/glassfish/
379 stars 144 forks source link

Can't send a JMS message from WebSocket's onMessage #20468

Closed glassfishrobot closed 3 years ago

glassfishrobot commented 11 years ago

The following code fails to send an incoming WebSocket message to a JMS queue:

@ServerEndpoint("/websocket")
public class SampleWebSocket implements Serializable {

    @Resource(mappedName = "jms/myQueue")
    private Queue myQueue;
    @Inject
    private JMSContext jmsContext;

    @OnMessage
    public void onMessage(String message, Session client) {
        try {
            jmsContext.createProducer().send(myQueue, message);
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "message sent to queue");
        } catch (RuntimeException ex) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "RE on websocket.onMessage", ex);
        }
    }
}

This is the exception (not logged by GF due to #20467)

SEVERE:   RE on websocket.onMessage
org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.enterprise.context.RequestScoped
    at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:667)
    at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:74)
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:79)
    at org.glassfish.jms.injection.RequestedJMSContextManager$Proxy$_$$_WeldClientProxy.getType(Unknown Source)
    at org.glassfish.jms.injection.InjectableJMSContext.delegate(InjectableJMSContext.java:126)
    at org.glassfish.jms.injection.ForwardingJMSContext.createProducer(ForwardingJMSContext.java:61)
    at org.glassfish.javaee7wsjms.SampleWebSocket.onMessage(SampleWebSocket.java:65)

Because JMSContext is @RequestScoped, and a WebSocket message has the same behaviour as an HTTP request, it should be possible to use the injected JMSContext to send a message to a Queue from WebSocket.onMessage method.

The following code works fine:

@ServerEndpoint("/websocket")
public class SampleWebSocket implements Serializable {

    @Resource(mappedName = "jms/myQueue")
    private Queue myQueue;
    @Resource(lookup = "java:comp/DefaultJMSConnectionFactory")
    private ConnectionFactory defaultConnectionFactory;

    @OnMessage
    public void onMessage(String message, Session client) {
        try (JMSContext context = defaultConnectionFactory.createContext();) {
            context.createProducer().send(myQueue, message);
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "message sent to queue");
        } catch (RuntimeException ex) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "websocket.onMessage", ex);
        }
    }
}

This issue is also related to #20371 (and it might influence JMS_SPEC-100)

Affected Versions

[4.0_dev]

glassfishrobot commented 6 years ago
glassfishrobot commented 11 years ago

@glassfishrobot Commented @jjsnyder said: The @Resource works because it's a resource injection of an object that is in JNDI. It is not a CDI-scoped injected object.

The @Inject fails for the same reason as: https://java.net/jira/browse/GLASSFISH-20371

glassfishrobot commented 11 years ago

@glassfishrobot Commented @jjsnyder said: This will require a CDI spec change. See https://issues.jboss.org/browse/CDI-370

glassfishrobot commented 11 years ago

@glassfishrobot Commented @jjsnyder said: This issue really is a usage issue of the JMSContext. The JMSContext requires a global Transaction or an active CDI request context. At the time the injected JMSContext is being used there is no global transaction and no active CDI request context and so the exception is thrown.

There is ongoing discussions on whether the CDI request context can be expanded to account for WebSocket and if WebSocket needs to create its own CDI scope. In any case this issue is a usage issue irt how WebSocket uses the JMSContext.

glassfishrobot commented 11 years ago

@glassfishrobot Commented Was assigned to dannycoward

glassfishrobot commented 7 years ago

@glassfishrobot Commented This issue was imported from java.net JIRA GLASSFISH-20468

glassfishrobot commented 11 years ago

@glassfishrobot Commented Reported by miojo

github-actions[bot] commented 4 years ago

This issue has been marked as inactive and old and will be closed in 7 days if there is no further activity. If you want the issue to remain open please add a comment

github-actions[bot] commented 3 years ago

This issue has been marked as inactive and old and will be closed in 7 days if there is no further activity. If you want the issue to remain open please add a comment