我试图找到类似的问题,但找不到适合我问题的最佳解决方案。我在应用程序中使用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;
}
根据消息的类型,定位服务执行器并处理消息。对我们来说一切正常。
但是,在某些情况下,我们需要从队列中快速删除假脱机消息而不消耗它们。我在这里提到的当前设置中,有什么方法可以做到这一点。
我通过队列浏览器尝试过,但是那里没有这样的选项
答案 0 :(得分:0)
JMS本身没有定义“不消耗消息就清除队列”的方法。这种类型的操作留给提供者特定的admin API。最好的选择是将它们与JMS一起使用,而不必对其进行处理。
我认为Solace SEMP Admin API定义了对象的删除,但没有快速清除。也许re-creating队列可以工作,但是不会很漂亮。