首页 > 解决方案 > 向 Quartz 作业的迁移代码不起作用(因为需要会话范围的 bean)

问题描述

我在 Quartz 作业中迁移了一个异步运行的代码。

现在,当我尝试使用会话范围视图时出现此错误,该视图在石英作业完成时调用:

org.quartz.JobExecutionException:org.springframework.beans.factory.BeanCreationException:创建名为“scopedTarget.vaadinView”的bean时出错:范围“会话”对当前线程无效

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)

我的问题是:如何使用石英作业线程来更新 UI

注意:我正在使用 Grails + Vaadin + SpringBoot

标签: javaspringgrailsvaadinquartz-scheduler

解决方案


推荐阅读