2015-01-19 6 views
6

Я работаю над проектом, и я пытаюсь создать сервер прослушивания в адрес локального хоста на порт 8082 (у меня уже есть 8081 зарезервировано с другим сервером)Jetty сервер всегда возвращался 404 с обработчиком

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

    } 
} 

Этих класс 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; 
    } 
} 

При запуске сервера я получаю следующее сообщение в консоли:

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 

Но если я иду с моим браузером, чтобы: http://localhost:8082/

Я получаю ошибку 404. Однако, если я делаю то же самое с другого сервера (порт 8081) Я получаю пустую страницу о том, что сервер запущен.

Извините, но я не могу уточнить. Любые мысли или предложения будут высоко оценены. Я застрял в этом часами.

Благодаря

EDIT:

Таковы результаты я получаю для обоих серверов после вставки строки:

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

Работая один:

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 

И это от не работает один:

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 

Основная декларация обработчика:

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

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

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

добавить после 'server.start();' строка 'System.err.println (server.dump());' и сообщить результаты. (Вероятно, что обработчик не был установлен на сервере). Также включите источник для Class2HTTPMessageHandler (так как есть способы закодировать обработчик, чтобы все еще выполнялось 404) –

+0

@JoakimErdfelt просто добавил результаты в вопрос – sokras

+0

Похоже, что обработчик присутствует и запускается. (странно, что у вас есть другой обработчик в первом по сравнению с вторым). Что делает реализация обработчика? Можете ли вы включить источник для обработчика? (заинтересованы в декларации и всех манипуляциях с различными манипуляциями с запросами, включая любые декларации состояния дескриптора (d | r)) –

ответ

7

При использовании обработчиков вы должны сообщить серверу, когда обработчик действительно обработал запрос.

Не забудьте позвонить baseRequest.setHandled(true);

Без этого вызова, обработчик завершения, а затем переходит к следующему обработчику, который в вашем случае будет по умолчанию обработчик, который возвращает 404.

Кроме того, когда работая с обработчиками, используйте параметры, которые дает вам Handler. Параметр target будет иметь путь, который был предоставлен, как это было видно по необработанному запросу.

Поведение request.getRequestURI() зависит от различных данных ServletContext и поэтому вряд ли будет ожидаемым результатом, если вы не используете ServletContext.

Примечание: если вы действительно хотите ServletContext, и нормальное поведение сервлета может быть выполнено с использованием ServletContextHandler и реальных сервлетов, также в встроенном режиме.See ManyServletContexts example.

Однако, это еще проще справиться с этой ситуацией. Создайте ContextHandlerCollection и установите каждый обработчик в эту коллекцию с помощью ContextHandler. См. ManyContexts example.

Пример:

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

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

При этом, вы можете пропустить всю проверку на запрашиваемом URI, и пусть Jetty справиться с этим.

Следует отметить, что даже Jetty использует параметр target для Handler для выполнения этой контекстной логики.

+1

СПАСИБО СМОТРЕТЬ! Я застрял в течение 2 дней! : D – sokras

+1

ваш прием, только что зафиксировал заголовок, чтобы быть более точным в этой проблеме. –

+0

Да, как отметил Joakim, baseRequest.setHandled (true) должен выполняться из кода обработчика после завершения обработки запроса. –

Смежные вопросы