我已经在这个网站上阅读了另一个这样的问题,但我不知道如何解决该问题。
Spring Integration: Application leaking SimpleAsyncTaskExecutor threads?
我的错误类似于上一个链接
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)
我正在使用
下一个场景是:我通过Api控制器收到一条消息,并且此消息是通过un 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);
}
}
为什么线程正在等待?我的流程是否正在等待任何形式的征兆,而不考虑我?我想如果连接不可用或任何类型的错误,spring-integration将引发异常
我该如何解决此问题?
答案 0 :(得分:0)
我想知道为什么不遵循该SO线程的建议...
ListenableFuture<Void>
是您解决方案的瓶颈。正如您通过堆栈跟踪所看到的那样,这里有doSendAndReceive()
,但是我想您的目标解决方案实际上是单向的,并且不为标头中的replyChannel
返回任何内容。
您应该考虑使用普通的void
返回类型和下游的ExecutorChannel
。
不幸的是,由于网关方法的Future
返回类型指示您将要执行请求-响应异步方式,因此我们无法从框架方面检测到这种情况。在您的情况下,这只是一个异步请求,仅此而已。