Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当DeferredResult传递给Akka参与者时,Spring MVC异步请求间歇性超时_Java_Spring Mvc_Asynchronous_Akka_Glassfish 4 - Fatal编程技术网

Java 当DeferredResult传递给Akka参与者时,Spring MVC异步请求间歇性超时

Java 当DeferredResult传递给Akka参与者时,Spring MVC异步请求间歇性超时,java,spring-mvc,asynchronous,akka,glassfish-4,Java,Spring Mvc,Asynchronous,Akka,Glassfish 4,我已经实现了各种Spring MVC REST端点,以公开返回延迟结果的服务,该结果将交给AkkaTypedActor来完成。该应用程序部署到Glassfish 4服务器中 通常情况下,服务会按预期执行和返回,但我会间歇性地收到在我指定的超时时间间隔内发生的以下异常: WARNING: Error invoking requestDestroyed method on ServletRequestListener org.jboss.weld.servlet.WeldListener

我已经实现了各种Spring MVC REST端点,以公开返回
延迟结果
的服务,该结果将交给Akka
TypedActor来完成。该应用程序部署到Glassfish 4服务器中

通常情况下,服务会按预期执行和返回,但我会间歇性地收到在我指定的超时时间间隔内发生的以下异常:

    WARNING:   Error invoking requestDestroyed method on ServletRequestListener org.jboss.weld.servlet.WeldListener
java.lang.NullPointerException
    at org.jboss.weld.context.AbstractBoundContext.deactivate(AbstractBoundContext.java:71)
    at org.jboss.weld.context.http.HttpRequestContextImpl.deactivate(HttpRequestContextImpl.java:70)
    at org.jboss.weld.servlet.WeldListener.requestDestroyed(WeldListener.java:154)
    at org.apache.catalina.core.StandardContext.fireRequestDestroyedEvent(StandardContext.java:5261)
    at org.apache.catalina.core.StandardHostValve.postInvoke(StandardHostValve.java:255)
    at org.apache.catalina.connector.Request.errorDispatchAndComplete(Request.java:4484)
    at org.apache.catalina.connector.Request.asyncTimeout(Request.java:4424)
    at org.apache.catalina.connector.Request.processTimeout(Request.java:4458)
    at org.apache.catalina.connector.Request.access$000(Request.java:156)
    at org.apache.catalina.connector.Request$6.onTimeout(Request.java:4302)
    at org.glassfish.grizzly.http.server.Response$SuspendTimeout.onTimeout(Response.java:2024)
    at org.glassfish.grizzly.http.server.Response$DelayQueueWorker.doWork(Response.java:2073)
    at org.glassfish.grizzly.http.server.Response$DelayQueueWorker.doWork(Response.java:2068)
    at org.glassfish.grizzly.utils.DelayedExecutor$DelayedRunnable.run(DelayedExecutor.java:158)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)
servlet定义为my
web.xml
,如下所示:

<servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value/>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
</servlet>
@Override
public void general(DeferredResult<String> result, List<AbstractDocument> documents) {
    LOG.debug("Processing {} general documents...", documents.size());

    try {
        result.setResult(documents.size() + " general documents accepted.");
        LOG.debug("DeferredResult set");
        for (AbstractDocument document : documents) {
            documentStore.get().getActorRef().tell(document, TypedActor.context().self());
            LOG.debug("{} document sent to {}", document.get_id(), documentStore.get().getActorType());
        }
    } catch (Exception e) {
        result.setErrorResult(e);
    }

}
正如您在
DocumentsStoreBridge
实现中所看到的,我正在几乎立即设置延迟结果的结果,因此希望它能够完成异步请求

实际上,间歇性地,结果设置正确,程序流程继续,但是异步请求没有完成,因此当请求超时时,客户端收到HTTP 500错误


非常感谢您的帮助。

在升级到GlassFish 4.1之后,这个问题现在似乎得到了解决,我想与4.1一起打包的WELD的新版本包含了修复程序

我对Spring MVC不太了解,但作为一个猜测,它是否在内部使用ThreadLocals?我不知道。AFIK向DispatcherServlet公开REST端点的SpringMVC层将使用HTTP线程池,然后我的代码将DeferredResult交给Akka actor,Akka actor被定义为使用默认配置,这是一个fork-join执行器。我没有对线程的使用方式进行任何特定的配置更改,这本身可能就是问题所在,我只是不确定为什么这种行为会是间歇性的。我想知道这个问题的答案是否与此相关:
@Override
public void general(DeferredResult<String> result, List<AbstractDocument> documents) {
    LOG.debug("Processing {} general documents...", documents.size());

    try {
        result.setResult(documents.size() + " general documents accepted.");
        LOG.debug("DeferredResult set");
        for (AbstractDocument document : documents) {
            documentStore.get().getActorRef().tell(document, TypedActor.context().self());
            LOG.debug("{} document sent to {}", document.get_id(), documentStore.get().getActorType());
        }
    } catch (Exception e) {
        result.setErrorResult(e);
    }

}