glassfish
  1. glassfish
  2. GLASSFISH-20468

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

    Details

    • Type: Bug Bug
    • Status: Reopened
    • Priority: Major Major
    • Resolution: Unresolved
    • Affects Version/s: 4.0_b86_RC2
    • Fix Version/s: future release
    • Component/s: web_socket
    • Labels:
      None

      Description

      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 GLASSFISH-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 GLASSFISH-20371 (and it might influence JMS_SPEC-100)

        Activity

        Hide
        jjsnyder83 added a comment -

        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

        Show
        jjsnyder83 added a comment - 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
        Hide
        jjsnyder83 added a comment -

        This will require a CDI spec change. See https://issues.jboss.org/browse/CDI-370

        Show
        jjsnyder83 added a comment - This will require a CDI spec change. See https://issues.jboss.org/browse/CDI-370
        Hide
        jjsnyder83 added a comment -

        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.

        Show
        jjsnyder83 added a comment - 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.

          People

          • Assignee:
            dannycoward
            Reporter:
            Bruno Borges
          • Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

            • Created:
              Updated: