【问题标题】:Spring Boot @Scheduled method create instance of @Scope(request)Spring Boot @Scheduled 方法创建 @Scope(request) 的实例
【发布时间】:2020-03-03 17:44:29
【问题描述】:

我在使用弹簧瞄准镜时遇到问题。我确信我的解决方案不是最佳的,但我不知道有更好的方法来做到这一点。你有什么建议吗?

这是我的问题:

我需要什么:

我正在尝试执行与 @RESTController 映射方法相同的操作,但会定期在后台执行,无需任何用户 http/s 调用。

我有什么:

目前,我有一些 @Service 范围为 @Scope(REQUEST) 的类,@RestController 从 http/s 调用中调用。

我正在尝试什么

我创建了一个新的@Component 类,其中包含一个@Scheduled 方法,该方法试图调用@Service,其范围为@Scope(REQUEST)

我的问题:

@Scheduled 方法不能使用REQUEST 范围内的@Service,因为它们不在请求范围内,并且很难将所有相关服务更改为该操作。

谢谢!

【问题讨论】:

  • 请求的所有逻辑都应该在服务方法中......所以让您的计划任务调用服务方法......
  • @RobOhRob 服务是请求范围的
  • 为什么服务甚至请求范围?服务中是否有需要保留的状态?

标签: java spring spring-boot scope spring-scheduled


【解决方案1】:

这意味着为请求创建服务实例,但如果没有请求,则没有 bean 实例。您不能为您的计划作业创建一个单独的 bean 实例吗?

基本上从您的服务类中删除@Service 并创建一个配置文件

@Configuration
class FooServiceConfiguration {

    @Bean
    @RequestScope
    FooService requestFooService(){
        return new FooService()
    }

    @Bean
    FooService scheduledFooService(){
        return new FooService()
    }
}

然后从您的请求流中使用的任何地方自动装配 requestFooService,并从您的计划作业中自动装配 scheduleFooService。

【讨论】:

  • 这是我的选择之一,但这意味着要更改很多服务。因此,出于这个原因,如果可能的话,我正在寻找另一种选择。警察:谢谢!
  • 我认为除了从服务中删除请求范围之外,没有其他选择。我无法想象在如此多的服务中真正需要这种范围的情况。对于每个请求,您真的需要所有这些服务的单独实例吗?否则他们都会有线程安全问题吗?如果不?如果只是普通的无状态服务,只要去掉请求范围,变成普通的单例bean即可。
  • 是的,我想是的。
猜你喜欢
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 2020-10-02
  • 2016-02-17
  • 2021-04-30
  • 2021-12-09
  • 2015-07-02
  • 1970-01-01
相关资源
最近更新 更多