grailsでexecutorプラグインを使用しようとしていますが、解決できない問題が発生しています。基本的に、クロールしたいリンクのリストがあり、常に同じリンクをクロールするという問題が発生したため、例を次のように簡略化しました。
List offerLinks = getOfferLinks(parser)
offerLinks.each{println it}
List futures = new Vector()
for (def link : offerLinks) {
def future = callAsync {
return link
}
futures.add(future)
}
futures.each{println "FUTURE " + it.get()}
これがコンソールに印刷されるものです
bt-ofrd-acciona-6633344.htm?
bt-ofrd-celiasiffredi-293068.htm?
bt-ofrd-clahubiz-92924.htm?
bt-ofrd-haruko-1672632.htm?
将来のbt-ofrd-clahubiz-92924.htm?
将来のbt-ofrd-haruko-1672632.htm?
将来のbt-ofrd-haruko-1672632.htm?
将来のbt-ofrd-haruko-1672632.htm?
最初の4つの結果はofferLinks.each{println it}
コード用です
最後の4つはfutures.each{println "FUTURE " + it.get()}
私が見つけようとしているのは、これらのリンクをcallAsyncブロックに入れて、将来のオブジェクトから取得すると、最後の値を取得する理由です。すでに作成されている将来のオブジェクトを置き換えるように見えますか?
このコードは、コントローラーによって呼び出されるサービス内にあります。私はあなたが私に与えることができるどんな助けにも感謝します。ありがとう
更新:
Java executor APIに何らかの問題があると思います...または、それが実際にどのように機能するかを完全に理解していない可能性がありますか?
これは、invokeAllを使用するようにコードを変更する別のテストです。
def threadPool = Executors.newCachedThreadPool()
List offerLinks = getOfferLinks(parser)
List lista = new ArrayList()
for (enlace in offerLinks) {
println "link " + enlace
lista.add({enlace} as Callable)
}
def futures = threadPool.invokeAll(lista)
futures.each{println "FUTURE " + it.get()}
これは、印刷された
リンク/bt-ofrd-implementar-192996.htmを取得するものですか?
リンク/bt-ofrd-cdonini-864908.htm?
リンク/bt-ofrd-hvtalent-1493932.htm?
リンク/bt-ofrd-dbak-1358120.htm?
リンク/bt-ofrd-hexacta-100072.htm?
リンク/bt-ofrd-ccibelli-457472.htm?
将来/bt-ofrd-ccibelli-457472.htm?
将来/bt-ofrd-ccibelli-457472.htm?
将来/bt-ofrd-ccibelli-457472.htm?
将来/bt-ofrd-ccibelli-457472.htm?
将来/bt-ofrd-ccibelli-457472.htm?
将来/bt-ofrd-ccibelli-457472.htm?