spring-boot - 如何在不消耗消息的情况下清除安慰队列?
问题描述
我尝试找到类似的问题,但找不到解决问题的最佳方法。我在我的应用程序中使用 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;
}
根据消息的类型,定位服务执行器并处理消息。它对我们来说完全正常。
但是,在某些情况下,我们需要快速从队列中删除假脱机消息而不消耗它们。在我在这里提到的当前设置中,我们有什么办法可以做到这一点。
我通过队列浏览器尝试过,但那里没有这样的选项
解决方案
JMS 本身没有定义“清除队列而不消耗消息”的方法。这种类型的操作留给提供商特定的管理 API。最好的办法是使用 JMS 使用它们,而不是处理它们。
我认为Solace SEMP Admin API定义了对象的删除,但没有快速清除。也许重新创建队列会起作用,但它不会很漂亮。
推荐阅读
- python - 我如何创建调用相互中断的函数的热键?
- java - 休息:如何处理数千个相同的请求
- node.js - Angular 源文件在浏览器中可见。如何隐藏?
- javascript - Slick Carousel - 在移动设备上幻灯片中的 5 个项目到 1 个项目
- python-3.x - 尝试获取占位符详细信息时如何访问幻灯片的形状元素?这是使用 Python PPTX 完成的
- javascript - 在 v-for 循环中访问元素的数据 (Vue.js)
- php - 为什么 Laravel 提供默认时间戳?
- django - Django Formset Validation - Formset 中的总和值
- r - 如何在 r 中创建一个新的键值对
- java - 为什么jar的父文件夹也出现在引用的库中?