10.2.3 转换器

转换器对消息执行一些操作,通常会产生不同的消息,并且可能会产生不同的负载类型(如图 10.4)。转换可以是一些简单的事情,例如对数字执行数学运算或操作 String 字符串值;转换也会很复杂,例如使用表示 ISBN 的 String 字符串值来查找并返回相应书籍的详细信息。

图 10.4 转换器在消息流经集成流时对其进行变形。

例如,假设正在一个名为 numberChannel 的通道上发布整数值,并且希望将这些数字转换为包含等效罗马数字的 String 字符串。在这种情况下,可以声明一个 GenericTransformer 类型的 bean,并添加 @Transformer 注解,如下所示:

@Bean
@Transformer(inputChannel="numberChannel",
      outputChannel="romanNumberChannel")
public GenericTransformer<Integer, String> romanNumTransformer() {
  return RomanNumbers::toRoman;
}

通过 @Transformer 注解将 bean 指定为 transformer bean,它从名为 numberChannel 的通道接收整数值,并使用 toRoman()toRoman() 方法是在一个名为 RomanNumbers 的类中静态定义的,并在这里通过方法引用进行引)的静态方法进行转换,得到的结果被发布到名为 romanNumberChannel 的通道中。

在 Java DSL 配置风格中,调用 transform() 甚至更简单,将方法引用传递给 toRoman() 方法即可:

@@Bean
public IntegrationFlow transformerFlow() {
  return IntegrationFlows
    ...
    .transform(RomanNumbers::toRoman)
    ...
    .get();
}

虽然在两个 transformer 代码示例中都使用了方法引用,但是要知道 transformer 也可以使用 lambda 表达式。或者,如果 transformer 比较复杂,需要单独的成为一个 Java 类,可以将它作为 bean 注入流配置,并将引用传递给 transform() 方法:

@Bean
public RomanNumberTransformer romanNumberTransformer() {
  return new RomanNumberTransformer();
}
@Bean
public IntegrationFlow transformerFlow(
          RomanNumberTransformer romanNumberTransformer) {
  return IntegrationFlows
    ...
    .transform(romanNumberTransformer)
    ...
    .get();
}

在这里,声明了一个 RomanNumberTransformer 类型的 bean,它本身是 Spring Integration 的 Transformer 或 GenericTransformer 接口的实现。bean 被注入到 transformerFlow() 方法,并在定义集成流时传递给 transform() 方法。

results matching ""

    No results matching ""