2017-05-24 94 views
0

我正在嘗試使用akka http生成PUT請求,其中的休息服務終點按照預期的方式使用curl完成,但是當通過創建Http生成時顯示超時錯誤連接。Akka-Http:連接超時過期

import akka.actor.ActorSystem 
import akka.http.scaladsl.Http 
import akka.http.scaladsl.model._ 
import akka.stream.ActorMaterializer 
import de.heikoseeberger.akkahttpcirce.CirceSupport 
import io.circe.Json 
import org.joda.time.DateTime 

case class JobDetails (jobName: String, appId: Option[String]=None, status: Option[String]=None,runningSince:Option[Long]=None) 

trait UpdateJobStatus extends CirceSupport with Config { 


    def UpdateJobDetails(jobDetails :JobDetails) { 


    implicit val actorSystem = ActorSystem("update") 
    implicit val materializer: ActorMaterializer = ActorMaterializer() 

    val DetailsList = List(
     ("jobName",Json.fromString(jobDetails.jobName)), 
     ("appId",Json.fromString(jobDetails.appId.get)), 
     ("status",Json.fromString(jobDetails.status.get)), 
     ("runningSince",Json.fromLong(DateTime.now.getMillis))) 

    val jobDetailJson:Json = Json.fromFields(DetailsList) 


    val endpoint =Uri.from(scheme = "http",host = httpHost,port = 9000,path = "/updateJobDetails/TestJob") 

    val updateRequest = HttpRequest(
     HttpMethods.PUT, 
     uri = endpoint, 
     entity = HttpEntity(MediaTypes.`application/json`, jobDetailJson.toString())) 

    Http().singleRequest(updateRequest) 


    } 
} 

object Test extends App with UpdateJobStatus{ 

    val test = JobDetails("TestJob",Some("1234"),Some("Killed"),Some(21)) 
UpdateJobDetails(test) 

} 

錯誤:

DEBUG] [05/25/2017 01:20:02.934] [main] [EventStream(akka://UpdateService)] logger log1-Logging$DefaultLogger started 
[DEBUG] [05/25/2017 01:20:02.935] [main] [EventStream(akka://UpdateService)] Default Loggers started 
[DEBUG] [05/25/2017 01:20:03.122] [main] [AkkaSSLConfig(akka://UpdateService)] Initializing AkkaSSLConfig extension... 
[DEBUG] [05/25/2017 01:20:03.124] [main] [AkkaSSLConfig(akka://UpdateService)] buildHostnameVerifier: created hostname verifier: [email protected] 
[DEBUG] [05/25/2017 01:20:04.098] [UpdateService-akka.actor.default-dispatcher-4] [akka://UpdateService/user/pool-master/PoolInterfaceActor-0] (Re-)starting host connection pool to 0.0.0.0:9000 
[DEBUG] [05/25/2017 01:20:04.315] [UpdateService-akka.actor.default-dispatcher-4] [akka://UpdateService/system/IO-TCP/selectors/$a/0] Resolving 0.0.0.0 before connecting 
[DEBUG] [05/25/2017 01:20:04.333] [UpdateService-akka.actor.default-dispatcher-5] [akka://UpdateService/system/IO-DNS] Resolution request for 0.0.0.0 from Actor[akka://UpdateService/system/IO-TCP/selectors/$a/0#-1469947037] 
[DEBUG] [05/25/2017 01:20:04.341] [UpdateService-akka.actor.default-dispatcher-5] [akka://UpdateService/system/IO-TCP/selectors/$a/0] Attempting connection to [/0.0.0.0:9000] 
[DEBUG] [05/25/2017 01:20:14.359] [UpdateService-akka.actor.default-dispatcher-3] [akka://UpdateService/system/IO-TCP/selectors/$a/0] Connect timeout expired, could not establish connection to [0.0.0.0:9000] 

雖然

curl -v -H "Content-Type: application/json" \ 
-X PUT http://0.0.0.0:9000/updateJobDetails/TestJob \ 
-d '{"jobName":"TestJob","appId":"1234","status":"Killed","runningSince":1}' 

工作

+1

你可能想嘗試連接到本地主機,而不是0.0.0.0 –

+0

@Stefano試圖使用'localhost'而不是0.0.0.0,它的工作方式像魅力,我不知道爲什麼,你能解釋原因嗎? – Freeman

回答

0

您所創建的請求,這導致Future[HttpResponse]

我認爲你應該處理Future完成,直接或通過管道結果給演員,然後將收到類型爲HttpResponse的消息。

可以找到一個例子here

如果這仍然給你超時,我會建議使用Wireshark,網絡流量監視器進行更深入的觀察。

+0

嘗試'未來的[HttpResponse]',不幫 – Freeman

+0

文檔清楚地說: *「請確保消耗響應實體dataBytes:Source [ByteString,Unit]通過例如連接到一個接收器(例如response.discardEntityBytes )如果你不關心響應實體),否則Akka HTTP(以及底層的Streams基礎結構)將理解實體消耗作爲背壓信號的缺乏並停止從底層TCP連接讀取!「* 確保使用響應實體,否則它將掛起。這似乎是問題所在。 – arboreal84