【发布时间】:2020-04-28 03:24:41
【问题描述】:
在 Spring Boot 服务类中,假设我正在调用 processEvent() 的方法。processEvent() 方法可能正在做 N 件事情,包括对其他服务进行 REST 调用。
如何并行检查该方法所花费的时间,如果它超过阈值,则执行其他操作,例如抛出异常?
class EventService {
public void processEvent(ServiceContext context, Event event) {
// Field a time checker here for the below method.
processEvent(event);
}
public void processEvent(Event event) {
// this method does many things.
}
}
这可以使用CompletionService 来实现吗?如果有,请举个例子!
编辑:
以下代码有效,但我有一个查询:
public void processEvent(ServiceContext context, Event event) {
LOGGER.debug("Timestamp before submitting task = {}", System.currentTimeMillis());
Future<EventResponse> future = executor.submit(() -> {
LOGGER.debug("Timestamp before invoking = {}", System.currentTimeMillis());
EventResponse eventResponse = processEvent(event);
LOGGER.debug("Timestamp after invoking = {}", System.currentTimeMillis());
return eventResponse;
});
try {
LOGGER.debug("Thread sleep starts at = {}", System.currentTimeMillis());
Thread.sleep(5000);
LOGGER.debug("Thread sleep ended at = {}", System.currentTimeMillis());
} catch (InterruptedException e) {
LOGGER.debug("Going to print stack trace....");
e.printStackTrace();
}
if (!future.isDone()) {
future.cancel(true);
LOGGER.debug("task executor cancelled at = {}", System.currentTimeMillis());
} else {
EventResponse response = future.get();
LOGGER.debug("Received Event ID = {}", response.getEventDetailsList().get(0).getEventID());
return response;
}
LOGGER.debug("Going to return error response at = {}", System.currentTimeMillis());
throw new Exception("Message");
}
我收到以下日志:
提交任务前的时间戳 = 1579005638324
线程睡眠开始于 = 1579005638326
调用前的时间戳 = 1579005638326
线程睡眠结束于 = 1579005638526
任务执行者在 = 1579005638527 取消
将在 = 1579005638527 处返回错误响应
调用后的时间戳 = 1579005645228
“task executor cancelled at”之后如何记录“Timestamp after invoking”?
【问题讨论】:
标签: java multithreading spring-boot