@ विकटर क्लैंग: हम समझते हैं कि j.u.c.Future
एक घृणा है। लेकिन यही वह है जो हम सॉफ्टवेयर के एक टुकड़े से वापस आ रहे हैं जिसे हमें समय के लिए स्वीकार किया जाना चाहिए।
अब तक, यह है कि क्या हम साथ काट दिया गया है:
def wrapJavaFutureInAkkaFuture[T](javaFuture: java.util.concurrent.Future[T], maybeTimeout: Option[Duration] = None)(implicit system: ActorSystem): akka.dispatch.Future[T] = {
val promise = new akka.dispatch.DefaultPromise[T]
pollJavaFutureUntilDoneOrCancelled(javaFuture, promise, maybeTimeout.map(_.fromNow))
promise
}
दूसरे शब्दों में, एक अलग अक्का Promise
(एक Future
के लिखने की ओर) j.u.c.Future
करने के लिए इसी बनाते हैं, तो कॉलबैक की शुरूआत की pollJavaFutureUntilDoneOrCancelled
मतदान से वादा "abomination" अपडेट करते हैं और फोन करने वाले के लिए वादा देता है।
तो हम j.u.c. भविष्य की स्थिति के आधार पर अक्का वादा को अद्यतन करने के लिए "मतदान" कैसे करते हैं?
def pollJavaFutureUntilDoneOrCancelled[T](javaFuture: java.util.concurrent.Future[T], promise: akka.dispatch.Promise[T], maybeDeadline: Option[Deadline] = None)(implicit system: ActorSystem) {
if (maybeDeadline.exists(_.isOverdue)) javaFuture.cancel(true);
if (javaFuture.isDone || javaFuture.isCancelled) {
promise.complete(allCatch either { javaFuture.get })
} else {
Play.maybeApplication.foreach { implicit app =>
system.scheduler.scheduleOnce(50 milliseconds) {
pollJavaFutureUntilDoneOrCancelled(javaFuture, promise, maybeDeadline)
}
}
}
}
यह एक ऐसा प्रयास है जिसे Google समूह चर्चा में संकेत दिया गया था जिसे मैंने प्रश्न में संदर्भित किया था। यह Akka शेड्यूलर का उपयोग यह जांचने के लिए कि प्रत्येक j.u.c.Future या तो किया जाता है या रद्द किया जाता है, उसे हर 50 एमएस वापस कॉल करने के लिए उपयोग करता है। जब भी ऐसा होता है, यह पूरे राज्य के साथ अक्का वादा को अद्यतन करता है।
@Victor Klang, एट अल:
इस सर्वोत्तम प्रक्रिया है? क्या आप ऐसा करने के बेहतर तरीके से जानते हैं? क्या हम यहां एक नकारात्मक पक्ष खो रहे हैं जिसके बारे में हमें पता होना चाहिए?
किसी भी और मदद के लिए धन्यवाद।
स्रोत
2012-07-18 21:17:07
एक स्पष्ट नकारात्मक पक्ष यह है, कि सबसे खराब स्थिति में इस प्रतिक्रिया के एक उच्च देरी का कारण होगा। यदि आपके पास उदाहरण के लिए डिफ़ॉल्ट सेटिंग्स हैं और आपका भविष्य चेक के बाद 1 एमएस पूरा करता है, तो इससे लगभग 100ms की देरी हो सकती है। हालांकि इसे 'शेड्यूलर' सेट करके समायोजित किया जा सकता है।कॉन्फ़िगरेशन में टिक-अवधि 'सेटिंग। – drexin
@ ड्रेक्सिन सच है, लेकिन एक टिक अवधि और मतदान आवृत्ति व्यापार-बंद किसी भी मतदान आधारित समाधान में मौजूद होगा, है ना? –
निश्चित रूप से, लेकिन जैसा कि आपने डाउनसाइड्स के लिए कहा था, मैं बस आपको बताना चाहता था कि यह न केवल 'शेड्यूलऑन' कॉल के देरी परम पर निर्भर करता है, बल्कि अक्का कॉन्फ़िगरेशन में सेटिंग पर भी निर्भर करता है। यदि आप देरी से जी सकते हैं तो यह एक उपयोगी समाधान होना चाहिए। – drexin