FailoverClientConnectionFactory无法关联响应

时间:2016-05-10 07:11:49

标签: spring spring-integration

尝试将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

FailoverClientConnectionFactorysetSingleUse(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;
}

1 个答案:

答案 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初始化工具。

JIRA Issue with link to pull request