最近遇到了這個需求,並沒有發現任何有用的谷歌搜索。以下僅供查詢,但可以擴展。我假設你想留在SolrJ類。 SolrQuery和QueryResponse很容易處理。
所以要查詢。您將需要像平常一樣構建SolrQuery。爲「wt」提供「javabin」。這會給你一個SolrJ內部使用的壓縮二進制格式的響應。
val sq = new SolrQuery()
sq.set("wt", "javabin")
...
您會想要將您的SolrQuery轉換爲WS理解的內容。 (我還沒有添加所有的進口,因爲大多數是直接找出[例如,你的IDE。這些我已經包括可能不那麼明顯了。)
import scala.collection.JavaConverters._
def solrQueryToForm(sq: SolrQuery): Map[String, Seq[String]] = {
sq.getParameterNames.asScala.foldLeft(Map.empty[String, Seq[String]]) {
case (m, n) =>
m + (n -> sq.getParams(n))
}
}
在我的店裏,我們使用默認集合和處理器(即「/選擇」),但你會想那些由SolrQuery
def solrEndpoint(sq: SolrQuery): String = {
val coll = sq.get("collection", defaultCollection)
val hand = Option(sq.getRequestHandler).getOrElse(defaultHandler)
formSolrEndpoint(solrUrl, coll, hand)
}
def formSolrEndpoint(base: String, collection: String, handler: String): String = {
val sb = new StringBuilder(base)
if (sb.last != '/') sb.append('/')
sb.append(collection)
if (!handler.startsWith("/")) sb.append('/')
sb.append(handler)
sb.result()
}
你需要一些代碼到WSResponse映射到QueryResponse
import com.ning.http.client.{Response => ACHResponse}
def wsResponseToQueryResponse(wsResponse: WSResponse)(implicit ctx: ExecutionContext): QueryResponse = {
val jbcUnmarshal = {
val rbis = wsResponse.underlying[ACHResponse].getResponseBodyAsStream
try {
new JavaBinCodec().unmarshal(rbis)
}
finally {
if (rbis != null)
rbis.close()
}
}
// p1: SolrJ pulls the same cast
// p2: We didn't use a SolrServer to chat with Solr so cannot provide it to QueryResponse
new QueryResponse(jbcUnmarshal.asInstanceOf[NamedList[Object]], null)
}
而且覆蓋那個giv您可以使用Play的異步WS服務調用Solr。
def query(sq: SolrQuery)(implicit ctx: ExecutionContext): Future[QueryResponse] = {
val sqstar = sq.getCopy
sqstar.set("wt", "javabin")
WS.url(solrEndpoint(sqstar))
.post(solrQueryToForm(sqstar))
.map(wsResponseToQueryResponse)
}
由於現在遊戲發佈web服務的代碼作爲一個獨立的罐子,這意味着幾乎所有的項目應該能夠查詢Solr的異步。希望這很有用。
你可以考慮使用Dispatch或Spray,因爲它們都是在Netty之上構建的,並且在發出http請求時完全是NIO。 – cmbaxter
謝謝,但是爲什麼Dispatch或Spray會比Web服務庫'WS'更好? – Sonson123
我不確定ws api正在做什麼。即使它返回未來,我也不確定在進行http調用時它是否仍在阻止io。我會研究這一點,如果它的尼奧如果你已經在使用遊戲,那麼這可能是一個不錯的選擇。如果沒有,那麼你可以看看我提到的庫。 – cmbaxter