zoukankan      html  css  js  c++  java
  • 基于Netty5.0高级案例之请求响应同步通信


    前言介绍:
        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":"查询用户信息 请求成功,反馈结果请接受处理。"} 

    下载源码:http://itstack.qiniudn.com/itstack-demo-netty-future.rar
  • 相关阅读:
    SQLServer数据库自增长标识列的更新修改操作
    “~/Views/Login/Login.aspx”处的视图必须派生自 ViewPage、ViewPage<TModel>、ViewUserControl 或 ViewUserControl<TModel>。
    关于值类型与列类型不匹配,所需类型是 DataRow"的解决方案
    尝试为文件 F:visual studio 2010kbspaperCMSApp_DataProject.mdf 附加自动命名的数据库,但失败。已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中。
    Django快速开发之投票系统
    super() 的入门使用
    [python]模块及包
    [转]大话后端开发的奇淫技巧大集合
    [.net 多线程]ThreadPool的安全机制
    [.net 多线程]Task
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13317780.html
Copyright © 2011-2022 走看看