问答

在Java 1.4中实现超时

 来源    2019-07-03    1  

我不能使用Executor和Future来捕获TimeOutException,因为它是1.4
如果方法未完成,我需要在30秒后超时.

//Caller class
public static void main() {

EJBMethod() // has to timeout after 30 seconds

}

//EJB method in some other class
public void EJBMethod() {

}

我想的一种方法是将此方法调用包装在Runnable中,并在方法结束后从run()设置一些volatile布尔值.然后,在调用者中,我们可以在调用该方法后休眠30秒,一旦醒来,我将检查调用者中的布尔值是否为SET.如果没有设置,那么我们需要停止该线程.

在最简单的情况下,你可以使用Thread一个任意的Runnable.

如果要从调用者的角度进行调用阻塞,可以创建一个运行工作线程的“服务”类,并使用Thread.join(long)等待操作完成或在指定的超时后放弃它(特别注意正确处理InterruptedException所以事情不会搞砸了.

Thread.isAlive()将告诉您线程是否完成.

检索结果是一个单独的问题;我想你可以解决这个问题……

[编辑]

快速和肮脏的例子(不要在生产中使用!):

/**
 * Actually needs some refactoring
 * Also, did not verify for atomicity - should be redesigned
 */
public V theServiceCall(final T param) {
    final MyResultBuffer<V> buffer = new MyResultBuffer<V>();
    Runnable task = new Runnable() {
        public void run() {
            V result = ejb.process(param);
            buffer.putResult(result);
        }
    }
    Thread t = new Thread(task);
    t.setDaemon(true);
    t.start();
    try {
        t.join(TASK_TIMEOUT_MILLIS);
    } catch (InterruptedException e) {
        // Handle it as needed (current thread is probably asked to terminate)
    }
    return (t.isAlive()) ? null : buffer.getResult();
}

注意:您可以在Runnable中实现关闭标志,而不是Thread.setDaemon(),因为它将是一个更好的解决方案.

[/编辑]

相关文章
如何用java解决selenium webdriver中的超时错误?
问答我的Html <form id="load_form" class="ajaxsubmit" method="post" action ...
1
java – 在eclipse中增加服务器超时
问答我想在eclipse中增加服务器时间,但不确定在我的eclipse中如何配置服务器,我无法在任何地方找到超时设置.检查我的项目的屏幕截图. 我试过Windows>显示视图>服务器但没有任何 ...
3
java – 在JTA配置中设置超时
问答JTA事务意外地回滚(可能是由于超时);嵌套异常是 javax.transaction.RollbackException: The transaction was set to rollback o ...
1
java – 在Spring WebFlux webclient中设置超时
问答我正在使用Spring Webflux WebClient从我的Spring启动应用程序进行REST调用.并且每次在30秒内超时. 这是我尝试在Spring webfulx的WebClient中设置套 ...
1
在Java中重试超时连接
问答我有一个方法(下面)下拉并返回网页的源作为字符串.一切正常,花花公子,但是当连接超时时,程序会抛出异常并退出.有没有更好的方法来执行此操作以允许它在超时时再次尝试,或者有没有办法在此方法中执行此操作? ...
jsoup – 线程“main”中的异常java.net.SocketTimeoutException:在java.net.DualStackPlainSocketSmplImpl.waitForConnect(本机方法)中连接超时
问答我正在尝试使用Jsoup连接到一个站点,但我继续得到以下错误,我已经在以下xmls,"setting.xlm"和"pom.xml"中配置了一切.任何人都可以帮我 ...
1
java – 在storm中使用字段分组时,已知字段值或超时是否有限制?
问答我使用Apache Storm进行字段分组,效果很好. 但是如果我有无数个字段值,那就意味着风暴必须在其螺栓中跟踪无限数量的值!否则,某些值将转到错误的螺栓,它将破坏任何缓存技术. 我想在螺栓的某个地 ...
1
java – 如何在Retrofit库中设置超时?
问答我在我的应用程序中使用Retrofit库,我想设置超时60秒. Retrofit有一些方法吗? 我这样设置Retrofit: RestAdapter restAdapter = new RestAda ...
1
Java – 在ExecutorCompletionService中定义Callable的超时
问答我使用ExecutorCompletionService时遇到了以下问题.我想在不同的线程中调用很多Callable.这些Callable不会彼此共享任何信息.我需要为每个Callable定义一个超时 ...
1
如何在Java 1.4中的BufferedReader和PrintWriter上设置超时?
问答如何在BufferedReader和使用套接字连接创建的PrintWriter设置超时?这是我现在对服务器的代码,直到服务器或客户端崩溃: while(isReceiving){ str = null ...
1
java:systemd-notify中的不一致看门狗超时
问答我的java应用程序安装在OpenSUSE 13.2操作系统上,我使用systemd进行进程控制. (systemd版本210) 我想使用systemd-notify来利用systemd看门狗功能.但 ...
1
java.net.SocketTimeoutException:读取SoapUI中的超时时间
问答我正在使用jboss7服务器,当我为其创建客户端时 web-service,然后面临问题,java.net.SocketTimeoutException:读取超时.我还通过增加套接字超时(ms)尝试使 ...
1
java – 在JUnit测试用例中检查超时
问答我有一个JUnit测试用例,我希望特定的方法调用花费很长时间(超过一分钟).我想要 >进行方法调用. >确保方法调用至少需要一分钟,如果没有,则JUnit断言失败. >然后杀死方法调 ...
3
java – 在eclipse中设置JUnit超时
问答题 当我运行所有的JUnit测试,使用eclipse,我可以设置一个默认超时吗? 背景 我的经理坚持写单元测试,有时需要5分钟才能完成.当我尝试运行我们的整个测试套件(只有大约300个测试)可能需要超 ...
1
java – 如何在Spring WebServiceTemplate中设置超时
问答我正在使用org.springframework.ws.client.core.WebServiceTemplate进行Web服务调用.如何配置呼叫的超时.::如果您使用的是Spring Webser ...
1
如何在Java中使用超时调用一些阻塞方法?
问答有没有一个标准的好方法来调用一个阻塞方法与Java中的超时?我想要能够做: // call something.blockingMethod(); // if it hasn't come back ...
1
java – 在apache http客户端中设置超时
问答我正在使用Apache http客户端4.3.2发送get请求.我所做的是: private final RequestConfig requestConfig = RequestConfig.cus ...
1
java – DefaultHttpClient中的超时
问答我对DefaultHttpClient的超时工作方式有点困惑. 我正在使用此代码: private DefaultHttpClient createHttpClient() { HttpParams ...
1
java – web.xml中的会话超时不适用于weblogic服务器
问答我已在web.xml中将超时设置为30分钟,并已在WebLogic中成功部署了webapp.现在应用程序已启动并正在运行,但是当达到最大非活动时间间隔时,会话不会超时.这个相同的应用程序正确地在tom ...
1