2016-04-05 29 views
1

Herhangi bir bağlam belirtilmemiş ve bağlam işleyicisi olmayan bir jetty örneğini başlatmak, ardından sunucu başladıktan sonra buna bağlam eklemeyi sürdürmek doğru mudur? Her ne kadar değiştirilebilen HandlerCollection kullanarak bunu yapabildiysem ve günlükler Sunucu ve İçerikler'in başlatıldığını ve kullanılabilir olduğunu söylese de, URL ile ona erişemiyorum. Veya başlatırken sunucuya en az bir kök bağlam ve contexthandler ekleyelim mi?Gömülü İskele - Jetty Sunucusunu başlattıktan sonra Bağlam Ekleme

Aşağıdaki bağlantıda önerilen örneğe benzer bir şey yaptım. Jetty 9 (embedded): Adding handlers during runtime

Benim dalgakıran sürümü çalıştıran sunucuya işleyicileri eklenmesi yaygın bir kalıptır 9.3.7.v20160115

cevap

3

ama dokümantasyon (hiç belli değil "gömme dalgakıran" öğretici tüm örnekler sonra yapılandırmayı sunucusunu başlangıç) AFAIK insanların bu yaklaşımları takip ediyor. /) işleyicileri

2 kaldırmak ekleyebilir ve eli başlatmak

1) eklemek için HandlerCollection (boolean mutableWhenRunning) ctor kullanılarak Açıkça

Jetty 9.1.4'te # 2'ye ihtiyaç duyulmadığını gözlemledim, ancak Jetty 9.2.14'te ve daha sonra (BTW bu sürüm numaraları Maven tarafından Jersey'in bağımlılıkları olarak bu konuyla tamamen ilgisiz olarak seçildi.) Örneğin: daha sonra

import java.lang.reflect.Method; 
import java.net.InetSocketAddress; 

import javax.jws.WebService; 
import javax.xml.ws.Endpoint; 

import org.eclipse.jetty.http.spi.JettyHttpServerProvider; 
import org.eclipse.jetty.http.spi.HttpSpiContextHandler; 
import org.eclipse.jetty.http.spi.JettyHttpContext; 
import org.eclipse.jetty.http.spi.JettyHttpServer; 
import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.server.handler.ContextHandlerCollection; 

import com.sun.net.httpserver.HttpContext; 

public class JettyJaxWs { 

    public static void main(String[] args) throws Exception { 
     Server server = new Server(7777); 
     ContextHandlerCollection contextHandlerCollection = new ContextHandlerCollection(); 
     server.setHandler(contextHandlerCollection); 
     server.start(); 
     HttpContext context = buildOrig(server, "/ws"); 
     MyWebService ws = new MyWebService(); 
     Endpoint endpoint = Endpoint.create(ws); 
     endpoint.publish(context); 
     // access wsdl on http://localhost:7777/ws/MyWebService?wsdl 
    } 

    @WebService 
    public static class MyWebService { 

     public String hello(String s) { 
      return "hi " + s; 
     } 
    } 

    public static HttpContext buildOrig(Server server, String contextString) throws Exception { 
     JettyHttpServerProvider.setServer(server); 
     return new JettyHttpServerProvider().createHttpServer(new InetSocketAddress(7777), 5).createContext(contextString); 
    } 

:

bu bir SOAP bağlam eklemek için
// after server creation ... 
    ContextHandlerCollection contextHandlerCollection = new ContextHandlerCollection(); 
      jettyServer.setHandler(contextHandlerCollection); 
    jettyServer.start(); 
    // ... 
    ServletContextHandler newSCH= new ServletContextHandler(ServletContextHandler.SESSIONS); 
     newSCH.setResourceBase(System.getProperty("java.io.tmpdir")); 
     newSCH.setContextPath("/servlets"); 
     ServletHolder newHolder = new SwServletHolder(servlet); 
     newSCH.addServlet(newHolder, "/*"); 
     contextHandlerCollection.addHandler(newSCH); 
     try { 
       newSCH.start(); // needed from about 9.2 
     } catch (Exception e) { 
       logger.info("Exception starting ServletContextHandler for Jetty", e); 
     } 

9.2.14 üzerinde 9.1.4 (üzerinde "çalışmak için kullanılan" bir kod 404 bildiriyor) 'dir , Son yöntem için bunu yapmak zorundaydım (daha iyi bir yol olup olmadığından emin değil):

public static HttpContext buildNew(Server server, String contextString) { 
     JettyHttpServer jettyHttpServer = new JettyHttpServer(server, true); 
     JettyHttpContext ctx = (JettyHttpContext) jettyHttpServer.createContext(contextString); 
     try { 
      Method method = JettyHttpContext.class.getDeclaredMethod("getJettyContextHandler"); 
      method.setAccessible(true); 
      HttpSpiContextHandler contextHandler = (HttpSpiContextHandler) method.invoke(ctx); 
      contextHandler.start(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return ctx; 
    }