spring-integration-aws:调用stop()时SqsMessageDrivenChannelAdapter线程互相等待

时间:2016-06-17 14:07:00

标签: spring spring-integration spring-cloud-aws

我在调用SqsMessageDrivenChannelAdapter时试图阻止stop()我收到以下错误:

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因为线程能够停止。我做错了什么,或者这是一个问题吗?

1 个答案:

答案 0 :(得分:0)

M-M-M看起来像是代码中的死锁。

您尝试从侦听器持有的线程停止适配器(以及侦听器)。

使用您的stopping thread == running thread条款。

为了避免这样的问题,你肯定应该将stop操作转移到不同的线程。