替换后台任务的作用域会话bean

在我的Web应用程序中,我有一个有作用域的会话Bean,用于保存连接到底层系统(存储需要发送的底层Web服务访问的SAML)所需的某些凭据信息。

我有这个bean,在调用web-serivce之前,在正确的地方注入证书。

@Autowired
private MyScopedSession myScopedSession;
@Autowired
private SomeWebService someWebService;

public void someCall() {
  ...
  injectSamlPart
  ...
}

我想添加后台任务(一个战争打包web应用+一些后台任务),每小时运行一次,我使用一个调度器。 问题是这个后台任务不能使用scoped-session bean(这是有道理的,因为它不是由http请求驱动的)。 所以我得到这样的错误:

Scope 'session' is not active for the current thread;

但是我想为我的后台任务定义一个静态证书(例如,定义一个系统帐户等),并为后台任务定义一种替代bean MyScopedSession,以便自动装配工作。 这可能吗?

当然,我可以做的是将我的bean定义为

@Autowired
private SomeWebService someWebService;

public void someCall(MyScopedSession myScopeSession) {
  ...
  injectSamlPart
  ...
}

但我不喜欢这么多,因为我不想通过我的所有业务服务参数凭证(可能是10层豆,直到我的后台任务,或者我的rpc调用)

是否有任何解决方案或体系结构更改可以推荐?


如果您计划任务的春天上下文中触发,您可以注册Session范围为ThreadScope具有小于两个LOC

ConfigurableBeanFactory factory = applicationContext.getBeanFactory();
factory.registerScope(WebApplicationContext.SCOPE_SESSION,
                    new SimpleThreadScope());

这应该在应用程序的启动/初始化(即后台任务)时完成,并且应该是您的Web应用程序独占的

请参阅这里和这里的相关Java文档。

链接地址: http://www.djcxy.com/p/38929.html

上一篇: Replace scoped session bean for background task

下一篇: Spring web app. One war multiple application context