W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
當出現(xiàn)入站或者出站數(shù)據(jù)傳輸不足的情況也要進行處理,例如拋出一個異常。這種情況可能是因為你輸入錯誤或者處理大的資源或者其他的異常導致的。接下來我們來寫一個實現(xiàn),一旦輸入的字節(jié)數(shù)超過了限制長度,TooLongFrameException 就會被拋出,用這樣的功能來防止資源耗盡的問題??聪聢D:
在圖10.4最大幀大小被設置為3個字節(jié)。
Figure 10.4 Decoding via FrameChunkDecoder
上圖顯示幀的大小被限制為3字節(jié),若輸入的字節(jié)超過3字節(jié),則超過的字節(jié)被丟棄并拋出 TooLongFrameException。在 ChannelPipeline 中的其他ChannelHandler 實現(xiàn)可以處理 TooLongFrameException 或者忽略異常。處理異常在 ChannelHandler.exceptionCaught() 方法中完成,ChannelHandler 提供了一些具體的實現(xiàn),看下面代碼:
public class FrameChunkDecoder extends ByteToMessageDecoder { //1
private final int maxFrameSize;
public FrameChunkDecoder(int maxFrameSize) {
this.maxFrameSize = maxFrameSize;
}
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
int readableBytes = in.readableBytes(); //2
if (readableBytes > maxFrameSize) {
// discard the bytes //3
in.clear();
throw new TooLongFrameException();
}
ByteBuf buf = in.readBytes(readableBytes); //4
out.add(buf); //5
}
}
示例如下:
Listing 10.6 Testing FixedLengthFrameDecoder
public class FrameChunkDecoderTest {
@Test //1
public void testFramesDecoded() {
ByteBuf buf = Unpooled.buffer(); //2
for (int i = 0; i < 9; i++) {
buf.writeByte(i);
}
ByteBuf input = buf.duplicate();
EmbeddedChannel channel = new EmbeddedChannel(new FrameChunkDecoder(3)); //3
Assert.assertTrue(channel.writeInbound(input.readBytes(2))); //4
try {
channel.writeInbound(input.readBytes(4)); //5
Assert.fail(); //6
} catch (TooLongFrameException e) {
// expected
}
Assert.assertTrue(channel.writeInbound(input.readBytes(3))); //7
Assert.assertTrue(channel.finish()); //8
ByteBuf read = (ByteBuf) channel.readInbound();
Assert.assertEquals(buf.readSlice(2), read); //9
read.release();
read = (ByteBuf) channel.readInbound();
Assert.assertEquals(buf.skipBytes(4).readSlice(3), read);
read.release();
buf.release();
}
}
即使我們使用 EmbeddedChannel 和 ByteToMessageDecoder。
應該指出的是,同樣的可以做每個 ChannelHandler 的實現(xiàn),將拋出一個異常。
乍一看,這看起來很類似于測試我們寫在清單10.2中,但它有一個有趣的轉折,即 TooLongFrameException 的處理。這里使用的 try/catch 塊是 EmbeddedChannel 的一種特殊的特性。如果其中一個“write*"編寫方法產(chǎn)生一個受控異常將被包裝在一個 RuntimeException。這使得測試更加容易,如果異常處理的一部分處理。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: