Saya ingin memastikan pesan mencapai antrian. Kalau tidak, saya ingin pengecualian.

Saya telah mencoba pengembalian penerbit, tetapi bukan itu yang saya butuhkan, karena itu ada di utas yang berbeda dan saya pikir akan sulit untuk menunggunya di utas yang mengirim pesan.

Tanpa saluran yang ditransaksikan, metode convertAndSend berhasil kembali ketika pertukaran tidak ada di sana, dengan saluran yang ditransaksikan sekarang ia melempar pengecualian.

Yang saya butuhkan adalah sama ketika tidak ada rute berdasarkan kunci perutean.

@SpringBootApplication
public class DemoApplication {

    private static final Logger log = Logger.getGlobal();

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

    @Bean
    RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> log.info(replyCode + "," + replyText));
        rabbitTemplate.setChannelTransacted(true);
        rabbitTemplate.setMandatory(true);
        return rabbitTemplate;
    }

    @Bean
    CommandLineRunner commandLineRunner(RabbitTemplate rabbitTemplate) {
        return args -> {
            rabbitTemplate.convertAndSend("exchangeName", "routingKey", "message");
            log.info("Send is done.");
        };
    }
}

Satu-satunya properti: spring.rabbitmq.publisher-returns=true

Versi boot musim semi: 2.1.7.RELEASE

Aktual:

tidak ada pertukaran -> convertAndSend melempar pengecualian

tidak ada rute di bursa -> metode pengembalian

Diharapkan:

tidak ada pertukaran -> convertAndSend melempar pengecualian

tidak ada rute di bursa -> convertAndSend melempar pengecualian

3
Bence Németh 12 Agustus 2019, 18:37

1 menjawab

Jawaban Terbaik

Anda perlu menggunakan konfirmasi penerbit dan data korelasi:

spring.rabbitmq.publisher-returns=true
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.template.mandatory=true
@SpringBootApplication
public class So57464212Application {

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


    @Bean
    public ApplicationRunner runner(RabbitTemplate template) {
        template.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
            System.err.println("Returned: " + replyText);
        });
        template.setConfirmCallback((correlationData, ack, cause) -> {
            System.err.println("ack:" + ack);
        });
        return args -> {
            CorrelationData correlationData = new CorrelationData("foo");
            template.convertAndSend("", "NOQUEUE", "bar", correlationData);
            correlationData.getFuture().get(10, TimeUnit.SECONDS);
            if (correlationData.getReturnedMessage() != null) {
                throw new RuntimeException("Message was returned");
            }
        };
    }

}
1
Gary Russell 12 Agustus 2019, 15:55