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

Java 到Quartz作业的迁移代码不起作用(因为需要会话范围的bean),java,spring,grails,vaadin,quartz-scheduler,Java,Spring,Grails,Vaadin,Quartz Scheduler,我迁移了一段代码以在Quartz作业中异步运行 现在,当我尝试使用会话范围视图时,出现了以下错误,该视图在quartz作业完成时调用: org.quartz.JobExecutionException: org.springframework.beans.factory.BeanCreationException:错误 正在创建名为“scopedTarget.vaadinView”的bean:作用域“session”为 当前线程不处于活动状态 org.springframework.beans.

我迁移了一段代码以在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,这感觉不对。作业不应依赖于视图。而且很可能不是相反。您最好使用pub/sub或某个队列将事情解耦,这样您的工作人员和视图都能做他们最擅长的事情。例如,工作人员通知成功的任务,视图可以通过UI.access/Push.maybe@Async methods annotation更新用户,而不是quartz