我目前正在使用Spring集成框架开发一个简单的Spring Web应用程序。我已经阅读了有关企业集成模式,目的,好处的信息......我已经摆脱了ServiceLayer并将应用程序工作流委托给了集成框架。但是我遇到了一些我遇到困难的设计问题而且我会很欣赏设计方面的一些亮点。在下面我将尝试解释它们,提前谢谢。
1。使用Spring Integration Framework进行CRUD操作
假设您有2个端点通过直接通道连接,1个端点接收请求,另一个端点处理这些请求。我不想从实现角度谈谈,而是从设计(如前所述)谈谈,但为了澄清它,将实现接收端点的图像作为连接到网关的RestController而将另一个端点实现为ServiceActivator连接到数据库适配器。 现在,用户可以请求4个基本操作,创建,读取,更新和删除(基本CRUD)。由于接收端点可以只执行一个方法(handleMessage方法),多路复用4个操作的正确方法是什么?
2。使用Spring Integration Framework在端点之间共享事件
假设你有一个连接到Transformer的网关。变换器进入一个线程,在该线程中解析一些数据并在完成时将其发送到下一个端点。 现在,网关客户端需要知道它通过信道发送的请求的状态(因为网关对变压器或其实现一无所知,因此不应共享任何内容)。如何实现,因为变压器只有1个入站通道和1个输出通道,并且无法通过第三个通道发回结果?从本质上讲,问题是,如何在不耦合端点或破坏集成模式架构的情况下共享事件? P.D.:请不要使用静态共享对象等干净的答案,谢谢。
答案 0 :(得分:2)
M-M-M你的担忧不明确。
如果你之前有过ServiceLayer,我很确定很多特定操作的方法都不会打扰你。因此,当您切换到Messaging架构时,不确定为什么要担心消息通道区分操作。
同时我猜@Cotroller
与GET
,POST
,DELETE
等@RequestMapping
的方法不再与您有关。< / p>
在您的应用程序中面对MessageChannel
s端点之间的额外对象,这有点不方便。但与此同时,当您开始将应用程序视为一堆消息流时,这是一个奖励,其中每个消息流都与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
将收到的消息分发给多个收件人 - 当然是频道。