java.lang.IllegalStateException:请求对象已被回收,不再与此门面关联

问题描述 投票:0回答:1

我在 Vaadin 中创建了一个时间函数,使用调度程序每秒更新一个标签。

  if (getUI().isPresent()) {
            ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
            UI ui = getUI().get();

            Runnable repeatedTask = () -> {
                if (ui.isAttached()) {
                    ui.access(() -> {
                        timeLabel.setText(
                                DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalDateTime.now()));
                    });
                }

            };
            scheduler.scheduleAtFixedRate(repeatedTask, 1, 1, TimeUnit.SECONDS);
            ScheduledExecutorService shutdownSchedule = Executors.newScheduledThreadPool(1);
            Runnable shutdownTask = () -> {
                scheduler.shutdown();
                shutdownSchedule.shutdown();
            };
            shutdownSchedule.schedule(shutdownTask, 3, TimeUnit.MINUTES);
        }

当我在本地运行程序时,没有问题,但在生产中,它显示此错误消息。

java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade
at org.apache.catalina.connector.RequestFacade.removeAttribute(RequestFacade.java:549) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationHttpRequest.removeAttribute(ApplicationHttpRequest.java:281) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at jakarta.servlet.ServletRequestWrapper.removeAttribute(ServletRequestWrapper.java:268) ~[tomcat-embed-core-10.1.5.jar:6.0]
at jakarta.servlet.ServletRequestWrapper.removeAttribute(ServletRequestWrapper.java:268) ~[tomcat-embed-core-10.1.5.jar:6.0]
at org.atmosphere.cpr.
.AtmosphereRequestImpl.removeAttribute(AtmosphereRequestImpl.java:681) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2]
at org.atmosphere.cpr.DefaultBroadcaster.executeAsyncWrite(DefaultBroadcaster.java:915) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2] at org.atmosphere.cpr.DefaultBroadcaster$2.run(DefaultBroadcaster.java:477) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2] at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[na:na]
at java.base/java.util.concurrent.FutureTask.run(F (FutureTask.java:264) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
: This message com.vaadin.flow.server.communication. AtmospherePushConnection$PushMessage@6cbb2d50 will be lost for AtmosphereResour : Failed to execute a write operation for Broadcaster /*
2023-10-02T13:11:23.767+08:00 WARN 254255 --- [here-Shared-278] org.atmosphere.cpr.DefaultBroadcaster ce 999e5bfb-9531-4708-bff3-195024ca36d1, adding it to the BroadcasterCache 2023-10-02T13:11:23.767+08:00 WARN 254255 [here-Shared-278] org.atmosphere.cpr.DefaultBroadcaster java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade
at org.apache.catalina.connector.RequestFacade.removeAttribute(RequestFacade.java:549) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationHttpRequest.removeAttribute(ApplicationHttpRequest.java:281) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at jakarta.servlet.ServletRequestWrapper.removeAttribute(ServletRequestWrapper.java:268) ~[tomcat-embed-core-10.1.5.jar:6.0]
at jakarta.servlet.ServletRequestWrapper.removeAttribute(ServletRequestWrapper.java:268) ~[tomcat-embed-core-10.1.5.jar:6.0]
at org.atmosphere.cpr.
.AtmosphereRequestImpl.removeAttribute(AtmosphereRequestImpl.java:681) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2]
at org.atmosphere.cpr.DefaultBroadcaster.executeAsyncWrite(DefaultBroadcaster.java:915) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2] at org.atmosphere.cpr.DefaultBroadcaster$2.run(DefaultBroadcaster.java:477) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2] at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[na:na]
at java.base/java.util.concurrent.FutureTask.run(F (FutureTask.java:264) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
2023-10-02T13:11:25.767+08:00 WARN 254255 --- [here-Shared-282] org.atmosphere.cpr.DefaultBroadcaster 2023-10-02T13:11:25.767+08:00 WARN 254255 [here-Shared-282] org.atmosphere.cpr.DefaultBroadcaster
ce 999e5bfb-9531-4708-bff3-195024ca36d1, adding it to the BroadcasterCache
: This message com.vaadin.flow.server.communication. Atmosphere PushConnection$PushMessage@48d18881 will be lost for AtmosphereResour : Failed to execute a write operation for Broadcaster /*
java.lang.IllegalStateException: The request object has been recycled and is no longer associated with this facade
at org.apache.catalina.connector.RequestFacade.removeAttribute(RequestFacade.java:549) ~[tomcat-embed-core-10.1.5.jar:10.1.5]
at org.apache.catalina.core.ApplicationHttpRequest.removeAttribute(ApplicationHttpRequest.java:281) ~[tomcat-embed-core-10.1.5.jar:10.1.5] .servlet.ServletRequestWrapper.removeAttribute(ServletRequestWrapper.java:268) ~[tomcat-embed-core-10.1.5.jar:6.0]
at
at
at org.atmosphere.cpr.
at org.atmosphere.cpr.AtmosphereRequestImpl.removeAttribute(AtmosphereRequestImpl.java:681) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2] at org.atmosphere. .cpr.
.executeAsyncWrite(DefaultBroadcaster.java:915) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2]
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[na:na]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
·Defair to do ver $2.run(DefaultBroadcaster.java:477) ~[atmosphere-runtime-3.0.0.slf4jvaadin2.jar:3.0.0.slf4jvaadin2]
X

我相信这个问题的原因是调度程序试图每秒更新标签,但我不确定如何修复它。我正在使用 Vaadin 24,如果有任何帮助,我们将不胜感激。

java vaadin scheduler
1个回答
0
投票

我认为你所描述的问题与这个问题类似。

当 Tomcat 完成处理后尝试访问 HttpRequest 对象时,会发生此错误。当您的后台处理比请求的处理寿命更长,但使用请求对象时,通常会发生这种情况。

我认为你应该重构你的代码,使其不依赖于请求。您可以考虑将相关请求属性复制到另一个对象中,并在后台处理中使用该对象。

© www.soinside.com 2019 - 2024. All rights reserved.