Spring 集成疑点:CRUD操作和组件间共享事件

Spring Integration Doubts: CRUD operations and sharing events between components

我目前正在使用 Spring 集成框架开发一个简单的 Spring 网络应用程序。我已经阅读了有关企业集成模式、目的、好处的信息……我已经摆脱了 ServiceLayer 并将应用程序工作流委托给了集成框架。但是我遇到了一些卡住的设计问题,我希望在设计方面有所了解。下面我将尝试解释它们,在此先感谢。

1.使用 Spring 集成框架

的 CRUD 操作

假设您有 2 个端点通过直接通道连接,1 个端点接收请求,另一个处理这些请求。我不想从实现的角度来谈,而是从设计的角度来谈(正如我之前所说的),但为了澄清这一点,想象一下,您将接收端点实现为连接到网关的 RestController,将另一个端点实现为连接到数据库适配器的 ServiceActivator。 现在,用户可以请求 4 个基本操作,创建、读取、更新和删除(基本 CRUD)。由于接收方端点只能执行一个方法(handleMessage 方法),那么将 4 个操作复用的正确方法是什么?

  1. 在邮件中添加某种标签header?这对我来说似乎很难看,而且接收方端点必须实现一个 if-else 块。将控制器连接到接口并调用方法并摆脱 spring 集成会更容易。
  2. 创建 4 个 ServiceActivator 连接到同一个数据库?我也不喜欢,想象一下如果你有 30 个操作而不是 4 个。
  3. 我还没有找到其他解决方案吗?例如,通过不同的通道发送每个操作,这样您就有 4 个通道。您可以从网关的角度执行此操作,但问题是 ServiceActivator 只能有 1 个入站通道。

2。使用 Spring Integration Framework

在端点之间共享事件

假设您有一个网关连接到 Transformer.The 转换器启动一个线程,在该线程中解析一些数据并在完成时将其发送到下一个端点。 现在,Gateway 客户端需要知道它通过通道发送的请求的状态(因为 Gateway 对 Transformer 或其实现一无所知,所以它们不应该共享任何内容)。 Transformer 只有 1 个入站通道和 1 个输出通道,无法通过第三个通道发布结果,如何实现?本质上,问题是,如何在不耦合端点或破坏集成模式架构的情况下共享事件? P.D.:请避免没有干净的答案,例如静态共享 objects,谢谢。

M-m-m。你的担心有点不清楚。

当你之前有一个 ServiceLayer 的时候,我很确定很多特定操作的方法没有打扰你。所以,不确定为什么您在切换到消息架构时如此担心消息通道区分操作。

同时我猜@CotrollerGETPOSTDELETE@RequestMapping因为它的方法不再关心你.

面对端点之间的 MessageChannel,在您的应用程序中添加额外的对象会带来一些不便。但与此同时,当您开始将您的应用程序视为一堆消息流时,这是一个好处,其中每个消息流都是分开的 MessageChannel 并且您可以修改任何流而不影响任何其他流。另外不要忘记,使用 MessageChannel 您可以简单地进入分布式模式,当您的业务逻辑相同时,但消息通过网络传输用于目标服务或其他目的。

所以,IMO 我有 @MessagingGateway@Controller 调用,每个网关的方法将映射到特定的 MessageChannel.

多亏了注解模型,你可以只有一个目标服务,但是每个 CRUD 操作的方法都标有 @ServiceActivator 特定 MessageChannel:

@MessagingGateway
public interface CrudGateway {

   @Gateway(requestChannel = "getChannel")
   Object get(Object id);

   @Gateway(requestChannel = "saveChannel")
   Object save(Object object);

   @Gateway(requestChannel = "deleteChannel")
   boolean delete(Object object);

}

...

@Service
public class CrudService {

   @ServiceActivator(inputChannel = "getChannel")
   public Object get(Object id) {
       // SELECT
   }

   @ServiceActivator(inputChannel = "saveChannel")
   public Object save(Object object) {
       // INSERT or UPDATE
   }

   @ServiceActivator(inputChannel = "deleteChannel")
   public boolean delete(Object object) {
       // DELETE
   }

}

对于你的第二个问题,也有一些答案。

考虑使用 PublishSubscribeChannel 作为 transformer 的输出。

另一方面,RecipientListRouter 可以将收到的消息分发给多个收件人 - 当然是渠道。