Вы можете просто использовать map
для преобразования Future
и добавить какой-либо идентификатор (обычно называемый идентификатором корреляции для таких целей) перед тем, как передать его на myActor
:
http.singleRequest(HttpRequest(uri = "http://akka.io"))
.map(x => (1, x)).pipeTo(myActor)
Вам понадобится изменить блоки сопоставления с образцом, чтобы взять набор:
case (id, HttpResponse(StatusCodes.OK, headers, entity, _)) =>
Если вы не можете / не хотите менять блок сопоставления с образцом по какой-то причине, вы можете использовать тот же подход,но вместо этого добавьте уникальный HTTP-заголовок в ваш завершенный запрос (используя copy
) с чем-то вроде этого (не проверяется, если компилируется):
// make a unique header name that you are sure will not be
// received from http response:
val correlationHeader: HttpHeader = ... // mycustomheader
// Basically hack the response to add your header:
http.singleRequest(HttpRequest(uri = "http://akka.io"))
.map(x => x.copy(headers = correlationHeader +: headers)).pipeTo(myActor)
// Now you can check your header to see which response that was:
case HttpResponse(StatusCodes.OK, headers, entity, _) =>
headers.find(_.is("mycustomheader")).map(_.value).getOrElse("NA")
Это скорее хак, по сравнению с предыдущим вариантом, потому что выизменяют ответ.