Как получить TSocket в TFramedTransport на серверном процессоре в Thrift? - PullRequest
0 голосов
/ 02 мая 2019

Сейчас я работаю с Apache Thrift, используя язык Java.

У меня проблема с отслеживанием ip-клиента на сервере при использовании THsHaServer . Когда я использую TThreadPoolServer , я могу получить TSocket клиента в процессоре сервера, но он не работает с неблокирующим сервером, особенно с THsHaServer .

Я думаю TFramedTransport завернутый TSocket , поэтому я не могу получить TSocket .

Как получить IP-клиент на неблокирующем сервере в Thrift?

Это мой код

Комиссионный файл

service AuthenticationService {
    bool isAuthenticated(1: string username, 2: string password)
}

Упрощенный - Сервер

public class AuthTrackingHsHaServer {

    private AuthenticationServiceHandler handler;
    private AuthProcessor processor;

    private TNonblockingServerTransport serverTransport;
    private TServer server;

    public AuthTrackingHsHaServer() {
    try {
        initProcesser();
        initTransport();
        initServer();

    } catch (TTransportException ex) {
        Logger.getLogger(AuthTrackingHsHaServer.class.getName()).log(Level.SEVERE, null, ex);
    }
    }

    private void initProcesser() {
    this.handler = new AuthenticationServiceHandler();
    this.processor = new AuthProcessor(handler);
    }

    private void initTransport() throws TTransportException {
    serverTransport = new TNonblockingServerSocket(Config.PORT_AUTHENTICATION_SERVICE);
    }

    private void initServer() {
    THsHaServer.Args args
        = new THsHaServer.Args(serverTransport)
            .transportFactory(new TFramedTransport.Factory(Integer.MAX_VALUE))
            .protocolFactory(new TBinaryProtocol.Factory())
            .processor(processor)
            .executorService(new ThreadPoolExecutor(3, 10, 5, TimeUnit.DAYS, new LinkedBlockingDeque<>()));

    args.maxReadBufferBytes = Long.MAX_VALUE;

    server = new THsHaServer(args);
    }

    public void start() throws TTransportException {
    System.out.println("Authentication service server is listening on port " + Config.PORT_AUTHENTICATION_SERVICE + " ...");
    server.serve();
    }

    public static void main(String[] args) {
    AuthTrackingHsHaServer server = new AuthTrackingHsHaServer();
    try {
        server.start();

    } catch (TTransportException ex) {
        Logger.getLogger(AuthTrackingHsHaServer.class.getName()).log(Level.SEVERE, null, ex);
    }
    }
}

Упрощенно - AuthProcessor, расширяется от процессора

public class AuthProcessor extends AuthenticationService.Processor {

    public AuthProcessor(AuthenticationService.Iface iface) {
          super(iface);
    }

    @Override
    public boolean process(TProtocol in, TProtocol out) throws TException {

         TTransport t = in.getTransport();
         TFramedTransport framedTransport = (TFramedTransport) t;

         // TODO: How to get TSocket in TFramedTransport

         return super.process(in, out); //To change body of generated methods, choose Tools | Templates.
    }

}

Упрощенно - обработчик для процессора

public class AuthenticationServiceHandler implements AuthenticationService.Iface {
    @Override
    public boolean isAuthenticated(String username, String password) throws TException {
         return username.equals("abc") && password.equals("12345");
    }
}
...