【问题标题】:FailoverClientConnectionFactory cannot correlate responseFailoverClientConnectionFactory 无法关联响应
【发布时间】: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

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

【问题讨论】:

    标签: spring spring-integration


    【解决方案1】:

    有趣 - 我知道问题出在哪里,虽然我们对缓存故障转移进行了测试,但它们不在网关的上下文中。

    我将打开一个 JIRA 问题来解决这个问题。

    不过,一般来说,最好将它们连接起来(通过故障转移缓存)。

    这行得通:

    @SuppressWarnings("unused")
    private AbstractClientConnectionFactory getCachingFailoverFactory(final boolean singleUse) {
        final TcpNetClientConnectionFactory tcpFactory = getTcpFactory(singleUse);
        FailoverClientConnectionFactory failoverFactory = getFailoverFactory(tcpFactory, singleUse);
        return getCachingFactory(tcpFactory);
    }
    

    我还建议您也将底层工厂(TCP、FailOver)设为@Beans - 这样它们就可以正确连接以进行事件发布和其他 bean 初始化。

    JIRA Issue with link to pull request.

    【讨论】:

    • 干杯加里,它奏效了。至于 Bean 工厂,我从数据库中读取地址,然后将它们提供给 TCP 工厂,这些工厂反过来形成提供给故障转移工厂的列表。在这种情况下,我认为我能做的最好的事情是 tcpNetClientConnectionFactory.setApplicationEventPublisher(applicationContext)。不过,缓存和故障转移现在是 Bean。
    • 感谢更新 - 原来的问题现已在 4.2.6 中修复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    相关资源
    最近更新 更多