2015-01-19 7 views
6

मैं एक परियोजना पर काम कर रहा हूँ के साथ 404 लौटाने और मैं एक सर्वर पोर्ट 8082 पर स्थानीय होस्ट पते में सुन (मैं पहले से ही 8081 है एक और सर्वर के साथ सुरक्षित)जेट्टी सर्वर हमेशा हैंडलर

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 
,210

लेकिन अगर मैं करने के लिए अपने ब्राउज़र के साथ जाना: http://localhost:8082/

मैं त्रुटि 404. मिल हालांकि मैं यह दर्शाता है कि सर्वर चल रहा है एक रिक्त पृष्ठ मिल अगर मैं अन्य सर्वर (पोर्ट 8081) के साथ भी ऐसा ही।

क्षमा करें, लेकिन मैं और अधिक विशिष्ट नहीं हो सकता। किसी भी विचार या सुझाव की अत्यधिक सराहना की जाएगी। मैं घंटों तक इस पर अटक गया हूं।

धन्यवाद

संपादित करें:

इन परिणामों लाइन डालने के बाद मैं दोनों सर्वर के लिए मिल रहे हैं:

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()) 'के बाद जोड़ें, और परिणामों की रिपोर्ट करें। (इसकी संभावना है कि हैंडलर सर्वर पर सेट नहीं किया गया था)। 'क्लास 2 एचटीटीपी मैसेज हैंडलर' के लिए स्रोत भी शामिल करें (क्योंकि हैंडलर को कोड करने के तरीके हैं ताकि 404 अभी भी हो) –

+0

@ जोकिमइर्डफेल ने केवल – sokras

+0

प्रश्न में परिणाम जोड़े हैं जैसे हैंडलर मौजूद है और शुरू हुआ है। (अजीब है कि आपके पास पहले एक बनाम दूसरे में एक अलग हैंडलर है)। हैंडलर कार्यान्वयन क्या करता है? क्या आप हैंडलर के लिए स्रोत शामिल कर सकते हैं? (घोषणा में दिलचस्पी है, और किसी भी हैंडल (डी | आर) राज्य घोषणाओं सहित विभिन्न अनुरोध मैनिपुलेशन के सभी हेरफेर) –

उत्तर

7

हैंडलर का उपयोग करते समय आपको सर्वर को बताना होगा जब आपके हैंडलर ने वास्तव में अनुरोध को संभाला है।

इस कॉल के बिना baseRequest.setHandled(true);

कॉल करने के लिए मत भूलना, हैंडलर पूरा करता है और फिर अगले हैंडलर है, जो अपने मामले में डिफ़ॉल्ट हैंडलर कि 404.

रिटर्न भी हो सकता है, जब पर ले जाता है हैंडलर के साथ काम करना, हैंडलर आपको दिए गए पैरामीटर का उपयोग करें। 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); 
इस के साथ

, आप अनुरोधित URL पर पूरी जांच को छोड़, और जेट्टी कि संभाल कर सकते हैं।

यह ध्यान दिया जाना चाहिए कि जेटी भी इस संदर्भ तर्क को करने के लिए Handler के target पैरामीटर का उपयोग करता है।

+1

आपको नहीं मिल सकता है! मैं 2 दिनों के लिए अटक गया था! : डी – sokras

+1

आपका स्वागत है, समस्या के लिए थोड़ा और सटीक होने के लिए शीर्षक को ठीक करें। –

+0

हां, जैसा कि जोकिम ने उल्लेख किया है, अनुरोध की प्रक्रिया पूरी होने के बाद, बेसआरक्वेट.सेट हैंडल (सत्य) हैंडलर कोड के भीतर से किया जाना है। –

संबंधित मुद्दे