You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Nick Williams <ni...@nicholaswilliams.net> on 2013/03/11 22:59:01 UTC

Having WebSocket Issues (Tomcat 8)

I'm trying to create what I thought was a very simple WebSocket example, but boy have I had difficulties…

I started by basically coping the EchoAnnotation example from the Tomcat examples. However, it was like my endpoint was never getting instantiated. (Is this temporary? Will Tomcat 8 ultimately scan for and instantiate these endpoints? Or will the server container always have to be created manually?)

I then noticed the listener that the examples application was using to initialize the container and add the endpoints. I didn't want to tie my example to the Tomcat classes, so I tried to do it a bit more generically based on the WebSocket API. Below you will find the listener I created. It compiles just fine, but on deployment I get the very unusual error further down. What's up with this? Is this just an example of Tomcat being behind the RC1 API?

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.websocket.server.ServerContainer;
import javax.websocket.server.ServerContainerProvider;

@WebListener
public class WebSocketInitializerListener implements ServletContextListener
{
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent)
    {
        try
        {
            ServerContainer container = ServerContainerProvider.getServerContainer();
            container.addEndpoint(EchoEndpoint.class);
        }
        catch (Exception e)
        {
            System.err.println(e.toString());
            e.printStackTrace(System.err);
            throw new RuntimeException("Could not start WebSocket container.");
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent)
    {

    }
}

SEVERE: Exception sending context initialized event to listener instance of class com.wrox.WebSocketInitializerListener
java.lang.IllegalAccessError: tried to access method javax.websocket.server.ServerContainerProvider.getServerContainer()Ljavax/websocket/server/ServerContainer; from class com.wrox.WebSocketInitializerListener
	at com.wrox.WebSocketInitializerListener.contextInitialized(WebSocketInitializerListener.java:17)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4769)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5210)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:702)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:698)
	at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1492)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:487)
	at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
	at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:791)
	at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:468)
	at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:415)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:487)
	at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
	at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:791)
	at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1465)
	at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:75)
	at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1306)
	at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1398)
	at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:827)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:487)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)
	at sun.rmi.transport.Transport$1.run(Transport.java:177)
	at sun.rmi.transport.Transport$1.run(Transport.java:174)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: Having WebSocket Issues (Tomcat 8)

Posted by Nick Williams <ni...@nicholaswilliams.net>.
On Mar 11, 2013, at 5:50 PM, Mark Thomas wrote:

> On 11/03/2013 22:38, Nick Williams wrote:
>> However, I do still have the original question: Will I always need to
>> use a listener to add my endpoints programmatically like I did below?
>> Or will Tomcat eventually scan for endpoints? The examples
>> downloadable from the GlassFish project "just work" ... there is no
>> listener or call to ServerContainerProvider.getServerContainer(). Not
>> sure if that's GlassFish doing something special that's not in the
>> spec, or if the Tomcat implementation just doesn't have this feature
>> yet.
> 
> The SCI should be scanning for them already.
> 

My endpoint class was not get recognized/instantiated. I had a breakpoint in the constructor and I never hit it. Only when I added the listener that called addEndpoint(EchoEndpoint.class) did it start getting instantiated (and I started hitting the breakpoint and being able to call the endpoint). However, I have now deleted the listener, and the endpoint is still getting instantiated. I'm very confused. I didn't change a line of code in the endpoint. It's exactly like it was before, when it wasn't getting instantiated. *scratches head*

I'm going crazy over here…

Oh, well. It least it's working.

N
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: Having WebSocket Issues (Tomcat 8)

Posted by Mark Thomas <ma...@apache.org>.
On 11/03/2013 22:38, Nick Williams wrote:
> However, I do still have the original question: Will I always need to
> use a listener to add my endpoints programmatically like I did below?
> Or will Tomcat eventually scan for endpoints? The examples
> downloadable from the GlassFish project "just work" ... there is no
> listener or call to ServerContainerProvider.getServerContainer(). Not
> sure if that's GlassFish doing something special that's not in the
> spec, or if the Tomcat implementation just doesn't have this feature
> yet.

The SCI should be scanning for them already.

Mark

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: Having WebSocket Issues (Tomcat 8)

Posted by Nick Williams <ni...@nicholaswilliams.net>.
I got this working by changing ServerContainerProvider#getServerContainer() to be public, per the spec. I submitted bug 54671 with patch.

However, I do still have the original question: Will I always need to use a listener to add my endpoints programmatically like I did below? Or will Tomcat eventually scan for endpoints? The examples downloadable from the GlassFish project "just work" ... there is no listener or call to ServerContainerProvider.getServerContainer(). Not sure if that's GlassFish doing something special that's not in the spec, or if the Tomcat implementation just doesn't have this feature yet.

N

On Mar 11, 2013, at 4:59 PM, Nick Williams wrote:

> I'm trying to create what I thought was a very simple WebSocket example, but boy have I had difficulties…
> 
> I started by basically coping the EchoAnnotation example from the Tomcat examples. However, it was like my endpoint was never getting instantiated. (Is this temporary? Will Tomcat 8 ultimately scan for and instantiate these endpoints? Or will the server container always have to be created manually?)
> 
> I then noticed the listener that the examples application was using to initialize the container and add the endpoints. I didn't want to tie my example to the Tomcat classes, so I tried to do it a bit more generically based on the WebSocket API. Below you will find the listener I created. It compiles just fine, but on deployment I get the very unusual error further down. What's up with this? Is this just an example of Tomcat being behind the RC1 API?
> 
> import javax.servlet.ServletContextEvent;
> import javax.servlet.ServletContextListener;
> import javax.servlet.annotation.WebListener;
> import javax.websocket.server.ServerContainer;
> import javax.websocket.server.ServerContainerProvider;
> 
> @WebListener
> public class WebSocketInitializerListener implements ServletContextListener
> {
>    @Override
>    public void contextInitialized(ServletContextEvent servletContextEvent)
>    {
>        try
>        {
>            ServerContainer container = ServerContainerProvider.getServerContainer();
>            container.addEndpoint(EchoEndpoint.class);
>        }
>        catch (Exception e)
>        {
>            System.err.println(e.toString());
>            e.printStackTrace(System.err);
>            throw new RuntimeException("Could not start WebSocket container.");
>        }
>    }
> 
>    @Override
>    public void contextDestroyed(ServletContextEvent servletContextEvent)
>    {
> 
>    }
> }
> 
> SEVERE: Exception sending context initialized event to listener instance of class com.wrox.WebSocketInitializerListener
> java.lang.IllegalAccessError: tried to access method javax.websocket.server.ServerContainerProvider.getServerContainer()Ljavax/websocket/server/ServerContainer; from class com.wrox.WebSocketInitializerListener
> 	at com.wrox.WebSocketInitializerListener.contextInitialized(WebSocketInitializerListener.java:17)
> 	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4769)
> 	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5210)
> 	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
> 	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726)
> 	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:702)
> 	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:698)
> 	at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1492)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at java.lang.reflect.Method.invoke(Method.java:487)
> 	at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
> 	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
> 	at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:791)
> 	at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:468)
> 	at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:415)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at java.lang.reflect.Method.invoke(Method.java:487)
> 	at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
> 	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
> 	at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:791)
> 	at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1465)
> 	at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:75)
> 	at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1306)
> 	at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1398)
> 	at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:827)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at java.lang.reflect.Method.invoke(Method.java:487)
> 	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322)
> 	at sun.rmi.transport.Transport$1.run(Transport.java:177)
> 	at sun.rmi.transport.Transport$1.run(Transport.java:174)
> 	at java.security.AccessController.doPrivileged(Native Method)
> 	at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
> 	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:556)
> 	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:811)
> 	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:670)
> 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
> 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
> 	at java.lang.Thread.run(Thread.java:722)


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org