Netty 3.8.0上负载测试期间的数据损坏

Netty 3.8.0上负载测试期间的数据损坏,netty,Netty,有没有人有过类似的经历? 简而言之,我已经创建了一个TCPServer、TCPClient、编码器和解码器 在我的编码器和解码器上,我使用一个签名字节来检测任何数据损坏。 如果我运行一个TCPClient线程。它总是有效的。但当它增加到4个线程时,我开始有随机错误 TestClient的示例代码 公共类测试客户端{ 私有静态日志记录器=LogFactory.getLog(TestClient.class) publicstatictcpclient createTCPClient(整数倍,字符串

有没有人有过类似的经历? 简而言之,我已经创建了一个TCPServer、TCPClient、编码器和解码器

在我的编码器和解码器上,我使用一个签名字节来检测任何数据损坏。 如果我运行一个TCPClient线程。它总是有效的。但当它增加到4个线程时,我开始有随机错误

TestClient的示例代码

公共类测试客户端{ 私有静态日志记录器=LogFactory.getLog(TestClient.class)

publicstatictcpclient createTCPClient(整数倍,字符串主机,整数端口){
TCPClient client=TCPClient.start(主机、端口);
if(client.getFuture().waitingunterruptibly(5000))logger.info(“wait ok”);
if(client.getFuture().getChannel().isConnected())logger.info(“已连接”);
返回客户;
}
公共静态字符串createString(整数大小){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i

}

我的最佳选择是,您的通道下游Handler或通道上游Handler实现中存在竞争条件

public static TCPClient createTCPClient(int times, String host, int port) {
    TCPClient client =  TCPClient.start(host, port);
    if (client.getFuture().awaitUninterruptibly(5000)) logger.info("wait ok");
    if ( client.getFuture().getChannel().isConnected() ) logger.info("connected");
    return client;

}

public static String createString(int size) {
    StringBuilder sb = new StringBuilder();
    for ( int i = 0 ; i < size ; i ++)
        sb.append("String createString, client send "+i);
    return sb.toString();
}

static class ClientThread implements Runnable {
    TCPClient client;
    int times;

    ClientThread(TCPClient client, int times) {
        this.client = client;
        this.times = times;
    }

    @Override
    public void run() {
        int error = 0;
        for ( int i = 0; i < times ; i ++) {
            logger.info("send "+i);
            try {
                Request request = new Request(new Header("test",i, (byte) 0), createString(i).getBytes());

                Response response = client.sendRequest( request);
                if ( response.isError() ) error ++;
                logger.info(response.toString());
            } catch (Throwable th) {
                error++;
                logger.error( th.getMessage());

            }
        }
        logger.info("ERROR # "+ error);
    }



}



public static void main(String[] args) throws Exception {
    String[] opts = new String[] {"-thread","-times","-host","-port"};
    String[] defaults = new String[] {"2", "10", "localhost", "7120" };
    String[] paras = getOpts( args, opts, defaults);
    int threads = Integer.valueOf(paras[0]);
    int times  = Integer.valueOf( paras[1]);
    String host = paras[2];
    int port = Integer.valueOf( paras[3]);
    for ( int i=0; i < threads; i++ ) {
        logger.info("start thread # "+i);
        TCPClient client = createTCPClient(times, host, port);
        new Thread( new ClientThread(client, times)).start();
    }

}