java - 为后台任务替换作用域 session bean

标签 java spring session scheduled-tasks

在我的 Web 应用程序中,我有一个作用域 session Bean,除其他用途外,它还用于保存连接到底层系统所需的一些凭证信息(存储需要为底层 Web 服务访问发送的 SAML)。

我有那个 bean,它确实在调用 web 服务之前在正确的位置注入(inject)了凭证。

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

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

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

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

但我想为我的后台任务定义一个静态凭证(例如,定义一个系统帐户等),从而为后台任务定义一种替代 bean MyScopedSession,以便 Autowiring 工作。这可能吗?

可以肯定的是,我可以将我的 bean 定义为

@Autowired
private SomeWebService someWebService;

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

但我不太喜欢这个,因为我不想通过参数传递我的凭证到我所有的业务服务(可能有 10 层 bean 在这上面直到我的后台任务,或者直到我的 rpc 调用)

您是否可以推荐任何解决方案或架构更改?

最佳答案

如果您的计划任务是在 spring 上下文中触发的,您可以将 Session 范围注册为 ThreadScope 并具有以下两个 LOC

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

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

引用相关 java 文档 here , herehere .

关于java - 为后台任务替换作用域 session bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27522716/

相关文章:

java - 使应用程序退出 Android

mysql - 无法建立 JDBC 连接 - 没有有效的解决方案 :/

php - SessionHandlerInterface 写方法替代方案

PHP 和 AJAX session : Session variables different on AJAX page than on page called from

java - BoxLayout 为自定义组件提供了意外的宽度

java - Ant - 迭代文件夹以获取运行参数

java - ListView 显示 arraylist 数据两次

java.lang.ClassNotFoundException : org. zkoss.zk.ui.http.HttpSessionListener

java - 如何使用 MockMultipartFile 编写 spring-restdocs 片段

session - 如何设置 View 超时?