Java 复杂Spring框架服务层
该帖子的编辑短版: 没有足够的观点,所以我总结一下问题: 我的架构是完全无状态和异步的,前端向RESTAPI发出请求,然后长时间轮询响应。这个RESTAPI将请求排队到消息队列中,每个请求都由后端出列和处理 我希望这个后端遵循“传统”的Spring@Service接口和ServiceImpl方法,但是由于我的操作方式,这有点困难 一个线程将请求(生产者)出列,生成一个新线程(消费者),然后处理该线程中的所有请求,该线程随后将发送回“响应池”,在那里进行轮询。该请求可能需要使用多个@Service并合并每个@Service的响应,甚至可能两次合并同一个@Service 你会怎么做?有关更多信息,请查看下面的说明 原始长帖子: 我有一个大型应用程序,有3层,如下所示:Java 复杂Spring框架服务层,java,multithreading,spring,spring-mvc,architecture,Java,Multithreading,Spring,Spring Mvc,Architecture,该帖子的编辑短版: 没有足够的观点,所以我总结一下问题: 我的架构是完全无状态和异步的,前端向RESTAPI发出请求,然后长时间轮询响应。这个RESTAPI将请求排队到消息队列中,每个请求都由后端出列和处理 我希望这个后端遵循“传统”的Spring@Service接口和ServiceImpl方法,但是由于我的操作方式,这有点困难 一个线程将请求(生产者)出列,生成一个新线程(消费者),然后处理该线程中的所有请求,该线程随后将发送回“响应池”,在那里进行轮询。该请求可能需要使用多个@Service
- 一个请愿书有许多动作,一个动作是对服务功能的调用
- 每个消费者都是一个单一且唯一的线程
- 每次使用者线程启动时,都会启动一个事务,并在返回之前提交该事务,除非回滚
- 我需要在同一线程和事务中执行该请愿书的所有服务
- 当使用者运行afterPropertiesSet时,特定于该请求的多个字段由始终发送的一些参数初始化
- 我不想总是为请求的每个服务初始化所有这些参数,我希望它们是请求/线程的全局参数,但是,我不想将它们作为参数传递给所有函数
- 我想懒洋洋地初始化新服务,只有在需要的时候,当它被初始化时,我想设置我上面提到的所有参数。每个服务都需要是请愿书的原型,但是我觉得如果需要在同一请愿书中初始化它两次(在一个请愿书中对同一服务执行两个操作),即我希望它的行为像一个“请求”范围,但是,它不是一个请求,因为它不是基于Web的,它是一个新线程,在请求解队列时由生产者初始化
感谢第2点和第3点需要更多的重新组织,更愿意检查“中间件”和(Spring独立应用程序):生产者/消费者模式的“Spring集成”实际上是为了解决这2点,如果您同时执行2个或更多操作,请使用发布/订阅,另一点是您使用REST的原因“中间件”是由另一个应用程序而不是您的前端公开的这些“中间件”服务,在这种情况下,您可以使用“内容协商”将此部分集成到您的Spring MVC前端应用程序中,否则,如果您要使用“Spring集成”“您将找到多种通信方式。根据描述,我认为这不是使用原型作用域的好例子,在这种情况下,理想的作用域似乎是
线程作用域
作为一种解决方案,最简单的方法是使所有服务都是单例的。然后,使用者从入站队列读取请求并开始处理
其中一个服务也是singleton
,并被注入到所有需要的服务中,我们称之为requestscopedservice
此服务在内部使用,它是类型为的变量的线程范围的保持器
public class PetitionContext {
... just a POJO, getters and setters etc.
}
@Service
public class PetitionScopedService {
private ThreadLocal<PetitionContext> = new ThreadLocal<PetitionContext>();
public doSomethingPetitionSpecific() {
... uses the petition context ...
}
}
@Service
public class SomeOtherService {
@Autowired
private PetitionScopedService petitionService;
... use petition service that is a singleton with thread scoped internal state, effectivelly thread scoped ...
}