尝试将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;
}
答案 0 :(得分:0)
有趣 - 我知道问题是什么,当我们通过缓存进行故障转移测试时,它们不在网关的上下文中。
我将打开一个JIRA问题来解决这个问题。
一般而言,最好以相反的方式连接它们(缓存故障转移)。
这有效:
@SuppressWarnings("unused")
private AbstractClientConnectionFactory getCachingFailoverFactory(final boolean singleUse) {
final TcpNetClientConnectionFactory tcpFactory = getTcpFactory(singleUse);
FailoverClientConnectionFactory failoverFactory = getFailoverFactory(tcpFactory, singleUse);
return getCachingFactory(tcpFactory);
}
我还建议你制作底层工厂(TCP,FailOver)@Bean
- 这样他们就可以正确连接事件发布和其他bean初始化工具。