2016-06-17 49 views
1

我試圖阻止SqsMessageDrivenChannelAdapter調用stop()當我收到以下錯誤:彈簧集成-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) 

首先適應症我認爲這是超時時間不夠長,查看問題後,我發現停止線程和正在運行的線程正在等待對方,並且總是會發生。

new Thread() { 
    public void run() 
    { 
     sqsMessageRawDataChannelAdapter.stop(); 
     LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(5)); 
    } 
    }.start(); 

我現在已經不再得到TimeoutException作爲線程能夠停止:我通過後續的代碼解決了這個問題。我做錯了什麼,或者這是一個問題?

回答

0

M-m-m。看起來像你的代碼中的一個死鎖。

您嘗試從偵聽器保持的線程停止適配器(並因此偵聽器)。

在您的條款stopping thread == running thread

爲避免出現這樣的問題,您絕對應該將stop操作轉換爲不同的線程。