Spring Integration: SimpleAsyncTaskExecutor - PullRequest
0 голосов
/ 14 марта 2019

Я читал еще одну проблему на этом сайте, как это, но я не понимаю, как решить проблему.

Spring Integration: Утечка приложений из потоков SimpleAsyncTaskExecutor?

Моя ошибка похожа на предыдущую ссылку

SimpleAsyncTaskExecutor-2327" - Thread t@2405
java.lang.Thread.State: WAITING
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for <7a224c1> (a java.util.concurrent.CountDownLatch$Sync)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
    at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)
    at org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel.receive(GenericMessagingTemplate.java:199)
    at org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel.receive(GenericMessagingTemplate.java:192)
    at org.springframework.messaging.core.GenericMessagingTemplate.doReceive(GenericMessagingTemplate.java:130)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSendAndReceive(GenericMessagingTemplate.java:157)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSendAndReceive(GenericMessagingTemplate.java:45)
    at org.springframework.messaging.core.AbstractMessagingTemplate.sendAndReceive(AbstractMessagingTemplate.java:42)
    at org.springframework.integration.core.MessagingTemplate.sendAndReceive(MessagingTemplate.java:97)
    at org.springframework.integration.core.MessagingTemplate.sendAndReceive(MessagingTemplate.java:38)
    at org.springframework.messaging.core.AbstractMessagingTemplate.convertSendAndReceive(AbstractMessagingTemplate.java:79)
    at org.springframework.messaging.core.AbstractMessagingTemplate.convertSendAndReceive(AbstractMessagingTemplate.java:70)
    at org.springframework.integration.gateway.MessagingGatewaySupport.doSendAndReceive(MessagingGatewaySupport.java:449)

Я использую

  • весна-интеграция-ява-DSL-1.2.3.RELEASE
  • весна-интегрально-ф-4.3.17.RELEASE
  • весна-интеграция-клиент-4.3.17.RELEASE

Мой сценарий следующий: я получаю сообщение через контроллер Api, и это сообщение отправляется через сокет TCP.

Я определил интерфейс MessageGateway

@MessagingGateway(defaultRequestChannel = "toTcp.input")
public interface MessageTcpGateway {

@Gateway
public ListenableFuture<Void> sendTcpChannel(byte[] data, 
 @Header("connectionId") String connectionId );
}

После того, как я использую этот интерфейс в классе обслуживания, как это:

public void sendMessageTcpGateway(final String bridgeId,final String connectionId, final byte[] message) {
    LOGGER.debug("sendMessageTcpGateway connectionId:{} - message:{}", connectionId, message);
    if (holder.existsConnection(connectionId)!=null) {
           gatewayTcp.sendTcpChannel(message,connectionId);
    } else {
        LOGGER.error("Not send message connectionId:{} - message:{}", connectionId, message);
    }
}
  1. Почему нить ждет? Мой процесс ждет каких-либо признаков, и меня не рассматривают? Я предполагаю, что если соединение недоступно или возникла какая-либо ошибка, Spring-Integration выдаст исключение

  2. Как мне решить эту проблему?

1 Ответ

0 голосов
/ 14 марта 2019

Интересно, почему не следуйте рекомендациям из этой SO-темы ... ListenableFuture<Void> является узким местом в вашем решении.Как вы видите по трассировке стека, у вас есть doSendAndReceive(), но я полагаю, что ваше целевое решение действительно одностороннее и ничего не возвращает за replyChannel в заголовках.

Вы должны рассмотреть возможность иметь толькообычный void тип возврата и ExecutorChannel ниже по течению.

К сожалению, мы не можем обнаружить такую ​​ситуацию со стороны платформы, так как тип возврата Future метода шлюза указывает, что вы собираетесь выполнить асинхронный способ запроса-ответа.В вашем случае это просто асинхронный запрос, ничего более.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...