2016-05-26 2 views
2

Мы используем Jetty 9.3 и публикуем несколько конечных точек webservice (используя Endpoint.publish). Однако я не уверен, как публиковать некоторые из них на другом TCP-порту.Jetty публикует конечные точки на нескольких портах TCP

Endpoint публикации:

endpoint = Endpoint.publish("http://0.0.0.0:8081/services/Service1"), service1); 
endpoint = Endpoint.publish("http://0.0.0.0:8081/services/Service2"), service2); 
endpoint = Endpoint.publish("http://0.0.0.0:8082/services/Service3"), service3); 

Ожидая: Make Service 1 и 2 доступны на порту 8081 и только 8081 и service3 на порту 8082 и только 8082.

Актуально: Все три услуги доступный на обоих портах TCP.

Настройка использовать наш встроенный причал с помощью:

JettyHttpServerProvider.setServer(jettyWebServer); 
System.setProperty("com.sun.net.httpserver.HttpServerProvider", JettyHttpServerProvider.class.getName()); 

Для полноты Пристани веб-сервер инициализация:

jettyWebServer = new Server(new DelegatingThreadPool(new QueuedThreadPool())); 
ServerConnector connector = new ServerConnector(jettyWebServer); 
//connector.setHost(); 
connector.setPort(8081); 
jettyWebServer.addConnector(connector); 

бы добавить это для второго порта еще публикация Endpoint не будет работать на Обслуживание3:

connector = new ServerConnector(jettyWebServer); 
//connector.setHost(...); 
connector.setPort(8082); 
jettyWebServer.addConnector(connector); 
ContextHandlerCollection contexts = new ContextHandlerCollection(); 
jettyWebServer.setHandler(contexts); 

Но тогда все три доступны на обоих портах 8081 и 8082. C an't настроил более одного экземпляра сервера причала, чтобы справиться с этим, кажется, доступен только один набор доступных методов: JettyHttpServerProvider.setServer(...), без добавления или подобного.

Любая помощь приветствуется.

ответ

3

Я был в состоянии получить эту работу пути создания двух Jetty Server экземпляров и установки глобального JettyHttpServerProvider.server статического поля с различными экземплярами следующим образом:

package com.scotth.jettypublish; 

import javax.xml.ws.Endpoint; 

import org.eclipse.jetty.http.spi.DelegatingThreadPool; 
import org.eclipse.jetty.http.spi.JettyHttpServerProvider; 
import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.server.ServerConnector; 
import org.eclipse.jetty.server.handler.ContextHandlerCollection; 
import org.eclipse.jetty.util.thread.QueuedThreadPool; 

import com.scotth.jettypublish.ws.HelloWorld; 
import com.scotth.jettypublish.ws.impl.HelloWorldImplOne; 
import com.scotth.jettypublish.ws.impl.HelloWorldImplThree; 
import com.scotth.jettypublish.ws.impl.HelloWorldImplTwo; 

public class PublishTesterMain { 

    public static void main(String[] args) throws Exception { 

     Server ws1 = new Server(new DelegatingThreadPool(new QueuedThreadPool())); 
     ServerConnector connector = new ServerConnector(ws1); 
     connector.setPort(8081); 
     ws1.addConnector(connector); 
     ContextHandlerCollection contexts = new ContextHandlerCollection(); 
     ws1.setHandler(contexts); 

     Server ws2 = new Server(new DelegatingThreadPool(new QueuedThreadPool())); 
     ServerConnector connector2 = new ServerConnector(ws2); 
     connector2.setPort(8082); 
     ws2.addConnector(connector2); 
     ContextHandlerCollection contexts2 = new ContextHandlerCollection(); 
     ws2.setHandler(contexts2); 

     System.setProperty("com.sun.net.httpserver.HttpServerProvider", JettyHttpServerProvider.class.getName()); 

     HelloWorld service1 = new HelloWorldImplOne(); 
     HelloWorld service2 = new HelloWorldImplTwo(); 

     JettyHttpServerProvider.setServer(ws1); 
     Endpoint.publish("http://0.0.0.0:8081/services/Service1", service1); 
     Endpoint.publish("http://0.0.0.0:8081/services/Service2", service2); 
     ws1.start(); 

     HelloWorld service3 = new HelloWorldImplThree(); 

     JettyHttpServerProvider.setServer(ws2); 
     Endpoint.publish("http://0.0.0.0:8082/services/Service3", service3); 
     ws2.start(); 
     Thread.sleep(Long.MAX_VALUE); 
    } 

} 

После запуска этого основного метода, который я наблюдал следующий печататься со стандартом из:

2016-05-31 22:38:54.818:INFO::main: Logging initialized @212ms 
2016-05-31 22:38:55.807:INFO:oejs.Server:main: jetty-9.3.z-SNAPSHOT 
2016-05-31 22:38:55.870:INFO:oejsh.ContextHandler:main: Started [email protected]{/services/Service1,null,AVAILABLE} 
2016-05-31 22:38:55.870:INFO:oejsh.ContextHandler:main: Started [email protected]{/services/Service2,null,AVAILABLE} 
2016-05-31 22:38:55.901:INFO:oejs.AbstractConnector:main: Started [email protected]{HTTP/1.1,[http/1.1]}{0.0.0.0:8081} 
2016-05-31 22:38:55.902:INFO:oejs.Server:main: Started @1299ms 
2016-05-31 22:38:55.939:INFO:oejs.Server:main: jetty-9.3.z-SNAPSHOT 
2016-05-31 22:38:55.939:INFO:oejsh.ContextHandler:main: Started [email protected]{/services/Service3,null,AVAILABLE} 
2016-05-31 22:38:55.941:INFO:oejs.AbstractConnector:main: Started [email protected]{HTTP/1.1,[http/1.1]}{0.0.0.0:8082} 
2016-05-31 22:38:55.942:INFO:oejs.Server:main: Started @1339ms 

запрашивающая http://localhost:8081/services/Service1 и http://localhost:8081/services/Service2 дали ожидаемый веб-службы конечной точки поздравительную страницу, в то время как у http://localhost:8081/services/Service3 ielded a HTTP 404. Запрос http://localhost:8082/services/Service3 дал ожидаемую третью страницу приветствия конечных точек службы.

Чтобы завершить пример кода (хотя и не обязательно, если у вас уже есть объекты доступны ваши осущ услуг), вот интерфейс службы конечной точки я (тот же интерфейс для трех impls):

package com.scotth.jettypublish.ws; 

import javax.jws.WebMethod; 
import javax.jws.WebService; 

@WebService 
public interface HelloWorld { 

    @WebMethod 
    String sayHello(String name); 
} 

Вот три реализации веб-службы, используемые в Endpoint.publish() вызовов продемонстрировали:

One:

package com.scotth.jettypublish.ws.impl; 

import javax.jws.WebService; 

import com.scotth.jettypublish.ws.HelloWorld; 

@WebService(endpointInterface = "com.scotth.jettypublish.ws.HelloWorld") 
public class HelloWorldImplOne implements HelloWorld { 

    @Override 
    public String sayHello(String name) { 
     return "ONE Hello " + (name == null ? "World" : name); 
    } 

} 

Two:

package com.scotth.jettypublish.ws.impl; 

import javax.jws.WebService; 

import com.scotth.jettypublish.ws.HelloWorld; 

@WebService(endpointInterface = "com.scotth.jettypublish.ws.HelloWorld") 
public class HelloWorldImplTwo implements HelloWorld { 

    @Override 
    public String sayHello(String name) { 
     return "TWO Hello " + (name == null ? "World" : name); 
    } 

} 

Три:

package com.scotth.jettypublish.ws.impl; 

import javax.jws.WebService; 

import com.scotth.jettypublish.ws.HelloWorld; 

@WebService(endpointInterface = "com.scotth.jettypublish.ws.HelloWorld") 
public class HelloWorldImplThree implements HelloWorld { 

    @Override 
    public String sayHello(String name) { 
     return "THREE Hello " + (name == null ? "World" : name); 
    } 

} 
+0

Спасибо, отлично работает. Почти чрезмерно отличный ответ, хорошо сделано и очень ценится. –