Spring 集成 - Java DSL 中的服务激活器

Spring Integration - Service Activator in Java DSL

我在一个简单的 POJO 中配置了一个服务激活器,我想将它转换成 Java DSL。

现在,我的 Java DSL 看起来像这样,

public IntegrationFlow inputFlow() {
    return IntegrationFlows.from(inputChannel())
            .log(LoggingHandler.Level.DEBUG, "com.dash.messages")
            .transform(Transformers.fromJson(MessageWrapper.class, customObjectMapper()))
            .channel(theOtherChannel()))
            .get();
  }

里面有一个带有服务激活器的 POJO,

public class MessageProcessor {

  private static final Logger logger = LoggerFactory.getLogger(MessageProcessor.class);

  ....

  @ServiceActivator
  public void handle(MessageWrapper message, @Headers Map<String, Object> headers) {
    logger.debug("Message received: " + message);
    
    // Send message to another system
    ....
  }

}

在XML中对应的配置如下图,

<int:service-activator input-channel="theOtherChannel"
        ref="MessageProcessor" output-channel="nullChannel" />
  1. 如何在 Java DSL 中调用 ServiceActivator 方法?我正在考虑使用 .handle(),但参数应该是什么?
  2. 使用Java DSL 时是否有null 频道的概念?如果是,我们如何指定它?

这个这个 handle() 变体:

/**
 * Populate a {@link ServiceActivatingHandler} for the
 * {@link org.springframework.integration.handler.MethodInvokingMessageProcessor}
 * to invoke the discovered {@code method} for provided {@code service} at runtime.
 * @param service the service object to use.
 * @return the current {@link BaseIntegrationFlowDefinition}.
 */
public B handle(Object service) {

因此,您只需将 MessageProcessor 自动装配到具有 IntegrationFlow 定义的 class 或直接连接到 inputFlow() bean 定义。那么你就这样做:

.channel(theOtherChannel()))
.handle(messageProcessor)
.get();

nullChannel 中不需要 void return 类型的服务激活器。当遇到 voidnull 回复时,流程无论如何都会在那个点停止。

在文档中查看更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/dsl.html#java-dsl-handle