That is an open bug with no good solution (yet)

https://bugs.eclipse.org/bugs/show_bug.cgi?id=423646

There are 2 current workarounds on standalone client use at the moment.

1) use System.exit() on your standalone when you want to shutdown cleanly.

package jetty.jsr356;

import java.net.URI;
import java.util.concurrent.CountDownLatch;

import javax.websocket.ClientEndpoint;
import javax.websocket.CloseReason;
import javax.websocket.ContainerProvider;
import javax.websocket.OnClose;
import javax.websocket.WebSocketContainer;

@ClientEndpoint
public class TestClientA
{
    private CountDownLatch closeLatch = new CountDownLatch(1);

    @OnClose
    public void onClose(CloseReason close)
    {
        closeLatch.countDown();
    }

    public void waitForClose() throws InterruptedException
    {
        closeLatch.await();
    }

    public static void main(String[] args)
    {
        try
        {
            WebSocketContainer ws =
ContainerProvider.getWebSocketContainer();

            TestClientA socket = new TestClientA();
            ws.connectToServer(socket,new URI("ws://wuhu.wuhu"));
            socket.waitForClose();
        }
        catch (Throwable t)
        {
            t.printStackTrace();
        }
        finally
        {
            System.exit(0);
        }
    }
}


2) or use the Jetty specific lifecycle to shutdown the container.


package jetty.jsr356;

import java.net.URI;
import java.util.concurrent.CountDownLatch;

import javax.websocket.ClientEndpoint;
import javax.websocket.CloseReason;
import javax.websocket.ContainerProvider;
import javax.websocket.OnClose;
import javax.websocket.WebSocketContainer;

import org.eclipse.jetty.util.component.LifeCycle;

@ClientEndpoint
public class TestClientB
{
    private CountDownLatch closeLatch = new CountDownLatch(1);

    @OnClose
    public void onClose(CloseReason close)
    {
        closeLatch.countDown();
    }

    public void waitForClose() throws InterruptedException
    {
        closeLatch.await();
    }

    public static void main(String[] args)
    {
        try
        {
            WebSocketContainer ws =
ContainerProvider.getWebSocketContainer();

            try
            {
                TestClientB socket = new TestClientB();
                ws.connectToServer(socket,new URI("ws://wuhu.wuhu"));
                socket.waitForClose();
            }
            finally
            {
                if (ws instanceof LifeCycle)
                {
                    ((LifeCycle)ws).stop();
                }
            }
        }
        catch (Throwable t)
        {
            t.printStackTrace();
        }
    }
}



--
Joakim Erdfelt <[email protected]>
webtide.com <http://www.webtide.com/> - intalio.com/jetty
Expert advice, services and support from from the Jetty & CometD experts
eclipse.org/jetty - cometd.org


On Mon, Jan 6, 2014 at 9:37 AM, Kasper Nielsen <[email protected]> wrote:

> just following up on an old thread.
>
> Would it be possible to at least mark all jetty threads as daemon threads?
>
>
> A simple test like this is stuck forever. Because all the jetty threads
> are non daemon threads
>
> @ClientEndpoint
>
> *public* *class* Test {
>
>     *public* *static* *void* main(String[] args) *throws* Exception {
>
>         WebSocketContainer ws = ContainerProvider.*getWebSocketContainer*
> ();
>
>         ws.connectToServer(*new* Test(), *new* URI("ws://wuhu.wuhu"));
>
>     }
>
> }
>
>
> Cheers
>   Kasper
>
>
>
>
>
>
> On Mon, Sep 9, 2013 at 6:25 PM, Joakim Erdfelt <[email protected]> wrote:
>
>> The JSR-356 websocket containers do not have a lifecycle.
>> It is expected that you request only 1 WebSocketContainer and use it for
>> the life of your JVM.
>>
>> Avoid using ContainerProvider.getWebSocketContainer() multiple times.
>>
>> Note, if all you are wanting is a container suitable for instantiating
>> outgoing connections from a web application, then you can access the
>> ServerContainer from
>> ServerContainer container = (ServerContainer)
>> HttpServletRequest.getAttribute("javax.websocket.server.ServerContainer");
>>
>> There is only ever 1 of those (per web application)
>> From there you can use the container.connectToServer() calls like before.
>>
>>
>> --
>> Joakim Erdfelt <[email protected]>
>> webtide.com <http://www.webtide.com/> - intalio.com/jetty
>> Expert advice, services and support from from the Jetty & CometD experts
>> eclipse.org/jetty - cometd.org
>>
>>
>> On Mon, Sep 9, 2013 at 7:18 AM, Kasper Nielsen <[email protected]>wrote:
>>
>>> Hi,
>>>
>>> I'm trying to port an existing Jetty 9.0 websocket implementation to
>>> javax.websocket.
>>>
>>> I'm creating a WebSocketContainer using
>>>   WebSocketContainer container = ContainerProvider.
>>> *getWebSocketContainer*();
>>> which will pick up an instance of ClientContainer/ServerContainer.
>>>
>>> What is the preferred way to shut down the container again seeing that
>>> WebSocketContainer does not have lifecycle methods?
>>>
>>> ((org.eclipse.jetty.util.component.ContainerLifeCycle) container
>>> ).stop();
>>> works but depends on the Jetty implementation.
>>>
>>> Cheers
>>>   Kasper
>>>
>>> _______________________________________________
>>> jetty-users mailing list
>>> [email protected]
>>> https://dev.eclipse.org/mailman/listinfo/jetty-users
>>>
>>>
>>
>> _______________________________________________
>> jetty-users mailing list
>> [email protected]
>> https://dev.eclipse.org/mailman/listinfo/jetty-users
>>
>>
>
> _______________________________________________
> jetty-users mailing list
> [email protected]
> https://dev.eclipse.org/mailman/listinfo/jetty-users
>
>
_______________________________________________
jetty-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/jetty-users

Reply via email to