gpt4 book ai didi

java - Spring集成疑问: CRUD operations and sharing events between components

转载 作者:行者123 更新时间:2023-11-30 02:41:19 25 4
gpt4 key购买 nike

我目前正在使用 Spring 集成框架开发一个简单的 Spring Web 应用程序。我已经了解了企业集成模式、目的、优点...我已经摆脱了 ServiceLayer 并将应用程序工作流程委托(delegate)给集成框架。但我遇到了一些设计问题,我陷入困境,我希望能在设计方面得到一些启发。下面我将尝试解释它们,提前致谢。

<强>1。使用 Spring Integration Framework 进行 CRUD 操作

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

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

<强>2。使用 Spring Integration Framework 在端点之间共享事件

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

最佳答案

嗯嗯嗯。您的担忧不知何故不清楚。

当你以前有一个ServiceLayer时,我很确定很多特定操作的方法不会打扰你。因此,不知道当您切换到消息传递架构时,为什么您如此担心消息 channel 区分操作。

同时我猜想 @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 作为该转换器的输出。

另一方面,有 RecipientListRouter 将传入消息分发给多个收件人 - 当然是 channel 。

关于java - Spring集成疑问: CRUD operations and sharing events between components,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41612131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com