猿问

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

我正在与支付处理器集成,并试图处理以下情况:

  • 用户点击付费并向我们的服务器发出请求

  • 我们的服务器向支付处理器发出请求

  • 支付处理器端存在显著延迟

  • 在达到某个阈值(例如 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


神不在的星期二
浏览 140回答 1
1回答

江户川乱折腾

从执行器服务使用&nbsp;Future.get(超时)应该可以相当干净地处理这个问题。例如:&nbsp; &nbsp; ExecutorService executor = Executors.newCachedThreadPool();&nbsp; &nbsp; // ... set up builder as before ...&nbsp; &nbsp; Future<Response> responseFuture = executor.submit(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; () -> builder.post(Entity.json(new Gson().toJson(request))));&nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; Response response = responseFuture.get(timeout, TimeUnit.SECONDS);&nbsp; &nbsp; &nbsp; &nbsp; // return normal response here&nbsp; &nbsp; } catch (TimeoutException ex) {&nbsp; &nbsp; &nbsp; &nbsp; executor.submit( () -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Response lateResponse = responseFuture.get();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // send overThreshold alert email here&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Dummy return - prefer Callable to Runnable here for exception handling&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return null;&nbsp; &nbsp; &nbsp; &nbsp; } );&nbsp; &nbsp; &nbsp; &nbsp; // return a message to user here saying their payment could not be processed&nbsp; &nbsp; }可以选择适合,也可以同样是应用程序中其他位置的共享线程池。ExecutorService
随时随地看视频慕课网APP

相关分类

Java
我要回答