Преобразование прослушивания из синтаксиса 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 здесь.