Как запустить несколько T (резьбовых) серверов? - PullRequest
0 голосов
/ 22 января 2020

Я хочу запустить два TThreadedPoolServers в одной программе для обработки запросов разного типа. Тем не менее, TThreadedPoolServer, который запускается последним, всегда будет отклонять соединение, если клиент пытается подключиться к нему. Я уже пытался запустить серверы в разных потоках, но безрезультатно.

Сервер 1:

public class RERunner extends Thread {
    private static ReceiveEndpoint receiveEndpoint;
    private static ReceiveEndpointInterface.Processor<ReceiveEndpoint> masterProcessor;

    public RERunner() throws TTransportException {
        receiveEndpoint = new ReceiveEndpoint();
        masterProcessor = new ReceiveEndpointInterface.Processor<>(receiveEndpoint);

        TServerTransport transport = new TServerSocket(Elements.MASTER_SERVER_RC_ENDPOINT_PORT);
        TSimpleServer server = new TSimpleServer(new TSimpleServer.Args(transport).processor(masterProcessor));
        server.serve();
    }
}

Сервер 2:

public class RETableRunner extends Thread {
    private static ReceiveEndpointTable receiveEndpointTable;
    private static ReceiveEndpointTableInterface.Processor<ReceiveEndpointTable> masterProcessorTable;

    public RETableRunner() throws TTransportException {
        receiveEndpointTable = new ReceiveEndpointTable();
        masterProcessorTable = new ReceiveEndpointTableInterface.Processor<>(receiveEndpointTable);

        TServerTransport transportAll = new TServerSocket(Elements.MASTER_SERVER_RC_ENDPOINT_TABLE_PORT);
        TThreadPoolServer serverAll = new TThreadPoolServer(new TThreadPoolServer.Args(transportAll).processor(masterProcessorTable));
        serverAll.serve();
    }
}

И Клиентское исключение:

org.apache.thrift.transport.TTransportException: java.net.ConnectException: Connection refused: connect
    at org.apache.thrift.transport.TSocket.open(TSocket.java:226)
    at DataPropagator.acquireEndpointTable(DataPropagator.java:27)
    at DataPropagator.run(DataPropagator.java:98)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.base/java.net.PlainSocketImpl.connect0(Native Method)
    at java.base/java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:101)
    at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
    at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
    at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403)
    at java.base/java.net.Socket.connect(Socket.java:591)  
    at org.apache.thrift.transport.TSocket.open(TSocket.java:221)
    ... 2 more

Решение не должно содержать два TThreadedPoolServers, но если этого не произойдет, мне потребуется помощь для их запуска.

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Однако TThreadedPoolServer, который запускается последним, всегда будет отклонять соединение, если клиент пытается подключиться к нему. Я уже пытался запускать серверы в разных потоках, но безрезультатно.

Это не столько проблема (многопоточного) сервера, сколько общая проблема, с которой вы столкнетесь при попытке привязать два сервера к одному сокету.

Одним из возможных решений, когда вам нужно запустить два или более серверов через одну и ту же конечную точку, является использование мультиплексного протокола .

Некоторые (не все) реализации также предоставляют запасной вариант совместимости со службой по умолчанию, если более старый клиент (не использующий TMultiplexProtocol) связывается с сервером. Если реализация в настоящее время не поддерживает его, помните, что добавление TMultiplexProtocol к существующей и опубликованной конечной точке является серьезным изменением.

0 голосов
/ 22 января 2020

Я объединил два файла * .thrift и определенные в них службы, чтобы получить доступ к обеим функциям только через один TThreadedServer.

...