2013-02-05 18 views
5

Tôi đang viết chương trình kết thúc máy chủ bằng Twitter Finagle. Tôi không sử dụng toàn bộ ngăn xếp máy chủ Twitter, chỉ là phần cho phép xử lý không đồng bộ (vì vậy Tương lai, Chức năng, v.v.). Tôi muốn các đối tượng trong tương lai để có timeout, vì vậy tôi đã viết này:Twitter Thời gian chờ trong tương lai không áp dụng cho toàn bộ chuỗi flatMap

Future<String> future = Future.value(some_input).flatMap(time_consuming_function1); 
future.get(Duration.apply(5, TimeUnit.SECONDS)); 

time_consuming_function1 chạy lâu hơn 5 giây. Nhưng future không hết thời gian chờ sau 5 giây và chờ đến khi time_consuming_function1 kết thúc.

Tôi nghĩ rằng điều này là do future.get(timeout) chỉ quan tâm đến khoảng thời gian mà future đã tạo để tạo chứ không phải toàn bộ chuỗi hoạt động. Có cách nào để hết thời gian cho toàn bộ chuỗi hoạt động không?

+0

Cảm ơn sschaef đã chỉnh sửa – stackoverflower

+0

Câu trả lời của tôi có đủ không? –

Trả lời

1

Về cơ bản nếu bạn gọi bản đồ/sơ đồ phẳng trên một tương lai hài lòng, mã sẽ được thực thi ngay lập tức.

Trong ví dụ của bạn, bạn thỏa mãn tương lai của mình ngay lập tức khi bạn gọi Future.value(some_input), vì vậy flatMap sẽ thực thi mã ngay lập tức và cuộc gọi đến get không cần phải đợi bất kỳ thứ gì. Ngoài ra, mọi thứ đang diễn ra trong một chuỗi. Cách sử dụng phù hợp hơn sẽ như sau:

import scala.concurrent.ops._ 
import com.twitter.conversions.time._ 
import com.twitter.util.{Future,Promise} 

val p = new Promise[String] 
val longOp = (s: String) => { 
    val p = new Promise[String] 
    spawn { Thread.sleep(5000); p.setValue("Received: " + s) } 
    p 
} 
val both = p flatMap longOp 
both.get(1 second) // p is not complete, so longOp hasn't been called yet, so this will fail 
p.setValue("test") // we set p, but we have to wait for longOp to complete 
both.get(1 second) // this fails because longOp isn't done 
both.get(5 seconds) // this will succeed 
Các vấn đề liên quan