zoukankan      html  css  js  c++  java
  • org.apache.thrift.transport.TTransportException: null

    问题描述

    每次client调用server端,均有正常返回,但是server端还会多打出一些异常信息,如下。

    org.apache.thrift.transport.TTransportException: null
        at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:132)
        at org.apache.thrift.transport.TTransport.readAll(TTransport.java:86)
        at org.apache.thrift.protocol.TBinaryProtocol.readAll(TBinaryProtocol.java:425)
        at org.apache.thrift.protocol.TBinaryProtocol.readI32(TBinaryProtocol.java:321)
        at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:225)
        at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:27)
        at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:310)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

    问题出现的环境背景及自己尝试过哪些方法

    对thrift不熟悉,刚接触,根本不知道哪里去找原因。

    相关代码

    server端代码

    import com.username.service.controllers.ServiceImpl;
    import org.apache.thrift.protocol.TBinaryProtocol;
    import org.apache.thrift.protocol.TCompactProtocol;
    import org.apache.thrift.server.TServer;
    import org.apache.thrift.server.TSimpleServer;
    import org.apache.thrift.server.TThreadPoolServer;
    import org.apache.thrift.transport.TServerSocket;
    import org.apache.thrift.transport.TServerTransport;
    import org.apache.thrift.transport.TTransportException;
    
    public class StartService implements Runnable{
        private static boolean breg = false;
    
        public void starWeather() throws TTransportException {
            TBinaryProtocol.Factory proFactory = new TBinaryProtocol.Factory();
    
            ServiceImpl handler = new ServiceImpl();
            WeatherService.Processor processor= new WeatherService.Processor(handler);
            TServerTransport serverTransport = new TServerSocket(9000);
    
            TThreadPoolServer.Args serverArgs = new TThreadPoolServer.Args(serverTransport);
            serverArgs.processor(processor);
            serverArgs.protocolFactory(proFactory);
            TServer server = new TThreadPoolServer(serverArgs);
    
    
            breg = true;
            server.serve();
        }
    
    
        @Override
        public void run() {
            try {
                if (!breg)
                    starWeather();
            } catch (TTransportException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) throws TTransportException {
            StartService server = new StartService();
            server.starWeather();
        }
    }
    

    client端代码

     
    package com.xiaohuan.client;
    
    import com.username.rpc.weather_service.WeatherService;
    import com.username.rpc.weather_service.entity.Weather;
    import com.username.rpc.weather_service.request.GetCityWeatherRequest;
    import com.username.rpc.weather_service.response.GetCityWeatherResponse;
    import org.apache.curator.framework.CuratorFramework;
    import org.apache.curator.framework.CuratorFrameworkFactory;
    import org.apache.curator.retry.RetryNTimes;
    import org.apache.thrift.TException;
    import org.apache.thrift.protocol.TBinaryProtocol;
    import org.apache.thrift.protocol.TCompactProtocol;
    import org.apache.thrift.protocol.TProtocol;
    import org.apache.thrift.transport.TFramedTransport;
    import org.apache.thrift.transport.TSocket;
    import org.apache.thrift.transport.TTransport;
    import org.apache.thrift.transport.TTransportException;
    import java.util.*;
    
    import static com.username.client.WeatherConstants.RPCNAME;
    import static com.username.client.ZkConstants.connectString;
    
    public class CallWeatherRPC {
    
        public String callWeather(String ip, int port, String city) {
            String retString = null;
            try {
                TTransport transport = new TSocket(ip, port);
                transport.open();
                TProtocol protocol = new TBinaryProtocol(transport);
                WeatherService.Client client = new WeatherService.Client(protocol);
                GetCityWeatherRequest request = new GetCityWeatherRequest();
                request.setCity(city);
    
                GetCityWeatherResponse response = client.get_city_weather(request);
                if(response.isSuccess()){
                    List<Weather> weatherList = response.getWeather();
                    System.out.println(weatherList.get(0).getCity());
                    retString = weatherList.get(0).getCity() + weatherList.get(0).getTemperature();
                }else{
                    System.out.println(response.getError_message());
                }
                transport.close();
            } catch (TTransportException e) {
                e.printStackTrace();
            } catch (TException e) {
                e.printStackTrace();
            }
            System.out.println("retString:"+retString);
            return retString;
        }
    
        public static void main(String[] args) {
            CallWeatherRPC client = new CallWeatherRPC();
            client.callWeather("127.0.0.1", 9000, "123");
        }
    
    }

    你期待的结果是什么?实际看到的错误信息又是什么?

    虽然不影响功能,但是为什么server会多打印异常信息呢

    回复
    阅读 5.3k
     
     
    4 个回答
    心的旅程
    • 2
    发布于 2019-06-25新手上路,请多包涵

    是thrift的异常捕获代码写错了,没有处理到。
    0.12.0版本的TThreadPoolServer.java第315行

    } catch (TException tx) {
            // A.这里的问题。
            LOGGER.error("Thrift error occurred during processing of message.", tx);
          } catch (Exception x) {
            // We'll usually receive RuntimeException types here
            // Need to unwrap to ascertain real causing exception before we choose to ignore
            Throwable realCause = x.getCause();
            // Ignore err-logging all transport-level/type exceptions
            if ((realCause != null && realCause instanceof TTransportException)
            
                // B.这里的代码应该放到A处,TTransportException是TException 的子类,
                // A处已经把异常捕获了,根本不会进入这里,导致打印错误。可以参看0.11.0
                // 的代码,捕获到TTransportException异常是不做任何处理的。
                || (x instanceof TTransportException)) {
              if (LOGGER.isDebugEnabled()) {
                // Write to debug, just in case the exception gets required
                LOGGER
                    .debug("Received TTransportException during processing of message, ignoring: ", x);
              }
            } else {
              // Log the exception at error level and continue
              LOGGER.error("Error occurred during processing of message.", x);
            }
          }
  • 相关阅读:
    jQuery操作Table学习总结[转]
    SQL语句中的单引号处理以及模糊查询
    正则表达式实现将html文本转换为纯文本格式(将html字符串转换为纯文本方法)
    ASP.NET中使用UpdatePanel实现局部异步刷新方法和攻略(转)
    Response.Redirect在新窗口打开(转载)
    position属性absolute与relative 的区别
    下载文件
    gridveiw的使用
    MarkDown和流程图诠释你的代码
    git使用笔记
  • 原文地址:https://www.cnblogs.com/javalinux/p/15069782.html
Copyright © 2011-2022 走看看