Удаление встроенного заголовка в динамически генерируемых местах назначения
Я хотел отключить встроенный заголовок в сообщении при использовании динамически сгенерированного места назначения, как в примере, приведенном здесь (скажем, 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;
}
}
}