前言介绍:


    netty是异步通信,但是有些场景下我们需要发送同时接收服务端反馈并做处理。例如dubbo就有这样的场景,当然他不一定和我下面的例子方式一样,dubbo中有一个场景是代理你的调用方法,通过nettysocket直连到生产者,生产者处理后反馈消息,这样你就感受不到自己是异步调用的方法。


环境需求:


    netty5.0、jdk1.6、idea、maven (truest me an old driver这些你都有,没有就别往下看也没意思)


代码介绍:


工程截图




代码介绍


主要依靠future类处理


org.itstack.demo.netty.test.client.Start


ClientSocket client = new ClientSocket();


        Thread thread = new Thread(client);


        thread.start();


        while (true) {


            try {


                //获取future,线程有等待处理时间


                if (null == future){


                    future = client.getFuture();


                    Thread.sleep(500);


                    continue;


                }


                //构建发送参数


                Response response = new Response();


                response.setResult("查询用户信息");


                SyncWrite s = new SyncWrite();


                Request request = s.writeAndSync(future.channel(), response, 1000);


                System.out.println("调用结果:"+JSON.toJSON(request));


                Thread.sleep(1000);


            } catch (Exception e) {


            }


        }








org.itstack.demo.netty.client


import io.netty.channel.ChannelHandlerContext;


import io.netty.channel.SimpleChannelInboundHandler;


import org.itstack.demo.netty.future.SyncWriteFuture;


import org.itstack.demo.netty.future.SyncWriteMap;


import org.itstack.demo.netty.msg.Request;


 


/**


 * Created by fuzhengwei1 on 2016/10/20.


 */


public class MyClientHandler extends SimpleChannelInboundHandler<Request> {


 


    @Override


    protected void messageReceived(ChannelHandlerContext ctx, Request msg) throws Exception {


        String requestId = msg.getRequestId();


        SyncWriteFuture future = (SyncWriteFuture) SyncWriteMap.syncKey.get(requestId);


        if (future != null) {


            future.setResponse(msg);


        }


    }


 


}




测试结果:




调用结果:{"requestId":"c18b6709-db9c-45ed-9d20-7780cf9c35e0","param":"查询用户信息 请求成功,反馈结果请接受处理。"}


调用结果:{"requestId":"78d48e8e-b371-41e0-9a50-6d8d65e47274","param":"查询用户信息 请求成功,反馈结果请接受处理。"}


调用结果:{"requestId":"16693303-0f49-4089-858f-b5f6a0909a7c","param":"查询用户信息 请求成功,反馈结果请接受处理。"}


调用结果:{"requestId":"bbae4eb6-32de-4357-8e15-e20e058b7f5a","param":"查询用户信息 请求成功,反馈结果请接受处理。"}


调用结果:{"requestId":"87ee5a7a-ede8-425a-a952-2461e4448022","param":"查询用户信息 请求成功,反馈结果请接受处理。"}


调用结果:{"requestId":"bcd76aaf-33be-4911-bd8b-87b8d49807c0","param":"查询用户信息 请求成功,反馈结果请接受处理。"}


调用结果:{"requestId":"94678494-3136-48dd-a88b-2d7c8b5b4579","param":"查询用户信息 请求成功,反馈结果请接受处理。"}


调用结果:{"requestId":"8f6368f8-f436-4a45-a10a-d5e31ba98d02","param":"查询用户信息 请求成功,反馈结果请接受处理。"}


调用结果:{"requestId":"69af324c-9c7d-4523-9461-30ae15656754","param":"查询用户信息 请求成功,反馈结果请接受处理。"}