ChannelResolutionException:没有输出通道或replyChannel标头可用 - 只有很多请求

时间:2015-09-16 21:19:28

标签: spring-integration

我正在运行Spring Integration TCP Multiplex示例的客户端部分。我试图查看它可以同时处理多少个请求,大约1000个,我开始收到此错误:ChannelResolutionException:没有输出通道或replyChannel标头可用

在大约1000次通话之下,一切都很好。

<beans:description>
        Uses conversion service and collaborating channel adapters.
    </beans:description>

    <context:property-placeholder />

    <converter>
        <beans:bean class="org.springframework.integration.samples.tcpclientserver.ByteArrayToStringConverter" />
    </converter>

    <!-- Fastest Wire Protocol - takes a byte array with its length definied in the first x bytes-->
    <beans:bean id="fastestWireFormatSerializer" class="org.springframework.integration.ip.tcp.serializer.ByteArrayLengthHeaderSerializer">
        <beans:constructor-arg value="1" />
    </beans:bean>

    <!-- Client side -->

    <gateway id="gw"
        service-interface="org.springframework.integration.samples.tcpclientserver.SimpleGateway"
        default-request-channel="input" />

    <ip:tcp-connection-factory id="client"
        type="client"
        host="localhost"
        port="${availableServerSocket}"
        single-use="false"
        serializer="fastestWireFormatSerializer"
        deserializer="fastestWireFormatSerializer"
        so-timeout="10000" />

    <publish-subscribe-channel id="input" />

    <!-- scheduler - Thread used to restablish connection so the other threads aren't starved while waiting to re-establish connection -->
    <!-- client-mode - Automatically re-establishes the connection if lost -->
    <ip:tcp-outbound-channel-adapter id="outAdapter.client"
        order="2"
        channel="input"
        client-mode="true"              
        connection-factory="client" />  <!-- Collaborator -->



    <!-- Also send a copy to the custom aggregator for correlation and
         so this message's replyChannel will be transferred to the
         aggregated message.
         The order ensures this gets to the aggregator first -->
    <bridge input-channel="input" output-channel="toAggregator.client"
            order="1"/>

    <!-- Asynch receive reply -->
    <ip:tcp-inbound-channel-adapter id="inAdapter.client"
        channel="toAggregator.client"
        connection-factory="client" /> <!-- Collaborator -->

    <!-- dataType attribute invokes the conversion service, if necessary -->
    <channel id="toAggregator.client" datatype="java.lang.String" />

    <aggregator input-channel="toAggregator.client"
        output-channel="toTransformer.client"
        correlation-strategy-expression="payload.substring(0,3)"
        release-strategy-expression="size() == 2"
        expire-groups-upon-completion="true" />

    <transformer input-channel="toTransformer.client"
        expression="payload.get(1)"/> <!-- The response is always second -->

    <task:scheduler id="reconnectScheduler" pool-size="10"/>

用于测试的代码:

        TaskExecutor executor = new SimpleAsyncTaskExecutor();
        final CountDownLatch latch = new CountDownLatch(100);
        final Set<Integer> results = new HashSet<Integer>();
        for (int i = 100; i < 1050; i++) {
            results.add(i);
            final int j = i;
            executor.execute(new Runnable() {
                public void run() {
                    String result = gateway.send(j + "Hello world!"); // first 3 bytes is correlationid
                    System.out.println("Test Result: " + result);
                    results.remove(j);
                    latch.countDown();
                }});
        }

1 个答案:

答案 0 :(得分:0)

我还没弄清楚为什么你会得到这个例外,但你的测试有几个问题。

  1. 倒计时锁存器需要在950
  2. 初始化
  3. 由于您超过999,我们需要更改相关性:

    payload.substring(0,4)

  4. 通过这些更改,它对我有用。

    我会试着弄清楚为什么在我得到更多时间的时候我们会得到那个例外。

    修改

    问题确实是由相互冲突的相关ID引起的。

    最后50条消息都具有相关标识100,这意味着消息以不确定的方式发布(假设发布基于大小)。在某些情况下,会释放两条输入消息(导致对测试用例的错误答复)。当2个回复被释放时;没有输出通道。