2014-12-19 8 views
0

В моем приложении (java) мне нужно поддерживать два типа RPC: Администрирование RPC и User RPC. Я использую Avro, чтобы создать эту RPC-, в настоящее время я открываю два HttpServers один на RPC, используя код, подобный следующему:HttpServer с более чем одним ответчиком

Server serverAdmins = new HttpServer(new ReflectResponder(AdministrationRPC.class, arpcImpl), adminRpcPort); 
Server serverUsers = new HttpServer(new ReflectResponder(UsersRPC.class, urpcImpl), usersRpcPort); 
... 

Это работает, но это выглядит как пустая трата для меня - я ищу способ использовать один сервер HTTP с двумя портами или двумя URLs на тот же порт (любой из этих вариантов хорош для меня), что-то вроде:

Server server = new new HttpServer(new ReflectResponder(AdministrationRPC.class, arpcImpl), adminRpcPort); 
server.addResponder(new ReflectResponder(UsersRPC.class, urpcImpl), usersRpcPort); 
... 

метод addResponder не существует, конечно, единственный метод, который похоже, это метод addConnector, но даже после тщательного поиска в Google я не смог найти, как применить его к моим потребностям.

Есть ли способ запустить двух респондентов Avro на одном и том же сервере http?

ответ

0

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

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); 
    } 
} 
Смежные вопросы