2014-12-09 3 views
1

У меня есть актер, который получает сообщение и загружает файл по httpclient.
Пример кода:Httpclient deadlock in Akka Актер

@Override 
public void onReceive(Object message) throws Exception { 
    HttpClient client = new DefaultHttpClient(); 
    ... 
    httpGet.releaseConnection() 
    ... 
} 

Проблемы возникают через несколько дней.
Из журнала он показывает блок-блок по запросу httpclient.
Блок в порядке, но, похоже, в тупике httpclient, актер не обрабатывает никаких сообщений дальше.
Как это происходит?

журнала:

Sending message to DownloadActor 
...DownloadActor Receive message 
BasicClientConnectionManager:159 - Get connection for route 
... 

BasicClientConnectionManager:201 - Releasing connection 
Sending message to DownloadActor 
...DownloadActor Receive message 
BasicClientConnectionManager:159 - Get connection for route 

Sending message to DownloadActor 
Sending message to DownloadActor 
Sending message to DownloadActor 
Sending message to DownloadActor 
Sending message to DownloadActor 

нить свалка:

"grabSystem-akka.actor.default-dispatcher-67" prio=10 tid=0x00007fa4d4004800 nid=0x2ad8 waiting on condition [0x00007fa5671a7000] 
    java.lang.Thread.State: WAITING (parking) 
     at sun.misc.Unsafe.park(Native Method) 
     - parking to wait for <0x0000000411a2a010> (a akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinPool) 
     at scala.concurrent.forkjoin.ForkJoinPool.scan(ForkJoinPool.java:2075) 
     at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 
     at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 

"grabSystem-akka.actor.default-dispatcher-66" prio=10 tid=0x00007fa4b4001000 nid=0x5ea runnable [0x00007fa5679ae000] 
    java.lang.Thread.State: RUNNABLE 
     at java.net.SocketInputStream.socketRead0(Native Method) 
     at java.net.SocketInputStream.read(SocketInputStream.java:152) 
     at java.net.SocketInputStream.read(SocketInputStream.java:122) 
     at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:204) 
     at org.apache.http.impl.conn.LoggingSessionInputBuffer.read(LoggingSessionInputBuffer.java:82) 
     at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:177) 
     at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:138) 
     at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283) 
     at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325) 
     at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177) 
     - locked <0x0000000412038e10> (a java.io.InputStreamReader) 
     at java.io.InputStreamReader.read(InputStreamReader.java:184) 
     at java.io.Reader.read(Reader.java:140) 
     at org.apache.http.util.EntityUtils.toString(EntityUtils.java:233) 
     at org.apache.http.util.EntityUtils.toString(EntityUtils.java:273) 
     at com.baidu.grab.core.DownloadActor.onReceive(DownloadActor.java:102) 
     at akka.actor.UntypedActor$$anonfun$receive$1.applyOrElse(UntypedActor.scala:167) 
     at akka.actor.Actor$class.aroundReceive(Actor.scala:465) 
     at akka.actor.UntypedActor.aroundReceive(UntypedActor.scala:97) 
     at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516) 
     at akka.actor.ActorCell.invoke(ActorCell.scala:487) 
     at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238) 
     at akka.dispatch.Mailbox.run(Mailbox.scala:220) 
     at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393) 
     at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 
     at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) 
     at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 
     at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 
+0

Можете ли вы отобразить журналы? – LMeyer

+0

@LMeyer как лог-шоу, соединение не установлено – edwardsbean

+1

Видеть остальную часть кода поможет. Кроме того, поскольку это HTTP, я ожидаю, что ваш актер окажется на приставном диспетчере. Вы проверили с помощью инструментов, таких как VisualVM, чтобы узнать, где именно замораживается нить? – LMeyer

ответ

0

Если я правильно понял ваш вопрос, это может помочь объяснить, что происходит. Актер обрабатывает сообщения из своего почтового ящика поочередно. Он блокирует HttpClient, тогда актер не завершит обработку этого сообщения и не обработает никакое другое сообщение до тех пор, пока блок не будет очищен и обработка сообщений не будет завершена.

Если вы хотите, чтобы актер не блокировался, затем заверните вызов активности HttpClient в будущем или отправьте работу в пул участников, чтобы справиться с ситуацией, пока вы продолжаете обрабатывать.

Смежные вопросы