【发布时间】:2019-04-09 17:59:48
【问题描述】:
我正在与支付处理器集成,并试图处理以下情况:
- 用户点击支付并向我们的服务器发出请求
- 我们的服务器向支付处理器发出请求
- 付款处理方出现明显延迟
- 在某个阈值之后,例如60 秒后,我们会提醒用户付款失败
- 70 秒后,支付处理器返回成功响应。
所以我需要从 UI 的 HTTP 调用中启动对支付处理器的 API 调用,然后如果需要超过 60 秒,则结束 HTTP 调用并向用户返回错误,然后如果 API 调用支付处理器最终成功(比如 70 秒后),向管理团队发送电子邮件。
我在想这样的事情:
import javax.ws.rs.client.*;
import java.util.Timer;
import java.util.TimerTask;
...
boolean overThreshold = false;
int timeout = 60; // seconds
TimerTask task = new TimerTask() {
@Override
public void run() {
overThreshold = true;
// return a message to user here saying their payment could not be processed
}
};
new Timer(true).schedule(task, timeout * 1000);
Client client = ClientBuilder.newClient();
WebTarget webTarget
= client.target({url of payment processor});
Invocation.Builder builder = webTarget.request()
.header(HttpHeaders.CONTENT_TYPE, APPLICATION_JSON);
final Response response = builder.post(Entity.json(new Gson().toJson(request)));
if (overThreshold) {
// send alert email here
}
有一些问题,例如run() 方法的返回值是 void,从内部类访问 overThreshold 时出错。有没有更优雅的方式来做到这一点?
【问题讨论】:
-
IMO,它是作为响应式服务实现的经典用例。您可能对类似于 blog.payara.fish/… 的内容感兴趣
标签: java multithreading jersey thread-safety