当前位置: 首页 > 面试题库 >

在不使用线程的情况下处理EJB3中的超时

盖夕
2023-03-14
问题内容

我有以下情况。我的工作是:

  • 在给定的时间后可能会超时,如果发生则需要抛出异常
  • 如果没有超时,将返回结果
  • 如果此作业返回结果,则必须尽快将其返回,因为性能非常重要。因此,异步解决方案已经不在市场上了,通过锤子自然捆绑系统也是一种选择。
  • 最后,系统必须符合EJB标准,因此不建议使用普通线程的AFAIK,因为这是严格禁止的。

我们当前的解决方案使用一个线程,该线程在存在一定时间后将被抛出异常,而不会被外部进程中断,但是由于这显然违反了EJB标准,因此我们正在尝试通过其他方法来解决该问题。

有任何想法吗?

编辑添加 自然,超时的作业也需要删除(或中断)。

编辑添加2: 此问题似乎没有任何解决方案,因为要完全遵循纯EJB3标准,检测死锁似乎几乎是不可能的。由于Enno
Shioji在下面的评论反映了这一点,因此我将他的建议设置为正确答案。


问题答案:

这更像是一个澄清请求,但是太长了,无法作为评论。

我不确定您现在是如何做的,因为从您编写的内容来看,仅使用请求处理线程似乎是可行的方法。像这样:

//Some webservice method (synchronous)
public Result process(Blah blah){
    try{
        return getResult(TimeUnit.SECONDS, 10);
    }catch(InterruptedException e){
        //No result within 10 seconds!
        throw new ServiceUnavailableException("blah");
    }
}

我不确定为什么要创建线程。如果由于该getResult方法根本不超时而被迫使用线程,则可能会发生线程泄漏。如果它在较长时间后超时,因此您想“简化”对用户的答复,那将是我考虑使用线程的唯一情况,就像我想象的那样。这可能会导致线程在负载下堆积,因此我努力避免这种情况。

也许您可以发布一些代码,让我们知道您为什么要在服务中创建代码?

另外,您的客户端界面是什么?听起来像是同步Web服务或其他东西?

在那种情况下,如果我是您,我将使用a
HashedWheelTimer作为一个单例…这种机制应该可以很好地满足您的需求(这是一个实现)。但是,不幸的是,这似乎与EJB规范中对线程的禁止和对单例的禁止相冲突。实际上,如果您这样做,实际上并没有问题。例如,请参见此讨论。我们还在EJB应用程序中使用了单例模式。使用了JBoss。但是,如果这不是一个可行的选择,那么我可能会考虑通过定义一个新的Web服务(并将其部署在Web容器中或其他东西中)隔离其自己的JVM中的处理,然后从EJB应用程序中调用该服务。但是,这显然会导致性能下降,现在您将拥有另一个全新的应用程序。



 类似资料:
  • 我有一个发布Runnables的处理程序(线程)。如果Runnable错误地抛出RuntimeException,整个应用程序进程就会崩溃。作为默认情况,这听起来很明智,但我想捕获此类运行时异常,记录错误,然后继续运行。不过,我很难做到这一点。我想到了以下选项: 子类并覆盖,其中包含调用发布的Runnables的方法的代码。这不起作用,因为是最终的。 子类并覆盖调用的run方法。在运行时异常的情况

  • 我的大学教授给我布置了一个练习,内容如下: “Geofence对象是一个对象,它有一个对象集合,可以在这些对象发出信号时等待。有一个add(object)方法,它将对象添加到集合中。还有一个await()方法:它允许等待集合中的任何对象发出信号。每当调用add(object)方法时,await()方法处于活动状态时,add的参数将放入队列中。使用以下接口编写源代码:“。 因此,只有当调用相同数量的

  • 以下是我对线性探测的理解。 对于插入:-我们散列到某个位置。如果该位置已经有一个值,我们线性增加到下一个位置,直到我们遇到一个空位置,然后我们在那里插入。这是有意义的。 我的问题围绕着查找。从我读过的描述中,我相信查找是这样工作的: 我们查看要查找散列的项的位置 那么,当我们从散列中删除一项时,这是如何工作的呢?这不会把查找搞砸吗?假设两个项目散列到同一位置。我们添加两个项目,然后删除我们添加的第

  • 问题内容: 我怎么会去这样做算术,,与任意大的整数,而无需使用!? 例如,在Java中,阶乘90会返回0。我希望能够解决这个问题。 问题答案: 我认为程序员应该已经实现了自己的bignum库,因此欢迎在这里。 (当然,稍后你会发现BigInteger更好,并且可以使用它,但这是宝贵的学习经验。) (你可以在github上关注本课程的源代码。此外,我将此内容(略有修饰)重新制作成了一个由14部分组成

  • 首先,如果这是一个很长的代码段,我很抱歉,但是,我想做一个模态窗口,它将你在我的用户表单中写的东西写下来,并要求你确认它。我目前正在学习Javascript,我不允许使用innerHTML,我必须动态地编写“名字”等(名字的文本),不允许只在弹出窗口内写它。我已经让大多数东西工作,但“名字”“名字”等显示为“未定义”,或者(正如你可以看到的,我在这种情况下只用名字尝试的事情)显示为“空”。 希望有

  • 我遇到了一个非常奇怪的问题,java线程正忙着等待。 我有一个线程忙于等待其他线程的静态变量的状态。假设忙碌等待的线程正在等待另一个线程的静态int变量达到某个值 如果我使用上面的代码,线程将被卡在忙等待中,不会跳出while循环,即使确实达到5。 但是,如果我使用其他代码,那么线程确实会跳出忙等待循环。有时,一旦达到5,其他时候会晚一点。但它会发生。对于我的特定示例,我将其用作“无意义的工作”