Gostaria de saber qual é a melhor maneira de lidar com mensagens com valores de chave de roteamento desconhecidos / inválidos dentro de uma troca? No meu caso, estou enviando todas as minhas mensagens dentro da mesma central e com base em uma chave de roteamento, as mensagens são encaminhadas para a fila correspondente. Esta é minha configuração (estou usando Spring Cloud Stream):
spring.cloud.stream.bindings.output.destination: my-exchange
spring.cloud.stream.bindings.output.producer.routingKeyExpression: payload.type
spring.cloud.stream.bindings.input-type1.destination: my-exchange # Exchange
spring.cloud.stream.bindings.input-type1.group: input.type1 # Queue 1
spring.cloud.stream.bindings.input-type2.destination: my-exchange # Exchange
spring.cloud.stream.bindings.input-type2.group: input.type2 # Queue 2
spring.cloud.stream.rabbit.bindings.input-type1.consumer.bindingRoutingKey: FOO
spring.cloud.stream.rabbit.bindings.input-type2.consumer.bindingRoutingKey: BAR
Agora o que estou perguntando é o que acontece se eu enviar uma mensagem com payload.type='ANY'
? Obviamente, essa mensagem não será recuperada por nenhum consumidor e ficará dentro da central, mas qual a melhor forma de rastrear essas mensagens "desconhecidas"? Posso usar um DLQ para isso?
Obrigado!
permanecerá dentro da bolsa,
Não; as trocas não "retêm" mensagens, são simplesmente roteadores.
Mensagens que não podem ser roteadas são descartadas por padrão.
Você pode configurar a ligação para retornar mensagens que não podem ser roteadas.
Consulte Canais de erro .
Os retornos são assíncronos.
Na próxima versão 3.1, você pode esperar em um futuro para determinar se a mensagem foi enviada com sucesso ou não. Consulte as confirmações do editor .
Se a mensagem não puder ser roteada, a returnedMessage
propriedade dos dados de correlação será definida.
A estrutura usa o mandatory
recurso mencionado em outra resposta.
EDITAR
Aqui está um exemplo:
spring.rabbitmq.publisher-returns: true
spring.cloud.stream.bindings.output.destination: my-exchange
spring.cloud.stream.rabbit.bindings.output.producer.routing-key-expression: headers['rk']
spring.cloud.stream.bindings.output.producer.error-channel-enabled: true
@SpringBootApplication
@EnableBinding(Source.class)
public class So65134452Application {
public static void main(String[] args) {
SpringApplication.run(So65134452Application.class, args);
}
@Bean
public ApplicationRunner runner(MessageChannel output) {
return args -> {
output.send(MessageBuilder.withPayload("foo")
.setHeader("rk", "invalid")
.build());
};
}
@Autowired
RabbitTemplate template;
@Bean
public Queue unroutable() {
return new Queue("unroutable.messages");
}
@ServiceActivator(inputChannel = "errorChannel")
public void error(Message<?> error) {
if (error.getPayload() instanceof ReturnedAmqpMessageException) {
this.template.send(unroutable().getName(),
((ReturnedAmqpMessageException) error.getPayload()).getAmqpMessage());
}
}
}
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras