美文网首页
Netty同步调用的实现方式

Netty同步调用的实现方式

作者: 小玉1991 | 来源:发表于2021-03-03 11:09 被阅读0次

方式主要是设置同步锁。注意点: serverChannelHandlerAdapter.setUuid(dataSourceKey) 与通讯实体的UUID是同一个UUID,才能回调到latch.await的if语句里边。


        // 查询该数据源该schema下所有的表
        FtpPathFileSource dataSource = new FtpPathFileSource();
        dataSource.setUserName(dataSourceDto.getUserName());
        dataSource.setPassword(dataSourceDto.getPassword());
        dataSource.setUrl(dataSourceDto.getDataSourceIp());
        dataSource.setPath(dataConfigSearchForm.getSchema());
        dataSource.setBusinessType(BusinessTypeEnum.FTP);


        List<Client> usableClientList = datasourceClientRepository.findUsableClientList();
        Random random = new Random();
        //从可用的客户端列表中随机获取一个客户端
        Client client = usableClientList.get(random.nextInt(usableClientList.size()));
        //获取channel
        Channel channel = DataBaseCache.CHANNEL_MAP.get(client.getChannelId());

        //设置同步锁
        CountDownLatch latch = new CountDownLatch(Constant.Field.IS_SYNCHRO);
        ServerChannelHandlerAdapter serverChannelHandlerAdapter = (ServerChannelHandlerAdapter) channel.pipeline().get("ChannelHandlerAdapter");
        serverChannelHandlerAdapter.resetSync(latch, true);
        String dataSourceKey = UUID.randomUUID().toString();
        serverChannelHandlerAdapter.setUuid(dataSourceKey);

        //构造通讯实体
        TransferMessage transferMessage = new TransferMessage();
        transferMessage.setId(dataSourceKey);
        transferMessage.setBusinessType(BusinessTypeEnum.FTP);
        transferMessage.setCommandType(CommandTypeEnum.CONTENT);
        transferMessage.setVersion(Constant.Field.CLIENT_VERSION);
        transferMessage.setData(JsonUtil.objectToJson(dataSource));

        channel.writeAndFlush(JsonUtil.objectToJson(transferMessage));

        FtpFilePathDto dataResult = new FtpFilePathDto();
        try {
            //同步返回结果
            if (latch.await(Constant.Field.SECONDS_TIMEOUT, TimeUnit.SECONDS)) {
                transferMessage = serverChannelHandlerAdapter.getResult();
                dataResult = JsonUtil.jsonToObject(transferMessage.getData(), FtpFilePathDto.class);
            } else {
                log.error("测试连接超时");
            }
        } catch (Exception e) {
            log.error("show table data timeout", e);
        }

相关文章

  • Netty同步调用的实现方式

    方式主要是设置同步锁。注意点: serverChannelHandlerAdapter.setUuid(dataS...

  • dubbo原理

    1、RPC原理 一次完整的RPC调用流程(同步调用,异步另说)如下: 2、netty通信原理 Netty是一个异步...

  • 高并发原理

    同步与异步 同步与异步的重点是在消息通知的方式上,也就是调用结果通知的方式上。同步方式是当一个同步调用发出后,调用...

  • 同步与异步

    同步与异步 同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式。 同步: 当一个同步调用发出去后,调用者...

  • 那些与Netty有关的知识点,你知道多少(二)

    Netty RPC 实现 概念 RPC,即 Remote Procedure Call(远程过程调用),调用远程计...

  • Java中的回调机制

    调用方式 例子: 同步调用情况 同步调用是最简单的方式,按照顺序,a调用b,当b执行完,那么a才会继续往下执行。如...

  • 源码分析netty服务端运行过程

    原生Java nio实现 java原生api大致实现流程如下,netty底层的实现方式很类似 netty服务端示例...

  • 同步异步阻塞非阻塞

    同步异步的理解: 同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式。 同步: 当一个同步调用发出去后,...

  • 同步异步/阻塞非阻塞

    同步异步 同步和异步体现的是消息通知的方式 同步:调用者调用被调用者,被调用者在返回其结果前,调用者不会返回。实际...

  • Dubbo使用了CompletableFuture,实现了真异步

    Dubbo在服务调用时支持同步调用和异步调用等方式。 在Dubbo2.6版本及之前的版本在实现异步调用时存在一定的...

网友评论

      本文标题:Netty同步调用的实现方式

      本文链接:https://www.haomeiwen.com/subject/mlkqqltx.html