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