Java 具有多个响应程序的HttpServer

Java 具有多个响应程序的HttpServer,java,rpc,avro,httpserver,Java,Rpc,Avro,Httpserver,在我的应用程序(java)中,我需要支持两种类型的RPC: 管理RPC和用户RPC。我正在使用avro创建这些RPC,目前我正在打开两个HttpServer,每个RPC一个,代码如下: Server serverAdmins = new HttpServer(new ReflectResponder(AdministrationRPC.class, arpcImpl), adminRpcPort); Server serverUsers = new HttpServer(new ReflectR

在我的应用程序(java)中,我需要支持两种类型的RPC: 管理RPC和用户RPC。我正在使用avro创建这些RPC,目前我正在打开两个HttpServer,每个RPC一个,代码如下:

Server serverAdmins = new HttpServer(new ReflectResponder(AdministrationRPC.class, arpcImpl), adminRpcPort);
Server serverUsers = new HttpServer(new ReflectResponder(UsersRPC.class, urpcImpl), usersRpcPort);
...
这是可行的,但对我来说似乎是一种浪费——我正在寻找一种方法,使用一个http服务器,在同一个端口上有两个端口或两个URL(这些选项中的任何一个对我都有好处),比如:

Server server = new new HttpServer(new ReflectResponder(AdministrationRPC.class, arpcImpl), adminRpcPort);
server.addResponder(new ReflectResponder(UsersRPC.class, urpcImpl), usersRpcPort);
...
addResponder方法当然不存在,唯一看起来类似的方法是addConnector方法-但即使在彻底搜索之后,我也找不到如何将其应用于我的需要


有没有办法在同一个http服务器上启动两个avro响应程序

我通过编写一个简单的类来解决这个问题,该类可以满足我的需要,请参见下面的代码

import java.io.IOException;
import java.net.URL;
import org.apache.avro.ipc.HttpTransceiver;
import org.apache.avro.ipc.Responder;
import org.apache.avro.ipc.ResponderServlet;
import org.apache.avro.ipc.reflect.ReflectRequestor;
import org.apache.avro.ipc.reflect.ReflectResponder;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.ServletHolder;

/**
 *
 * @author bennyl
 */
public class MultiResponderHttpServer {

    private final Context context;
    private final Server server;
    private final int port;

    public MultiResponderHttpServer(int port) {
        this.port = port;
        server = new Server(port);
        context = new Context(server, "/", Context.SESSIONS);
    }

    public void addResponder(String baseUri, Responder responder) throws IOException {
        ResponderServlet servlet = new ResponderServlet(responder);
        ServletHolder holder = new ServletHolder(servlet);
        context.addServlet(holder, baseUri);
    }

    public int getPort() {
        return port;
    }

    public void close() throws Exception {
        server.stop();
    }

    public void start() throws Exception {
        server.start();
    }

    public void join() throws InterruptedException {
        server.join();
    }

    public static void main(String[] args) throws IOException, InterruptedException {
        MultiResponderHttpServer server = new MultiResponderHttpServer(8888);
        server.addResponder("/test_a/*", new ReflectResponder(TestProtocol.class,
                (TestProtocol) why -> "a received a message: '" + why + "'"));
        server.addResponder("/test_b/*", new ReflectResponder(TestProtocol.class,
                (TestProtocol) why -> "b received a message: '" + why + "'"));

        server.start();

        HttpTransceiver atrans = new HttpTransceiver(new URL("http://localhost:" + server.getPort() + "/test_a/"));
        HttpTransceiver btrans = new HttpTransceiver(new URL("http://localhost:" + server.getPort() + "/test_b/"));

        System.out.println(ReflectRequestor.getClient(TestProtocol.class, atrans).go("message to a"));
        System.out.println(ReflectRequestor.getClient(TestProtocol.class, btrans).go("message to b"));

        server.close();
        server.join();
    }

    public interface TestProtocol {

        String go(String why);
    }
}