2016-06-17 1 views
1

Я пытался остановить SqsMessageDrivenChannelAdapter при вызове stop() я получаю следующее сообщение об ошибке:весна-интегрально-AWS: 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 как нить может остановиться. Я сделал что-то не так, или это проблема?

ответ

0

M-m-m. Похож на тупик в вашем коде.

Вы пытаетесь остановить адаптер (и, следовательно, слушатель) из нити, которая удерживается слушателем.

В ваших сроках stopping thread == running thread.

Чтобы избежать такой проблемы, вам определенно необходимо переключить операцию stop на другую тему.

Смежные вопросы