为了账号安全,请及时绑定邮箱和手机立即绑定

如果 API 调用支付处理器超过 60 秒,则中断

如果 API 调用支付处理器超过 60 秒,则中断

神不在的星期二 2022-09-28 10:18: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    }有一些问题,例如,该方法具有 void 返回值,错误与 从内部类访问。有没有更优雅的方法来做到这一点?run()overThreshold
查看完整描述

1 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

执行器服务使用 Future.get(超时)应该可以相当干净地处理这个问题。

例如:


    ExecutorService executor = Executors.newCachedThreadPool();


    // ... set up builder as before ...

    Future<Response> responseFuture = executor.submit(

            () -> builder.post(Entity.json(new Gson().toJson(request))));

    try {

        Response response = responseFuture.get(timeout, TimeUnit.SECONDS);

        // return normal response here

    } catch (TimeoutException ex) {

        executor.submit( () -> {

            Response lateResponse = responseFuture.get();

            // send overThreshold alert email here

            // Dummy return - prefer Callable to Runnable here for exception handling

            return null;

        } );

        // return a message to user here saying their payment could not be processed

    }

可以选择适合,也可以同样是应用程序中其他位置的共享线程池。ExecutorService


查看完整回答
反对 回复 2022-09-28
  • 1 回答
  • 0 关注
  • 68 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信