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

时间:2014-12-17 09:52:45

标签: java spring session scheduled-tasks

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

我有那个bean在调用web-serivce之前在正确的位置注入了凭证。

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

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

我想添加后台任务(一个war包装web-app +一些后台任务)每小时运行一次我使用调度程序。问题是这个后台任务不能使用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层以上的bean,直到我的后台任务,或者直到我的rpc调用)< / p>

您可以推荐任何解决方案或体系结构更改吗?

1 个答案:

答案 0 :(得分:1)

如果您在春季上下文中触发了计划任务,则可以将Session范围注册为ThreadScope以下两个LOC

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

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

参考相关的java文档hereherehere