Warm tip: This article is reproduced from stackoverflow.com, please click
java thrift

How to run multiple T(Threaded)Server?

发布于 2020-03-27 15:46:40

I want to run two TThreadedPoolServers in the same program to handle different kinds of requests. However, the TThreadedPoolServer that starts last will always refuse the connection if a client tries to connect to it. I've already tried to run the servers in different threads, but to no avail.

Server 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();
    }
}

Server 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();
    }
}

And the Exception thrown clientside:

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

The solution doesn't have to contain two TThreadedPoolServers, but if it doesn't, I'll need help starting them.

Questioner
UmBottesWillen
Viewed
51
JensG 2020-01-31 17:13

However, the TThreadedPoolServer that starts last will always refuse the connection if a client tries to connect to it. I've already tried to run the servers in different threads, but to no avail.

That's not so much an issue of the (threaded) server, but a general problem you will run into when trying to bind two servers to one socket.

One possible solution when you need to run two or more servers over the same endpoint is to use the multiplex protocol.

Some (not all) implementations also provide a compatibility fallback to a default service, if an older client (one not using TMultiplexProtocol) is contacting the server. If the implementation does not currently support it, be aware that adding TMultiplexProtocol to an existing and published endpoint is a breaking change.