首页 > 解决方案 > 如何在不消耗消息的情况下清除安慰队列?

问题描述

我尝试找到类似的问题,但找不到解决问题的最佳方法。我在我的应用程序中使用 spring boot,并在我的代码中集成了慰藉队列。我可以使用以下代码从慰藉队列中读取消息:

@Configuration
public class JmsConfig {
    @Bean
    public ConnectionFactory connectionFactory() {
        return new PoolingConnectionFactoryBean();
    }
}

在 Spring Boot 的帮助下,从属性文件中获取所有属性(如 VPN)并创建 ConnectionFactory。下面是读取消息的代码:

@Configuration
public class QueueConfig {
    @Value("${destination.name}")
    private String destination;
    @Value("${destination.isPubSub:false}")
    private boolean pubSubDomain;
    @Value("${maxConsumers:1}")
    private int maxConsumers;
    @Value("${destination.autoStartup:true}")
    private boolean autoStartup;

    @Bean
    public IntegrationFlow queueFlow(ConnectionFactory jmsConnectionFactory, PlatformTransactionManager transactionManager) {
        return IntegrationFlows
                .from(Jms.messageDrivenChannelAdapter(jmsConnectionFactory).autoStartup(autoStartup)
                        .configureListenerContainer(
                                c -> c.transactionManager(transactionManager).pubSubDomain(pubSubDomain).maxConcurrentConsumers(maxConsumers))
                        .destination(destination))
                .transform(Transformers.fromJson(HashMap[].class)).log(LoggingHandler.Level.INFO, m -> MessageFormat
                        .format("Processing {0} {1} records...", ((Object[]) m.getPayload()).length, m.getHeaders().get("table")))
                .route(getTableRouter()).get();

    }

    private ExpressionEvaluatingRouter getTableRouter() {
        ExpressionEvaluatingRouter router = new ExpressionEvaluatingRouter("headers['table']");
        router.setResolutionRequired(false);
        router.setDefaultOutputChannel(new NullChannel());
        return router;
    }

根据消息的类型,定位服务执行器并处理消息。它对我们来说完全正常。

但是,在某些情况下,我们需要快速从队列中删除假脱机消息而不消耗它们。在我在这里提到的当前设置中,我们有什么办法可以做到这一点。

我通过队列浏览器尝试过,但那里没有这样的选项

标签: spring-bootjms

解决方案


JMS 本身没有定义“清除队列而不消耗消息”的方法。这种类型的操作留给提供商特定的管理 API。最好的办法是使用 JMS 使用它们,而不是处理它们。

我认为Solace SEMP Admin API定义了对象的删除,但没有快速清除。也许重新创建队列会起作用,但它不会很漂亮。


推荐阅读