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