到quartz作业的迁移代码不起作用(因为需要会话范围的bean)

bwntbbo3  于 2021-07-08  发布在  Java
关注(0)|答案(0)|浏览(193)

我在quartz作业中迁移了一个异步运行的代码。
现在,当我尝试使用会话范围的视图(在quartz作业完成时调用)时,出现了以下错误:
org.quartz.jobexecutionexception:org.springframework.beans.factory.beancreationexception:创建名为“scopedtarget.vaadinview”的bean时出错:当前线程的作用域“session”未处于活动状态
org.springframework.beans.factory.beancreationexception:创建名为“scopedtarget.vaadinview”的bean时出错
我的想法是:

@Scope(value = "session", proxyMode = ScopedProxyMode.INTERFACES)
public class VaadinView implements View, DisposableBean

我知道quartz作业在另一个线程上运行,会话上下文丢失。因此,在调用作业之前,我将请求属性存储在作业本身中 RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); 然后,在调用会话作用域bean之前,我将还原请求属性:

RequestContextHolder.setRequestAttributes(attributes); // workaround
vaadinView.doSomethingOnUI(); // error here

问题是,现在a有相同的错误,但有另一条消息,告诉我会话是必需的:

Caused by: java.lang.IllegalArgumentException: Session must not be null
        at org.springframework.util.Assert.notNull(Assert.java:134)
        at org.springframework.web.util.WebUtils.getSessionMutex(WebUtils.java:403)
        at org.springframework.web.context.request.ServletRequestAttributes.getSessionMutex(ServletRequestAttributes.java:253)
        at org.springframework.web.context.request.SessionScope.get(SessionScope.java:91)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:346)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
        at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:192)

我的问题是:如何使用quartz作业线程来更新ui
注意:我使用的是grails+vaadin+springboot

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题