【发布时间】:2016-05-10 07:11:49
【问题描述】:
在尝试将 CachingClientConnectionFactory 放入 FailoverClientConnectionFactory 时,我遇到了响应相关问题:
2016-05-10 08:06:09.190 ERROR 1031 --- [pool-2-thread-1] o.s.i.ip.tcp.TcpOutboundGateway : Cannot correlate response - no pending reply for 24b4ad67-3bbf-4468-9cd9-e7c1124413b2:1
2016-05-10 08:06:09.694 ERROR 1031 --- [ main] o.s.i.ip.tcp.TcpOutboundGateway : Tcp Gateway exception
FailoverClientConnectionFactory 和 setSingleUse(true) 也是如此。
我正在使用 spring-boot-starter-parent:1.3.4.RELEASE 并创建这样的工厂(完整的 Spring Boot 示例位于 https://github.com/kjrz/failover-caching):
@Bean
@Scope(value = "prototype")
public AbstractClientConnectionFactory clientConnectionFactory() {
// return getCachingFactory(true); // (1)
// return getFailoverFactory(false); // (2)
// return getFailoverFactory(true); // (3)
return getFailoverCachingFactory(true); // (4)
}
private AbstractClientConnectionFactory getCachingFactory(final boolean singleUse) {
final TcpNetClientConnectionFactory tcpFactory = getTcpFactory(singleUse);
return getCachingFactory(tcpFactory);
}
private AbstractClientConnectionFactory getFailoverFactory(final boolean singleUse) {
final TcpNetClientConnectionFactory tcpFactory = getTcpFactory(singleUse);
return getFailoverFactory(tcpFactory, singleUse);
}
private AbstractClientConnectionFactory getFailoverCachingFactory(final boolean singleUse) {
final TcpNetClientConnectionFactory tcpFactory = getTcpFactory(singleUse);
final CachingClientConnectionFactory cachingFactory = getCachingFactory(tcpFactory);
return getFailoverFactory(cachingFactory, singleUse);
}
private TcpNetClientConnectionFactory getTcpFactory(final boolean singleUse) {
final TcpNetClientConnectionFactory tcpFactory = new TcpNetClientConnectionFactory("localhost", 12345);
final ByteArrayLengthHeaderSerializer serializer = new ByteArrayLengthHeaderSerializer();
tcpFactory.setDeserializer(serializer);
tcpFactory.setSerializer(serializer);
tcpFactory.setSoKeepAlive(true);
tcpFactory.setSingleUse(singleUse);
return tcpFactory;
}
private CachingClientConnectionFactory getCachingFactory(final AbstractClientConnectionFactory factory) {
final CachingClientConnectionFactory cachingFactory = new CachingClientConnectionFactory(factory, 5);
factory.setSoKeepAlive(true);
return cachingFactory;
}
private FailoverClientConnectionFactory getFailoverFactory(final AbstractClientConnectionFactory factory,
final boolean singleUse) {
final FailoverClientConnectionFactory failoverFactory =
new FailoverClientConnectionFactory(Collections.singletonList(factory));
failoverFactory.setSoKeepAlive(true);
failoverFactory.setSingleUse(singleUse);
return failoverFactory;
}
【问题讨论】: