Spring integration 警告id为的JdbcChannelMessageStore消息未被删除
我有一个由JdbcChannelMessageStore支持的队列通道。我有两个此应用程序的实例,在高并发情况下,我有以下警告:Spring integration 警告id为的JdbcChannelMessageStore消息未被删除,spring-integration,Spring Integration,我有一个由JdbcChannelMessageStore支持的队列通道。我有两个此应用程序的实例,在高并发情况下,我有以下警告: 2020-03-13 19:25:38,209 task-scheduler-5 WARN JdbcChannelMessageStore:652 - Message with id '06b73eab-727a-780f-d0fa-1b0e0dd1ea20' was not deleted. 有没有办法去除它们 据我所知,信息被读了两遍,对吗 我使用的是SI 4
2020-03-13 19:25:38,209 task-scheduler-5 WARN JdbcChannelMessageStore:652 - Message with id '06b73eab-727a-780f-d0fa-1b0e0dd1ea20' was not deleted.
有没有办法去除它们
据我所知,信息被读了两遍,对吗
我使用的是SI 4.3.19.0版本。这是我的春水
<int:channel id="channel">
<int:queue message-store="messageStoreBean"/>
</int:channel>
<int:header-value-router input-channel="channel
header-name="name" >
<int:poller max-messages-per-poll="2" fixed-rate="500" >
<int:transactional />
</int:poller>
...
</int:header-value-router>
<bean id="storeQueryProviderBean" class="org.springframework.integration.jdbc.store.channel.PostgresChannelMessageStoreQueryProvider" />
<bean id="messageStoreBean" class="org.springframework.integration.jdbc.store.JdbcChannelMessageStore">
<property name="dataSource" ref="messageStoreDataSource" />
<property name="channelMessageStoreQueryProvider" ref="storeQueryProviderBean" />
<property name="region" value="region" />
</bean>
看来PostgreSQL不保证事务的独占读取,更新的限制为1
无论如何,警告只是一个提示,其他进程已删除该消息。如果其他过程与轮询器类似,则不会复制任何内容:
public Message<?> pollMessageFromGroup(Object groupId) {
final String key = getKey(groupId);
final Message<?> polledMessage = this.doPollForMessage(key);
if (polledMessage != null) {
if (!this.doRemoveMessageFromGroup(groupId, polledMessage)) {
return null;
}
}
return polledMessage;
}
公共消息pollMessageFromGroup(对象组ID){
最终字符串键=getKey(groupId);
final Message polledMessage=this.dopollFormMessage(键);
if(polledMessage!=null){
如果(!this.doRemoveMessageFromGroup(groupId,polledMessage)){
返回null;
}
}
返回轮询消息;
}
您可以看到,如果消息未被删除,我们将返回null
,因此此时无需轮询任何内容
您可以关闭org.springframework.integration.jdbc.store.JdbcChannelMessageStore的警告级别,以避免在日志配置中将类别级别指定为ERROR
。看来,PostgreSQL不保证事务的独占读取,更新的限制为1
无论如何,警告只是一个提示,其他进程已删除该消息。如果其他过程与轮询器类似,则不会复制任何内容:
public Message<?> pollMessageFromGroup(Object groupId) {
final String key = getKey(groupId);
final Message<?> polledMessage = this.doPollForMessage(key);
if (polledMessage != null) {
if (!this.doRemoveMessageFromGroup(groupId, polledMessage)) {
return null;
}
}
return polledMessage;
}
公共消息pollMessageFromGroup(对象组ID){
最终字符串键=getKey(groupId);
final Message polledMessage=this.dopollFormMessage(键);
if(polledMessage!=null){
如果(!this.doRemoveMessageFromGroup(groupId,polledMessage)){
返回null;
}
}
返回轮询消息;
}
您可以看到,如果消息未被删除,我们将返回null
,因此此时无需轮询任何内容
您可以关闭org.springframework.integration.jdbc.store.jdbchannelmessagestore的警告级别,以避免在日志配置中将类别级别指定为ERROR
。谢谢!还有一个问题,是否需要池中的事务标记,或者可以避免?是的,请保留它。该调用中有两个sql表达式,因此最好将其包装到TX中。还要确保使用正确的TX管理器:JTA或DataSourceI添加了TX管理器并删除了事务标记,警告消失。有可能就是这样吗?拜托,如果你能让我看看这里的灯光,我会很感激的。不过我希望相反。如何添加税务经理?这在哪里适用?那你在哪里?对不起,我弄错了!我添加了tx经理,工作正常。我用两个实例进行了测试。一个带有tx manager+事务标记,另一个为原始标记。在第一种情况下,没有警告,在第二种情况下,会出现警告。稍后,将使用两个带有tx manager+事务标记的实例,并且不再出现警告。谢谢所有的阿泰姆!谢谢你,阿泰姆!还有一个问题,是否需要池中的事务标记,或者可以避免?是的,请保留它。该调用中有两个sql表达式,因此最好将其包装到TX中。还要确保使用正确的TX管理器:JTA或DataSourceI添加了TX管理器并删除了事务标记,警告消失。有可能就是这样吗?拜托,如果你能让我看看这里的灯光,我会很感激的。不过我希望相反。如何添加税务经理?这在哪里适用?那你在哪里?对不起,我弄错了!我添加了tx经理,工作正常。我用两个实例进行了测试。一个带有tx manager+事务标记,另一个为原始标记。在第一种情况下,没有警告,在第二种情况下,会出现警告。稍后,将使用两个带有tx manager+事务标记的实例,并且不再出现警告。谢谢所有的阿泰姆!