Camel -使用哪个EIP:通过消息内容、Map、过滤和OAuth检索配置,然后发送,仅重试发送部分

kuuvgm7e  于 2022-11-29  发布在  Apache
关注(0)|答案(1)|浏览(106)

我是Camel的新手,我的用例如下:

  • 我们从AMQ接收消息,我们希望重新Map此消息,并将此消息发送到客户的不同端点
  • 每个客户都有包含哪些字段的配置,以及OAuth的URL+发送消息的URL(REST API)+凭据
  • 客户在代理下分组,一个代理可以控制多个客户。我们在Map中有配置,以“agentId”作为关键字,以“customerConfigs”列表作为值。
  • 通过消息中的一个字段,我们决定该消息应发送到哪个代理
  • 然后,我们迭代该代理下的所有客户,检查每个客户需要哪些字段,并相应地重新Map消息
  • 我们还通过检查邮件内容是否符合客户的标准来进行过滤。如果符合,我们将根据该客户的OAuth URL进行OAuth,并将邮件发送给他们。如果不符合,则跳过。

我们正在用Camel做这个,到目前为止,从接收到Map和检索配置等所有步骤都在一个bean.(.bean(GeneralBean.class))中定义。
但是现在,我们希望对客户端点进行重试,我决定将这些步骤分成几个Camel步骤,因为我不想像现在这样重试整个接收/重新Map/检索配置。我只想重试最后一个步骤,即发送。
现在问题来了:我应该使用哪个Camel组件?
1.我觉得recipient list不错,但不确定怎么样。也许“动态路由器”更好?
1.在定义步骤时,当我检索每个客户的配置时,交换主体中的一个对象(我们称之为RemappedMessage)变成了两个(RemappedMessageCustomerConfig的列表)。它们具有一对多的关系。我如何将这两个对象传递到下一个bean?或者我应该在一个bean中一起处理它们?在Exchange中?在@ExchangeProperties Map<String, Object> properties中?后者可以,但是IMO不是很 Camel 。或者定义一个元组类来组合它们?我用了很多,但是觉得很难看。
1.我不认为在Camel中有一些语法来获取Exchange中对象的一些属性,并将其作为url和基本凭据用户名和密码放入to()中?
总的来说,我想在Camel流水线中把这个过程分成几个步骤,但是不确定如何处理“一个对象分裂成多个对象并且它们需要齐头并进地向下游移动”的问题。
我用的不是Spring,而是Quarkus。
现在,我同:

from("activemq:queue:" + appConfig.getQueueName())
                .bean(IncomingMessageConverter.class) // use class form so that Camel will cache the bean
                .bean(UserIdValidator.class) // validate and if wrong, end route here
                .bean(CustomerConfigRetrieverBean.class) // retrieve config of customer, by agent id. How to pass down both??
                .bean(EndpointFieldsTailor.class) // remove fields if this customer is not interested. Needs CustomerConfig
                .recipientList(xxxxxx) // how?
                // what's next?

因为RemappedMessage是步骤.bean(IncomingMessageConverter.class)的返回类型,所以Camel可以将参数绑定到它,这样我就可以访问Map的消息。

qgzx9mmu

qgzx9mmu1#

当您要将同一邮件发送到多个端点,并且在进入收件人列表之前就知道这些端点是什么时,收件人列表是理想的选择。
动态路由器可以将消息路由到多个端点,在输入路由器时不一定知道这些端点的列表和顺序。由于您有一对多的情况,动态路由器可能更适合。
一个更简单的方法可能是准备一个元组列表。每个元组将包含一个CustomerConfig和一个RemappedMessage。然后您将split列表并在拆分器中将消息发送到代理。对于元组,您可以使用类似ImmutablePairMap或两个元素List的内容。
至于设置url和用户名/密码,我假设您使用的是Camel的HTTP组件。最好将这些值作为头提供,因为http组件允许这样做。URL可以用CamelHttpUri头来设置。HTTP组件通常将消息头作为HTTP头来传递,因此您可以通过设置同名的消息头来设置Authorization头之类的内容。
而且,它还明确支持从交换和消息中的值设置头。

// assumes the body is a List in which the first element is a CustomerConfig
.setHeader("Authorization", simple("${body[0].authValue}"))

实际上,您可能需要做更多的授权工作。例如,如果是基本的auth,您需要计算您想要使用的值。我会在头或属性中设置该值,然后引用它,如下所示:

.setHeader("Authorization", simple("${header.basicAuthValue}"))
// or
.setHeader("Authorization", simple("${exchangeProperty.basicAuthValue}"))

相关问题