Spring Integration Doubts:CRUD操作和组件之间的共享事件

时间:2017-01-12 11:31:21

标签: java spring web-applications spring-integration integration

我目前正在使用Spring集成框架开发一个简单的Spring Web应用程序。我已经阅读了有关企业集成模式,目的,好处的信息......我已经摆脱了ServiceLayer并将应用程序工作流委托给了集成框架。但是我遇到了一些我遇到困难的设计问题而且我会很欣赏设计方面的一些亮点。在下面我将尝试解释它们,提前谢谢。

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

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

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

    假设你有一个连接到Transformer的网关。变换器进入一个线程,在该线程中解析一些数据并在完成时将其发送到下一个端点。 现在,网关客户端需要知道它通过信道发送的请求的状态(因为网关对变压器或其实现一无所知,因此不应共享任何内容)。如何实现,因为变压器只有1个入站通道和1个输出通道,并且无法通过第三个通道发回结果?从本质上讲,问题是,如何在不耦合端点或破坏集成模式架构的情况下共享事件? P.D.:请不要使用静态共享对象等干净的答案,谢谢。

1 个答案:

答案 0 :(得分:2)

M-M-M你的担忧不明确。

如果你之前有过ServiceLayer,我很确定很多特定操作的方法都不会打扰你。因此,当您切换到Messaging架构时,不确定为什么要担心消息通道区分操作。

同时我猜@CotrollerGETPOSTDELETE@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将收到的消息分发给多个收件人 - 当然是频道。