当前位置: 首页 > 面试题库 >

我应该如何在Spring Integration中构建我的消息?

罗源
2023-03-14
问题内容

我有一个我编码的应用程序,我正在对其进行重构以更好地利用Spring Integration。该应用程序处理文件的内容。

问题(如我所见)是我当前的实现通过FilesMessages,而不是Spring Integration
Messages

为了避免进一步滚动我自己的代码(以后必须维护),我想知道在Spring
Integration中是否存在用于构造Messages的推荐结构。我想知道的是,是否建议将某些建议channel与类似的东西结合MessageBuilder使用。

流程/代码(最终)

我还没有配置它的代码,但是我想用以下组件/过程结束:

  1. 接收文件,删除文件的页眉和页脚,每行并将其转换为Message<String> (似乎实际上是一个Splitter,然后发送至…
  2. 通道/端点向路由器发送消息
  3. 路由器在有效负载中检测格式字符串,并路由到类似于此处的订购路由器的适当通道…
  4. 然后,选定的通道将构建适当类型的消息,特别是键入的消息。例如,我有以下构建器来构建消息…

公共类ShippedBoxMessageBuilder实现CustomMessageBuilder {

@Override public Message buildMessage(String input){ShippedBox
transportationBox
=(ShippedBox)ShippedBoxFactory.manufactureShippedFile(input);
返回MessageBuilder.withPayload(shippedBox).build(); } …

  1. 消息按类型路由到适当的处理通道

我想要的解决方案似乎确实使它复杂化了。但是,我有目的地分离了两个任务:1)将文件分成多行,Messages<String>以及2)转换Messages<String>Messages<someType>。因此,我认为第二个任务需要一个额外的路由器/消息生成器。


问题答案:

实际上,MessageBuilderSpring
Integration中有支持。

这种框架的一般目的是帮助后端开发人员将其域代码与消息传递基础结构分离。最后,要使用Spring Integration,您需要遵循POJO和方法调用原则。

您编写自己的服务,转换器和域模型。然后,您只需使用一些开箱即用的组件(例如<int-file:inbound-channel- adapter>),然后从那里引用您的POJO,反之则不然。

我建议您阅读《Spring Integration in
Action》一书,以获取更多有关此问题的图片。

您能解释一下直接处理Spring Integration组件的原因吗?

更新

1)将文件分成多行消息

<splitter>是给你的。您应该编写一些POJO来返回List<String>-文件中没有标题和页脚的行。如何从中读取行File不是Spring
Integration的任务。特别是,如果“行”是逻辑的,则不是实际的文件行。

2)将消息转换为消息

再过一次:没有理由建立Message对象。这足以payload在某些转换器(再次为POJO)中构建新内容并将其框架包装到要发送的消息中。

Payload Type Router不言而喻:它检查有效载荷类型,而不检查消息类型。当然,payload也可以是Message,甚至任何标头也可以。

无论如何,您的Builder快照最后都会精确显示纯Spring Integration
Message的创建。就像我说的:仅将一个有效负载转换为另一个有效负载并从某个POJO中返回它就足够了,您可以将其用作转换器参考。



 类似资料:
  • 我对Hibernate(JPA)很陌生。 正如您所看到的,当Gradle升级到5.0时,这个变通方法将会失败。 所以,我想问你我应该如何用Hibernate和Gradle构建我的代码。 根据一些SO的QA,我试图添加以下依赖项,但它不起作用。 null 错误输出如下所示(位a很长,但我不确定要解决的重要线索在哪里):

  • 我应该在中具体放入什么? 我找不到这方面的指导。

  • 问题内容: 我不太清楚当我这样说时会做什么: 我可以稍微了解使用它的原因,因为它不浏览整个数据库表以更新字段,而是仅更新新添加的记录。如我错了请纠正我。 所以我想做的是使用这样创建索引: 一旦执行此操作,文档就根本不会上传到索引。我要去哪里错了? 任何帮助,不胜感激。 问题答案: 如果您的表中有一个时间戳列(例如),则最好使用它代替ID号。这样,当记录更新时,您也可以修改该时间戳,输入插件将提取记

  • 问题内容: 在Objective- C中,我调用该方法来记录异常。如何在Swift中调用它? 问题答案: 使用Swift 2,您可以将Swift函数和闭包作为C函数指针传递 原始答案 从Xcode 6 beta 6开始,您不能这样做。 Swift确实支持传递函数指针,但是它们几乎就像不透明指针一样被对待。您既不能定义指向Swift函数的C函数指针,也不能在Swift中调用C函数指针。 这意味着您从

  • 问题内容: 这个问题在很多地方都被问到,变化不尽。例如Java-getClassLoader()。getResource()不仅使我烦恼不已。)我仍然无法使其正常工作。 这是一个代码片段: 此作品-请注意,我硬编码的路径,包含剪辑文件,该文件的目录 是 有,而且 是 在同一目录作为我的.class文件。las,注释掉的代码仅返回url的空值。 其他大多数帖子似乎都涉及getResourceAsSt

  • 我有一个开发数据库,我想在docker映像中提交该数据库,将其推送到一个私有存储库,并在本地开发和CI构建中使用。 数据库保存为SQL备份,通过将备份文件映射到官方映像的目录,它将在第一次运行容器时执行此备份文件。发生这种情况时,MariaDB会将数据库还原到容器内中的数据文件中。 理论上,我可以停止容器,将其提交给一个新图像,推动它,然后我就完成了。然而,MariaDB的Dockerfile声明