spring-integration-aws: SqsMessageDrivenChannelAdapter 线程在调用 stop() 时相互等待
spring-integration-aws: SqsMessageDrivenChannelAdapter threads waiting for each other when calling stop()
我在调用 stop()
时试图停止 SqsMessageDrivenChannelAdapter
我收到以下错误:
java.util.concurrent.TimeoutException: null
at java.util.concurrent.FutureTask.get(FutureTask.java:205)
at org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer.stop(SimpleMessageListenerContainer.java:197)
at org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer.doStop(SimpleMessageListenerContainer.java:133)
at org.springframework.cloud.aws.messaging.listener.AbstractMessageListenerContainer.stop(AbstractMessageListenerContainer.java:329)
at org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer.stop(SimpleMessageListenerContainer.java:1)
at org.springframework.integration.aws.inbound.SqsMessageDrivenChannelAdapter.doStop(SqsMessageDrivenChannelAdapter.java:140)
at org.springframework.integration.endpoint.AbstractEndpoint.stop(AbstractEndpoint.java:111)
我认为超时时间不够长的第一个迹象,在调查问题后我发现停止线程和 运行 线程正在等待彼此,TimeoutException
会总是发生。我通过以下代码解决了这个问题:
new Thread() {
public void run()
{
sqsMessageRawDataChannelAdapter.stop();
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(5));
}
}.start();
我现在不再得到 TimeoutException
,因为线程可以停止。是我做错了什么,还是这是个问题?
嗯嗯嗯。看起来你的代码中出现了死锁。
您尝试从侦听器持有的线程中停止适配器(并因此停止侦听器)。
用你的话说stopping thread == running thread
。
为避免此类问题,您绝对应该将 stop
操作转移到不同的线程。
我在调用 stop()
时试图停止 SqsMessageDrivenChannelAdapter
我收到以下错误:
java.util.concurrent.TimeoutException: null
at java.util.concurrent.FutureTask.get(FutureTask.java:205)
at org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer.stop(SimpleMessageListenerContainer.java:197)
at org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer.doStop(SimpleMessageListenerContainer.java:133)
at org.springframework.cloud.aws.messaging.listener.AbstractMessageListenerContainer.stop(AbstractMessageListenerContainer.java:329)
at org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer.stop(SimpleMessageListenerContainer.java:1)
at org.springframework.integration.aws.inbound.SqsMessageDrivenChannelAdapter.doStop(SqsMessageDrivenChannelAdapter.java:140)
at org.springframework.integration.endpoint.AbstractEndpoint.stop(AbstractEndpoint.java:111)
我认为超时时间不够长的第一个迹象,在调查问题后我发现停止线程和 运行 线程正在等待彼此,TimeoutException
会总是发生。我通过以下代码解决了这个问题:
new Thread() {
public void run()
{
sqsMessageRawDataChannelAdapter.stop();
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(5));
}
}.start();
我现在不再得到 TimeoutException
,因为线程可以停止。是我做错了什么,还是这是个问题?
嗯嗯嗯。看起来你的代码中出现了死锁。
您尝试从侦听器持有的线程中停止适配器(并因此停止侦听器)。
用你的话说stopping thread == running thread
。
为避免此类问题,您绝对应该将 stop
操作转移到不同的线程。