Преобразование прослушивания из синтаксиса XML в аннотацию Spring Integration Java или DSL

Я нашел так много разных способов преобразования моих регистраторов прослушиваний в конфигурацию Java, но ни один из них, похоже, не работает.

Вот моя версия XML:

<int:channel id="tasksRequestChannel">
    <int:queue capacity="${channel.queue.capacity}"/>
    <int:interceptors>
        <int:wire-tap channel="logRequestingTasks" />
    </int:interceptors>
</int:channel>

<int:logging-channel-adapter id="logRequestingTasks" level="INFO"
    expression="'Requesting tasks : ' + headers.#{T(com.application.infrastructure.CommonConstants).KEY_TASK_NAME} + ' of ID : ' + headers.#{T(com.application.infrastructure.CommonConstants).KEY_TASK_ID} " />

Канал действительно объединяется в пул, но я не понимаю, почему нет необходимости определять пулер для синтаксиса XML?

Вот моя попытка конвертировать его в Java (мой SpEL тоже не работает):

@Bean
public IntegrationFlow logRequestingTasks(@Qualifier("defaultPoller") PollerMetadata defaultPoller) {
    LoggingHandler loggingHandler = new LoggingHandler(LoggingHandler.Level.INFO.name());
    loggingHandler.setLogExpressionString("'Requesting tasks : ' + headers.#{T(com.application.infrastructure.CommonConstants).KEY_TASK_NAME} + ' of ID : ' + headers.#{T(com.application.infrastructure.CommonConstants).KEY_TASK_ID} ");
    loggingHandler.setLoggerName("logRequestingTasks");

    return IntegrationFlows.from("tasksRequestChannel")
             .handle(loggingHandler, e -> e.poller(defaultPoller))
             .get();
}

==========

Обновить:

Я попробовал ваше решение, @Gary, но у меня есть некоторые странные эффекты. Вот что я получил в своей консоли:

2018-08-21 13:22:50.347  INFO 7060 --- [ask-scheduler-3] T.RestTemplate                           : step=INIT;...
2018-08-21 13:22:50.564  INFO 7060 --- [ask-scheduler-3] T.RestTemplate                           : step=SUCCESS;...
2018-08-21 13:22:50.824  INFO 7060 --- [ask-scheduler-3] c.a.t.d.a.TasksSplitter            : No active task retrieved.
2018-08-21 13:23:20.343  INFO 7060 --- [ask-scheduler-9] logStartDmwProcess                       : Start of Application process.
2018-08-21 13:23:20.346  INFO 7060 --- [ask-scheduler-9] T.RestTemplate                           : step=INIT;...
2018-08-21 13:23:20.540  INFO 7060 --- [ask-scheduler-9] T.RestTemplate                           : step=SUCCESS;...
2018-08-21 13:23:20.555  INFO 7060 --- [ask-scheduler-9] c.a.t.d.a.TasksSplitter            : No active task retrieved.

Кажется, он регистрирует только один раз каждые x2 fixedRate на моем InboundChannelAdapter.

Вот мой регистратор и InboundChannelAdapter:

@Bean
public IntegrationFlow logStartProcess() {       
    Expression logExpression = new SpelExpressionParser().parseExpression("'Start of Application process.'");
    return IntegrationFlows.from("initTimestampChannel")
                .log(Level.INFO, "logStartProcess", logExpression)
                .get();
}

@RefreshScope
@Bean
@InboundChannelAdapter(value = "initTimestampChannel", poller = @Poller(fixedRate = "30000"))
public MessageSource<?> buildTasksRequest() {
    MethodInvokingMessageSource source = new MethodInvokingMessageSource();
    source.setObject(tasksService);
    source.setMethodName("requestAllTasks");
    return source;
}

1 ответ

Вы можете использовать .wiretap() метод или просто использовать .log() метод (который создает прослушку внутри).

@SpringBootApplication
public class So51939181Application {

    private static final Expression logExpression = new SpelExpressionParser().parseExpression(
            "'Requesting tasks : ' + headers." + CommonConstants.KEY_TASK_NAME
            + " + ' of ID : ' + headers." + CommonConstants.KEY_TASK_ID);

    @Bean
    public MessageChannel foo() {
        return new DirectChannel();
    }

    @Bean
    public IntegrationFlow flow() {
        return IntegrationFlows.from("foo")
                .log(logExpression)
                // .more stuff
                .handle(System.out::println)
                .get();
    }

    public static void main(String[] args) {
        SpringApplication.run(So51939181Application.class, args);
    }

    @Bean
    public ApplicationRunner runner(MessageChannel foo) {
        return args -> foo.send(MessageBuilder.withPayload("foo")
                .setHeader(CommonConstants.KEY_TASK_NAME, "name")
                .setHeader(CommonConstants.KEY_TASK_ID, "id")
                .build());
    }

}

Результат:

2018-08-20 20:19:44.777  INFO 4096 --- [           main] o.s.integration.handler.LoggingHandler   : Requesting tasks : aName of ID : anId
GenericMessage [payload=foo, headers={taskName=name, id=b21dde6e-bfa3-f727-52f0-056cb2775ee7, taskId=id, timestamp=1534810784776}]

Вы не можете использовать #{...} построить для SpEL здесь.

Другие вопросы по тегам