0

我正在尝试做这件事,但不知道怎么做?代码请求网络服务发送短信计费信息;计费成功或失败时记录网络服务的响应。有时需要很长时间才能获得响应,我想取消/暂停该过程并使用新号码重新发送请求。

long before = System.currentTimeMillis();
String resp = new SmsConnection().doResponseRequest(sms);
long totalResponseTime=((System.currentTimeMillis() - before )/1000);

我只能记录totalResponseTime,有时需要 50-100 秒才能得到服务的响应。有什么办法可以说

“如果resp花费超过 15 秒,请取消/暂停此请求并同时重新发送另一个请求。收到响应后,我们将处理该请求。”

我需要类似 TimeOut 选项的东西来接收响应。请建议。

谢谢,

4

3 回答 3

0

这是我的问题的简单解决方案!感谢 Eugene 和 Dmitry 提供提示和建议!我创建了一个接收响应的方法,然后在 synchronized(this) {} 块中调用了这个方法!!

 public String getResponse(final StsSmsSubmit sms) throws InterruptedException, ExecutionException
    {
        String response="";
       Callable<String> responsecode=new Callable<String>() {


        @Override
        public String call() throws Exception {

           final String resp = new StsSmsConnection().doRequest(sms);
           return resp;
        }
    };
       ExecutorService service=Executors.newSingleThreadExecutor();
         Future task=service.submit(responsecode);
         try{
         response=(String) task.get(30, TimeUnit.SECONDS);
    }
    catch(TimeoutException tE)
    {
       System.out.println("TimeOutException Occurred  "+tE.getMessage()+"at "+ new Date());
       log.fatal("TimeOut Exception is catched. at "+ new Date());
       response="TimeOut";
    }
         service.shutdown();


       return response;

    }
于 2013-04-30T15:23:34.500 回答
0

您可以通过提取到Callable来使用ExecutorService你可以在这里看到一个例子。new SmsConnection().doResponseRequest(sms);

于 2013-04-29T10:52:48.673 回答
0

使用可调用:

Future<String> futureResponse = service.submit(new YourCallable); //service is the ExecutorService that you use
//this will block for 15 seconds here
String result = futureResponse.get(15, TimeUnit.SECONDS); //this needs to wrapped in a try catch with TimeoutException
if(result == null){
    //You did not get the result in 15 seconds
    futureResponse.cancel(true);//kill this task

    //schedule a new task
    service.submit(new YouCallable());

}
于 2013-04-29T11:09:13.767 回答