ChannelResolutionException: tidak ada saluran keluaran atau header saluran balasan yang tersedia - Hanya dengan banyak permintaan

Saya menjalankan bagian klien dari contoh Spring Integration TCP Multiplex. Saya mencoba melihat berapa banyak permintaan yang dapat ditangani sekaligus dan sekitar 1000, saya mulai mendapatkan kesalahan ini: ChannelResolutionException: tidak ada saluran keluaran atau header saluran balasan tersedia

Semuanya baik-baik saja di bawah sekitar 1000 panggilan.

<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"/>

Dan kode yang digunakan untuk menguji:

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

person mad_fox    schedule 16.09.2015    source sumber


Jawaban (1)


Saya belum mengetahui sepenuhnya mengapa Anda mendapatkan pengecualian itu, tetapi ada beberapa masalah dengan pengujian Anda.

  1. Kait hitung mundur perlu diinisialisasi pada 950
  2. Karena Anda melebihi 999, kita perlu mengubah korelasinya:

    payload.substring(0,4)

Dengan perubahan itu, ini berhasil untuk saya.

Saya akan mencoba mencari tahu mengapa kami mendapatkan pengecualian itu ketika saya punya lebih banyak waktu.

EDIT

Masalah ini memang disebabkan oleh id korelasi yang saling bertentangan.

50 pesan terakhir semuanya memiliki id korelasi 100 yang berarti pesan dirilis dengan cara yang tidak dapat ditentukan (mengingat rilis didasarkan pada ukuran). Dalam beberapa kasus, dua pesan masukan dilepaskan (menyebabkan balasan yang salah pada kasus uji). Ketika 2 balasan dirilis; tidak ada saluran keluaran.

person Gary Russell    schedule 17.09.2015