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 个操作复用的正确方法是什么?
- 在邮件中添加某种标签header?这对我来说似乎很难看,而且接收方端点必须实现一个 if-else 块。将控制器连接到接口并调用方法并摆脱 spring 集成会更容易。
- 创建 4 个 ServiceActivator 连接到同一个数据库?我也不喜欢,想象一下如果你有 30 个操作而不是 4 个。
- 我还没有找到其他解决方案吗?例如,通过不同的通道发送每个操作,这样您就有 4 个通道。您可以从网关的角度执行此操作,但问题是 ServiceActivator 只能有 1 个入站通道。
2。使用 Spring Integration Framework
在端点之间共享事件
假设您有一个网关连接到 Transformer.The 转换器启动一个线程,在该线程中解析一些数据并在完成时将其发送到下一个端点。
现在,Gateway 客户端需要知道它通过通道发送的请求的状态(因为 Gateway 对 Transformer 或其实现一无所知,所以它们不应该共享任何内容)。 Transformer 只有 1 个入站通道和 1 个输出通道,无法通过第三个通道发布结果,如何实现?本质上,问题是,如何在不耦合端点或破坏集成模式架构的情况下共享事件?
P.D.:请避免没有干净的答案,例如静态共享 objects,谢谢。
M-m-m。你的担心有点不清楚。
当你之前有一个 ServiceLayer 的时候,我很确定很多特定操作的方法没有打扰你。所以,不确定为什么您在切换到消息架构时如此担心消息通道区分操作。
同时我猜@Cotroller
和GET
、POST
、DELETE
等@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
可以将收到的消息分发给多个收件人 - 当然是渠道。
我目前正在使用 Spring 集成框架开发一个简单的 Spring 网络应用程序。我已经阅读了有关企业集成模式、目的、好处的信息……我已经摆脱了 ServiceLayer 并将应用程序工作流委托给了集成框架。但是我遇到了一些卡住的设计问题,我希望在设计方面有所了解。下面我将尝试解释它们,在此先感谢。
1.使用 Spring 集成框架
的 CRUD 操作假设您有 2 个端点通过直接通道连接,1 个端点接收请求,另一个处理这些请求。我不想从实现的角度来谈,而是从设计的角度来谈(正如我之前所说的),但为了澄清这一点,想象一下,您将接收端点实现为连接到网关的 RestController,将另一个端点实现为连接到数据库适配器的 ServiceActivator。 现在,用户可以请求 4 个基本操作,创建、读取、更新和删除(基本 CRUD)。由于接收方端点只能执行一个方法(handleMessage 方法),那么将 4 个操作复用的正确方法是什么?
- 在邮件中添加某种标签header?这对我来说似乎很难看,而且接收方端点必须实现一个 if-else 块。将控制器连接到接口并调用方法并摆脱 spring 集成会更容易。
- 创建 4 个 ServiceActivator 连接到同一个数据库?我也不喜欢,想象一下如果你有 30 个操作而不是 4 个。
- 我还没有找到其他解决方案吗?例如,通过不同的通道发送每个操作,这样您就有 4 个通道。您可以从网关的角度执行此操作,但问题是 ServiceActivator 只能有 1 个入站通道。
2。使用 Spring Integration Framework
在端点之间共享事件假设您有一个网关连接到 Transformer.The 转换器启动一个线程,在该线程中解析一些数据并在完成时将其发送到下一个端点。 现在,Gateway 客户端需要知道它通过通道发送的请求的状态(因为 Gateway 对 Transformer 或其实现一无所知,所以它们不应该共享任何内容)。 Transformer 只有 1 个入站通道和 1 个输出通道,无法通过第三个通道发布结果,如何实现?本质上,问题是,如何在不耦合端点或破坏集成模式架构的情况下共享事件? P.D.:请避免没有干净的答案,例如静态共享 objects,谢谢。
M-m-m。你的担心有点不清楚。
当你之前有一个 ServiceLayer 的时候,我很确定很多特定操作的方法没有打扰你。所以,不确定为什么您在切换到消息架构时如此担心消息通道区分操作。
同时我猜@Cotroller
和GET
、POST
、DELETE
等@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
可以将收到的消息分发给多个收件人 - 当然是渠道。