ResourceClient зависает на LockSupport.park() в SunOS при подключении к Restlet Server

У меня есть очень простой сервер Restlet, который я тестирую с очень простым клиентом Restlet, использующим Restlet-2.1.0 со следующими расширениями: xstream-1.4, jettison-1.3.

На моем Mac все работает хорошо, но при попытке запустить это на SunOS 5.10 клиент зависает при подключении к серверу. Я могу получить ответ при обращении к серверу из браузера или через telnet, а также этот же клиент отлично работает при подключении к любому другому ресурсу, отличному от сервера Restlet.

Глядя на дамп потока, я вижу это:

"main" prio=3 tid=0x08070800 nid=0x2 waiting on condition [0xfe0eb000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0xbbe827e8> (a java.util.concurrent.CountDownLatch$Sync)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:811)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:969)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1281)
        at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:207)
        at org.restlet.engine.connector.ClientConnectionHelper.handle(ClientConnectionHelper.java:517)
        at org.restlet.Client.handle(Client.java:180)
        at org.restlet.Restlet.handle(Restlet.java:284)
        at com.redprairie.task.common.TempClient.main(TempClient.java:17)

Я попытался использовать как ClientResource.get(), так и Client.handle(Request), и оба зависли.

Код сервера:

server = new Server(Protocol.HTTP, SERVER_PORT, TestServerResource.class);
Context ctx = new Context();
server.setContext(ctx);
server.start();

Код клиента:

Request request = new Request(Method.GET, "http://localhost:8188/retrieve");
Client client = new Client(Protocol.HTTP);
Response response = client.handle(request);
response.getEntity().write(System.out);

Ресурс:

public class TestServerResource extends ServerResource {

  private static volatile Customer bernard = Customer.createSample();

  @Get("json")
  public Customer retrieve() {
    System.out.println("GET request received");
    return bernard;
  }
}

Расширения xstream и jettison отлично работают для преобразования java-объектов в JSON и наоборот, и опять же, это отлично работает на моем Mac OS X, но зависает на Sun...

Я новичок в Restlet, поэтому, возможно, я делаю что-то не так, но это простые примеры, взятые из доступной документации.


person user1735826    schedule 11.10.2012    source источник


Ответы (1)


Я думаю, что это может быть связано с этой проблемой: https://github.com/restlet/restlet-framework-java/issues/669#issuecomment-9174819

Однако это не объясняет, почему сервер не отвечает на рестлет, а отвечает другим. У вас есть какие-либо исключения на сервере? У меня аналогичный случай, и я действительно получил это исключение на сервере:

The connection was broken. It was probably closed by the client.

org.eclipse.jetty.io.EofException
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.blockWritable(SelectChannelEndPoint.java:435)
    at org.eclipse.jetty.http.AbstractGenerator.blockForOutput(AbstractGenerator.java:512)
    at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:159)
    at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:101)
    at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
    at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:282)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:135)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:220)
    at java.io.Writer.write(Writer.java:157)
    at org.restlet.representation.StringRepresentation.write(StringRepresentation.java:237)
    at org.restlet.representation.CharacterRepresentation.write(CharacterRepresentation.java:76)
    at org.restlet.engine.adapter.ServerCall.writeResponseBody(ServerCall.java:509)
    at org.restlet.engine.adapter.ServerCall.sendResponse(ServerCall.java:453)
    at org.restlet.ext.jetty.internal.JettyCall.sendResponse(JettyCall.java:312)
    at org.restlet.engine.adapter.ServerAdapter.commit(ServerAdapter.java:196)
    at org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:153)
    at org.restlet.ext.jetty.JettyServerHelper$WrappedServer.handle(JettyServerHelper.java:170)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:452)
    at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:894)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:948)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:943)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:622)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538)
    at java.lang.Thread.run(Thread.java:722)
person avandecreme    schedule 12.10.2012
comment
Спасибо за предложение. Я думаю, что у нас разные ситуации. Я попробовал их решение по установке максимального времени сна и простоя, и это не имело никакого значения. Также я не получаю никаких исключений на сервере. Просто висит... - person user1735826; 13.10.2012