Attēls darbojas ātrā tiešā savienojumā, bet caur lēnāku pārsūtīšanas starpniekserveri ir nepilnīgs. Viens iespējams iemesls ir, ka avots aizver savienojumu, kamēr tā atbilde vēl tiek rakstīta.

Netty I/O ir asinhrona. Atgriešanās no writeAndFlush nenozīmē, ka darbība ir pabeigta. Tāpēc šī secība nav droša atbildei, kurai vēl ir baiti rindā:

ctx.writeAndFlush(response);
ctx.close();

Kad HTTP apmaiņa tiek apzināti aizvērta pēc tās pēdējā atbildes ziņojuma, pievienojiet aizvēršanu šīs rakstīšanas future:

ctx.writeAndFlush(finalResponseMessage)
    .addListener(ChannelFutureListener.CLOSE);

Fragments pieņem, ka atbilde jau ir pareizi izveidota un ierāmēta. Straumētam ķermenim izmantojiet tā pēdējā ziņojuma pabeigšanu, nevis galveņu rakstīšanu. Pastāvīgam HTTP savienojumam nepievienojiet aizvēršanu tikai tāpēc, ka atbilde ir beigusies.

Izpētiet future neveiksmi kā daļu no parastās lietojumprogrammas kļūdu apstrādes. Pabeigšana ietver neveiksmi un atcelšanu, tāpēc pabeigšana vien nav piegādes apstiprinājums no pārlūka.

Noderīgs salīdzinājums ir pilnais atbildes garums un rakstīšanas iznākums katrā ceļā. Starpniekserveris var mainīt laiku pietiekami, lai atklātu esošu dzīves cikla kļūdu; tā klātbūtne nepierāda, ka tā kompresors vai kešatmiņa izmeta baitus.

Saistītie raksti