1

我在java中有一个调用webservice的方法。现在,如果网络服务花费超过 1 秒。的时间。我应该能够终止该方法并继续程序流程。

4

5 回答 5

3

谷歌番石榴的SimpleTimeLimiter会做你需要的,特别是它的callWithTimeout()方法。

于 2012-05-14T09:41:30.010 回答
1

我建议您使用 Executors 框架并调用Future.get(long, TimeUnit). 至于杀死那个电话,你可以打电话Future.cancel(true)。当然,您必须submit包含Callable调用。

于 2012-05-14T10:15:58.903 回答
1

如果您不想添加新库,您可以通过将 Web 服务调用委托给另一个线程来轻松完成此操作,并使用 1 秒的超时时间加入它。下面是一个完成这些任务的完整程序。有2个关键点:

  1. 使用异步线程进行调用并使用 TimeOut 加入它。您还可以将其设置为守护程序。
  2. 当操作中的值不需要被消耗时,传递给异步线程,这样它就不会进行不必要的分配。

代码:

public class Main {

String returnVar;
private static final long TIME_OUT=1000;//in mills
private void makeCall() {
    WebServiceStubDummy ws = new WebServiceStubDummy();
    Boolean timeElapsed = false;
    Thread t = new Thread(new AsyncWSCall(ws,timeElapsed));
    t.start();
    try {
        t.join(TIME_OUT);
    } catch (InterruptedException e) {}
    synchronized (ws) {
        timeElapsed=true;
    }
    System.out.println(returnVar);
}

private class AsyncWSCall implements Runnable{
    WebServiceStubDummy ws;
    Boolean timeElapsed;

    public AsyncWSCall(WebServiceStubDummy ws,  Boolean timeElapsed){
        this.ws=ws;
        this.timeElapsed=timeElapsed;
    }

    @Override
    public void run() {
        String myStr = ws.dummyMethod();
        //synchronize for shared variable timeElapsed
        synchronized (ws) {
            if(!timeElapsed){
                //if time elapsed don't assign
                returnVar=myStr;
            }
        }
    }       
}

class WebServiceStubDummy{
    public String dummyMethod(){
        try {
            //Dummy Call: if changed to 2000 value will not be consumed
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "From Dummy Metho";
    }
}


/**
 * @param args
 */
public static void main(String[] args) {
    Main m=new Main();
    m.makeCall();
}}

您还可以根据您希望如何传递 WebService 对象以及您希望如何分配 WS 操作的结果来微调您的代码

于 2012-05-14T14:49:31.147 回答
0

SO-thread“在java中的某个指定时间限制后杀死线程”可能会有所帮助。它利用ExecutorService

也可以使用Java 中方法执行的时间限制。请记住,虽然 Thread.stop 已被弃用:

为什么不推荐使用 Thread.stop?

因为它本质上是不安全的。停止线程会导致它解锁所有已锁定的监视器。(当 ThreadDeath 异常向上传播堆栈时,监视器被解锁。)如果以前受这些监视器保护的任何对象处于不一致状态,则其他线程现在可能会查看这些处于不一致状态的对象。据说这些物体已损坏。当线程对损坏的对象进行操作时,可能会导致任意行为。这种行为可能很微妙且难以检测,也可能很明显。与其他未经检查的异常不同,ThreadDeath 以静默方式杀死线程;因此,用户没有警告他的程序可能已损坏。损坏可以在实际损坏发生后的任何时间出现,甚至在未来几小时或几天内。

来源:Java Thread Primitive Deprecation

于 2012-05-14T09:38:24.103 回答
0

使用 1 秒的超时。根据您的网络服务请求。

于 2012-05-14T09:30:08.867 回答