Удаление встроенного заголовка в динамически генерируемых местах назначения

Я хотел отключить встроенный заголовок в сообщении при использовании динамически сгенерированного места назначения, как в примере, приведенном здесь (скажем, output themes = dyntopic1,dyntopic2,...).

Я установил свойства, как показано ниже, но я все еще получаю заголовок, есть предложения, если я что-то пропустил?

spring.cloud.stream.bindings.output.group=test-ogroup
spring.cloud.stream.bindings.output.binder=kafka
spring.cloud.stream.bindings.output.producer.headerMode=raw
spring.cloud.stream.bindings.output.content-type=text/plain

Кафка = v0.10

spring-cloud-dependencies.version = Edgware.M1

1 ответ

Решение

Настройка свойств производителя для динамических назначений недоступна в Spring Cloud Stream 1.3 или ниже.

Если вы знаете свойства заранее, вы можете установить их в свойствах...

spring.cloud.stream.bindings.dyntopic1.producer.headerMode=raw

Эта функция была добавлена ​​в мастер и будет доступна в версии 2.0.

РЕДАКТИРОВАТЬ

Это можно сделать с помощью Edgware, если вы не против использования отражения для сброса флага. Вы должны заменить bean-компонент распознавателя каналов.

Я проверил это с Edgware.SR1 - вам действительно не следует больше использовать M1, это было предварительным этапом.

Я не могу гарантировать, что это будет работать с более новыми версиями, потому что это портит внутреннюю структуру фреймворка.

@SpringBootApplication
@EnableBinding(Sink.class)
public class So48543143Application {

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

    @Bean
    public ApplicationRunner runner(MessageChannel routeChannel) {
        return args -> {
            routeChannel.send(new GenericMessage<>("foo"));
        };
    }

    @ServiceActivator(inputChannel = "routeChannel")
    @Bean
    public AbstractMappingMessageRouter router(MyBinderAwareChannelResolver resolver) {
        ExpressionEvaluatingRouter router = new ExpressionEvaluatingRouter(new LiteralExpression("foo"));
        router.setDefaultOutputChannelName("default");
        router.setChannelResolver(resolver);
        return router;
    }

    @Bean
    public MyBinderAwareChannelResolver binderAwareChannelResolver(BindingService bindingService,
            AbstractBindingTargetFactory<? extends MessageChannel> bindingTargetFactory,
            DynamicDestinationsBindable dynamicDestinationsBindable) {
        return new MyBinderAwareChannelResolver(bindingService, bindingTargetFactory, dynamicDestinationsBindable);
    }

    public static class MyBinderAwareChannelResolver extends BinderAwareChannelResolver {

        public MyBinderAwareChannelResolver(BindingService bindingService,
                AbstractBindingTargetFactory<? extends MessageChannel> bindingTargetFactory,
                DynamicDestinationsBindable dynamicDestinationsBindable) {
            super(bindingService, bindingTargetFactory, dynamicDestinationsBindable);
        }

        @Override
        public MessageChannel resolveDestination(String channelName) {
            MessageChannel channel = super.resolveDestination(channelName);
            DirectFieldAccessor dfa = new DirectFieldAccessor(channel);
            AbstractDispatcher dispatcher = (AbstractDispatcher) dfa.getPropertyValue("dispatcher");
            dfa = new DirectFieldAccessor(dispatcher);
            @SuppressWarnings("unchecked")
            Set<MessageHandler> handlers = (Set<MessageHandler>) dfa.getPropertyValue("handlers");
            // there should be exactly one handler
            MessageHandler handler = handlers.iterator().next();
            dfa = new DirectFieldAccessor(handler);
            dfa.setPropertyValue("embedHeaders", false);
            return channel;
        }

    }

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