Springboot服务交流

时间:2018-07-20 15:26:38

标签: java spring-boot

在springboot应用程序中,@ services之间进行通信的最佳方法是什么?

我有一个处理一些逻辑的serviceA,然后将一些数据发送到serviceB,后者有一个执行程序来运行一些数学运算,然后需要将更新发送给serviceA。

当前,我有一个从服务A-> B发送到的阻塞队列,但这意味着当对象在队列中时,服务将需要不断监视队列... applicationEvent发布者在这里有用吗?

1 个答案:

答案 0 :(得分:0)

基本上@Service是Spring注释,用于自动进行依赖项管理。此注释并不意味着类实例将是“异步服务”(据我所知是您的上下文)含义的服务。因此,要通信两个带有@Service的带注释的类实例,您需要在另一个实例中引用它们中的一个,并在异步通信中提供一些回调工具。

@Service
public class ServiceA{
   ServiceB serviceB;
  @Autowired      
  public ServiceA(ServiceB serviceB){
     this.serviceB = serviceB;
  }

  void foo(){
    serviceB.doTheJob();         
  }
 void jobDone() {
 {
}

可以通过依赖管理注入serviceA来提供回调:

@Service
public class ServiceB{
   ServiceB serviceA;
  @Autowired      
  public ServiceA(ServiceA serviceA){
     this.serviceA = serviceA;
  }

  public void doTheJob() {
    Executors.newSingleThreadExecutor().execute(() -> {/*do some job*/ 
                                                  serviceA.jobDone(););
  }

}

或者可以在方法调用(通过分别修改的doTheJob调用)上注入:

@Service
public class ServiceB{
  public void doTheJob(ServiceA serviceA) {
    Executors.newSingleThreadExecutor().execute(() -> {/*do some job*/ 
                                                  serviceA.jobDone(););
  }
}

以上回调方法当然只是示例,在您的上下文中可能需要使用队列。