我有一个为大量交易提供服务的系统。 超时策略仅适用于事务的一部分。
此处的完整交易包括一些执行工作流程,预处理,远程调用,后处理等。
例如,
//一些代码
// START TIMER
试 {
CallInput remoteInput = fInputProcessor.transform(callContext);
CallOutput remoteOutput = fRemoteInvoker.invoke(remoteInput);
TransactionOutput输出= fOutputProcessor.transform(remoteOutput);
}
catch(TimeoutException ex) {
}
//一些代码
假设超时为500毫秒。它可能在输入处理,远程调用或输出处理期间发生。
你能列出一些在500ms后产生超时的方法吗?假设我无法将3个块拆分为新线程。
答案 0 :(得分:1)
您可以使用Guava并使用以下代码:
TimeLimiter limiter = new SimpleTimeLimiter();
limiter.callWithTimeout(new Callable<Void>() {
public Void call() {
CallInput remoteInput = fInputProcessor.transform(callContext);
CallOutput remoteOutput = fRemoteInvoker.invoke(remoteInput);
TransactionOutput output = fOutputProcessor.transform(remoteOutput);
}
}, 500, TimeUnit.MILISECONDS, false);
答案 1 :(得分:1)
考虑使用java.util.concurrent.Future.get(long, TimeUnit)
。
Runnable yourTask = <wrap your work code in a Runnable>;
Future future = threadpool.submit(yourTask);
try {
Object result = future.get(10, TimeUnit.SECONDS);
} catch (Exception e) {
<handle exception, e.g. TimeoutException>
} finally {
<your closing code>
}
以下是创建/销毁线程池的示例:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
private ExecutorService threadpool;
public void start() {
threadpool = Executors.newCachedThreadPool();
}
public void stop() throws InterruptedException {
threadpool.shutdown();
if (false == threadpool.awaitTermination(1, TimeUnit.SECONDS))
threadpool.shutdownNow();
}
答案 2 :(得分:0)
DelayQueues(http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/DelayQueue.html)也很有用。您可以向实现Delayed接口的队列添加元素,该接口用于定义Delayed对象的到期时间。然后,您可以轮询队列中已过期的元素并使用它们执行某些操作
while (!Thread.currentThread().isInterrupted()) {
doSomethingWithExpiredObj();
}