如何在不消耗消息的情况下清除慰问队列?

时间:2019-05-17 06:04:03

标签: spring-boot jms

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

@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;
    }

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

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

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

1 个答案:

答案 0 :(得分:0)

JMS本身没有定义“不消耗消息就清除队列”的方法。这种类型的操作留给提供者特定的admin API。最好的选择是将它们与JMS一起使用,而不必对其进行处理。

我认为Solace SEMP Admin API定义了对象的删除,但没有快速清除。也许re-creating队列可以工作,但是不会很漂亮。