2015-01-19 13 views
6

Sto lavorando su un progetto e sto cercando di creare un server in ascolto l'indirizzo localhost sulla porta 8082 (ho già 8081 riservata con un altro server)Jetty Server tornando sempre 404 con Handler

public class Class2HTTPServer { 
    public static void main(String[] args) { 
     Class1 object1= new Class1 (300);// parameter I need for other stuff 
     Class2 object2= new Class2 (300,object1,5); // parameters for other unrelated stuff 
     int listen_on_port = 8082; 
     Class2HTTPMessageHandler handler = new Class2HTTPMessageHandler (
      object2); 
     String server_port_string = System.getProperty(SystemConstants.PROPERTY_KEY_SERVER_PORT); 
     if(server_port_string != null) { 
      try { 
       listen_on_port = Integer.parseInt(server_port_string); 
       listen_on_portfs = Integer.parseInt(server_port_string); 
      } catch(NumberFormatException ex) { 
       System.err.println(ex); 
      } 
     } 
     ComponentHTTPServerUtility.createServer(listen_on_port, handler); 

    } 
} 

Questo è la classe ComponentHTTPServerUtility:

import java.net.InetAddress; 
import java.net.InetSocketAddress; 
import java.net.UnknownHostException; 
import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.server.handler.AbstractHandler; 

public class ComponentHTTPServerUtility { 
    /** 
    * Creates a server on the port and blocks the calling thread 
    * @param port 
    * @param handler 
    * @return 
    */ 
    public static boolean createServer(int port, AbstractHandler handler) { 
     Server server = new Server(port); 
     if (handler != null) { 
      server.setHandler(handler); 
     } 

     try { 
      server.start(); 
      server.join(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     return true; 
    } 

    /** 
    * Creates a server on the InetAddress and blocks the calling thread 
    * @param ipAddress 
    * @param port 
    * @param handler 
    * @return 
    */ 
    public static boolean createServer(String ipAddress, int port, 
      AbstractHandler handler) { 
     InetAddress inetIpAddress; 
     InetSocketAddress address; 
     Server server; 

     if (ipAddress == null) 
      return false; 

     try { 
      inetIpAddress = InetAddress.getByName(ipAddress); 
      address = new InetSocketAddress(inetIpAddress, port); 
     } catch (UnknownHostException ex) { 
      ex.printStackTrace(); 
      return false; 
     } 

     server = new Server(address); 
     if (handler != null) { 
      server.setHandler(handler); 
     } 

     try { 
      server.start(); 
      server.join(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     return true; 
    } 
} 

Quando eseguo Server ricevo il seguente messaggio nella console:

2015-01-19 13:13:49.451:INFO:oejs.Server:jetty-8.1.13.v20130916 
2015-01-19 13:13:49.501:INFO:oejs.AbstractConnector:Started [email protected]:8082 
.210

ma se vado con il mio browser per: http://localhost:8082/

ottengo l'errore 404. Tuttavia, se faccio lo stesso con l'altro server (porta 8081) ottengo una pagina vuota che indica che il server è in esecuzione.

Siamo spiacenti ma non riesco a entrare in uno specifico. Qualsiasi pensiero o suggerimento sarebbe molto apprezzato. Sono rimasto bloccato per ore.

Grazie

EDIT:

Questi sono i risultati che si ottengono per i server dopo l'inserimento della linea:

System.err.println (server.dump());

lavoro uno:

2015-01-19 15:37:05.600:INFO:oejs.Server:jetty-8.1.13.v20130916 
2015-01-19 15:37:05.651:INFO:oejs.AbstractConnector:Started [email protected]:8081 
[email protected] - STARTED 
+- [email protected] - STARTED 
| 
+- qtp831407528{8<=6<=8/254,0} - STARTED 
| +- 10 qtp831407528-10 TIMED_WAITING @ sun.misc.Unsafe.park(Native Method) IDLE 
| +- 11 qtp831407528-11 TIMED_WAITING @ sun.misc.Unsafe.park(Native Method) IDLE 
| +- 12 qtp831407528-12 TIMED_WAITING @ sun.misc.Unsafe.park(Native Method) IDLE 
| +- 13 qtp831407528-13 TIMED_WAITING @ sun.misc.Unsafe.park(Native Method) IDLE 
| +- 14 qtp831407528-14 Acceptor0 [email protected]:8081 RUNNABLE @ sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) 
| +- 15 qtp831407528-15 Selector0 RUNNABLE @ sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method) 
| +- 16 qtp831407528-16 TIMED_WAITING @ sun.misc.Unsafe.park(Native Method) IDLE 
| +- 17 qtp831407528-17 TIMED_WAITING @ sun.misc.Unsafe.park(Native Method) IDLE 
| 
+- [email protected]:8081 - STARTED 
    +- PooledBuffers [0/[email protected],0/[email protected],0/[email protected]]/PooledBuffers [0/[email protected],0/[email protected],0/[email protected]] - STARTED 
    +- org.eclipse.j[email protected]42557280 - STARTED 
    | +- [email protected] keys=0 selected=0 id=0 
    |  +- org.eclipse.jetty.io.nio.SelectorManager$SelectSet.doSelect(SelectorManager.java:569) 
    |  +- [email protected] keys=0 
    +- sun.nio.ch.ServerSocketChannelImpl[/0:0:0:0:0:0:0:0:8081] 
    +- qtp831407528{8<=6<=8/254,0} - STARTED 

e questi sono da non lavorare uno:

2015-01-19 15:37:23.231:INFO:oejs.Server:jetty-8.1.13.v20130916 
2015-01-19 15:37:23.280:INFO:oejs.AbstractConnector:Started [email protected]:8082 
[email protected] - STARTED 
+- [email protected]  - STARTED 
| 
+- qtp597321988{8<=6<=8/254,0} - STARTED 
| +- 10 qtp597321988-10 Selector0 RUNNABLE @ sun.nio.ch.WindowsSelectorImpl$SubSelector.poll0(Native Method) 
| +- 11 qtp597321988-11 TIMED_WAITING @ sun.misc.Unsafe.park(Native Method) IDLE 
| +- 12 qtp597321988-12 TIMED_WAITING @ sun.misc.Unsafe.park(Native Method) IDLE 
| +- 13 qtp597321988-13 TIMED_WAITING @ sun.misc.Unsafe.park(Native Method) IDLE 
| +- 14 qtp597321988-14 Acceptor0 [email protected]:8082 RUNNABLE @ sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) 
| +- 15 qtp597321988-15 TIMED_WAITING @ sun.misc.Unsafe.park(Native Method) IDLE 
| +- 16 qtp597321988-16 TIMED_WAITING @ sun.misc.Unsafe.park(Native Method) IDLE 
| +- 17 qtp597321988-17 TIMED_WAITING @ sun.misc.Unsafe.park(Native Method) IDLE 
| 
+- [email protected]:8082 - STARTED 
    +- PooledBuffers [0/[email protected],0/[email protected],0/[email protected]]/PooledBuffers [0/[email protected],0/[email protected],0/[email protected]] - STARTED 
    +- org.eclipse.j[email protected]7f39425c - STARTED 
    | +- [email protected] keys=0 selected=0 id=0 
    |  +- org.eclipse.jetty.io.nio.SelectorManager$SelectSet.doSelect(SelectorManager.java:569) 
    |  +- [email protected] keys=0 
    +- sun.nio.ch.ServerSocketChannelImpl[/0:0:0:0:0:0:0:0:8082] 
    +- qtp597321988{8<=6<=8/254,0} - STARTED 

La dichiarazione del gestore di base:

public class Class2HTTPMessageHandler extends AbstractHandler{ 
    private Class2 object= null; 

    public Class2HTTPMessageHandler(Class2 obj){ 
     object= obj; 
    } 
    @SuppressWarnings("unchecked") 
    public void handle(String target, Request baseRequest, 
      HttpServletRequest request, HttpServletResponse response) 
      throws IOException, ServletException { 
     MessageTag messageTag; 

     String requestURI; 
     Response fieldResponse = null; 
     response.setContentType("text/html;charset=utf-8"); 
     response.setStatus(HttpServletResponse.SC_OK); 
     requestURI = request.getRequestURI(); 
     if (!ComponentUtility.isEmpty(requestURI) 
       && requestURI.toLowerCase().startsWith("/stock")) { 
      messageTag = ComponentUtility.convertURItoMessageTag(requestURI 
       .substring(6)); // the request is from store 
      // manager, more 
      // sophisticated security 
      // features could be added 
      // here 
     } else { 
       messageTag = ComponentUtility.convertURItoMessageTag(requestURI); 
     } 
     // the RequestURI before the switch 
     if (messageTag == null) { 
       System.out.println("Unknown message tag"); 
     } else { 
      switch (messageTag) { 
       // handling of various messages 
      } 
     } 
    } 
} 

Sto cercando di inviare al server un tag messaggio e questa è l'eccezione che ottengo:

2015-01-19 18:16:43.739:WARN:oejs.AbstractHttpConnection:/MESSAGETAG 
java.lang.NullPointerException 
    at com.project.business.Class2.functionFoo(Class2.java:98) 
    at com.project.server.Class2HTTPMessageHandler.handle(Class2HTTPMessageHandler.java:69) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) 
    at org.eclipse.jetty.server.Server.handle(Server.java:370) 
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489) 
    at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:960) 
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1021) 
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865) 
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240) 
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) 
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:668) 
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) 
    at java.lang.Thread.run(Thread.java:745) 
+0

aggiungi dopo il 'server.start();' la riga 'System.err.println (server.dump());' e segnala i risultati. (È probabile che il gestore non sia stato impostato sul server). Includere anche il sorgente per 'Class2HTTPMessageHandler' (poiché esistono modi per codificare il gestore in modo che si verifichi ancora un 404) –

+0

@JoakimErdfelt ha appena aggiunto i risultati alla domanda – sokras

+0

Sembra che il gestore sia presente e avviato. (strano che tu abbia un gestore diverso nel primo contro il secondo). Cosa fa l'implementazione del gestore? Puoi includere la fonte per il gestore? (interessato alla dichiarazione e a tutte le manipolazioni delle varie manipolazioni di richieste, comprese le eventuali dichiarazioni di stato handle (d | r)) –

risposta

7

Quando si utilizzano i gestori, è necessario comunicare al server quando il gestore ha effettivamente gestito la richiesta.

Non dimenticare di chiamare baseRequest.setHandled(true);

Senza questa chiamata, il gestore si completa e poi si sposta sul prossimo gestore, che nel tuo caso sarebbe il gestore predefinito che restituisce 404.

Inoltre, quando lavorando con gli Handler, usa i parametri che ti dà l'Handler. Il parametro target avrà il percorso che è stato fornito, come è stato visto nella richiesta non elaborata.

Il comportamento request.getRequestURI() si basa su varie informazioni ServletContext e, in quanto tale, non è probabile che siano i risultati che ci si aspetta quando non si utilizza un ServletContext.

Nota: se si desidera, in realtà, un ServletContext e un normale comportamento servlet con l'utilizzo di ServletContextHandler e servlet reali, anche in modalità incorporata.See ManyServletContexts example.

Tuttavia, è ancora più semplice gestire questa situazione. Crea un ContextHandlerCollection e imposta ogni gestore del tuo in quella raccolta tramite un ContextHandler. Vedi lo ManyContexts example.

Esempio:

ContextHandlerCollection contexts = new ContextHandlerCollection(); 
server.setHandler(contexts); 

ContextHandler stock = new ContextHandler("/stock"); 
stock.setHandler(new Class2HTTPMessageHandler()); 
contexts.add(stock); 

Con questo, si può saltare l'intero controllo sul URI richiesto, e lasciare Jetty gestire questo.

Si noti che anche il Jetty utilizza il parametro target di un Handler per eseguire questa logica di contesto.

+1

GRAZIE GRAZIE! Sono rimasto bloccato per 2 giorni! : D – sokras

+1

il benvenuto, corretto il titolo per essere un po 'più accurato del problema. –

+0

Sì, come menzionato da Joakim, baseRequest.setHandled (true) deve essere eseguito dal codice del gestore, dopo che l'elaborazione della richiesta è stata completata. –

Problemi correlati