2014-12-19 4 views
0

내 응용 프로그램 (java)에서는 RPC의 두 가지 유형, 즉 관리 RPC와 사용자 RPC를 지원해야합니다. 나는 현재 내가 다음과 같은 코드를 사용하여 두 HttpServers RPC 당 하나의 개방하고, 이러한 RPC를 만들 브로을 사용하고 있습니다 :이 작동하나 이상의 응답자가있는 HttpServer

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

을하지만 나를 위해 낭비처럼 - 나는 방법을 찾고 있어요 두 개의 포트 또는 동일한 포트에 두 URL을 하나의 HTTP 서버를 사용하여, 같은 것을 (이러한 옵션은 나를 위해 좋은) 다음 addResponder 방법은 물론 존재하지 않습니다

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

, 유일한 방법이 addConnector 메소드도 비슷하게 보입니다. 그러나 철저한 인터넷 검색을 한 후에도 내 요구에 적용하는 방법을 찾을 수 없었습니다.

동일한 http 서버에서 두 개의 avro responder를 시작할 수있는 방법이 있습니까?

답변

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