2012-10-19 27 views
5

Başlamak için, bu konudaki tartışmaları gözden geçirdim ve sorunuma bir yanıt bulamadım ve bu yüzden bu soruyu açıyorum.Maksimum iş parçacığı sorunu

Restlet 2.0.15 kullanarak bir web hizmeti kurdum. Uygulama yalnızca sunucu içindir. Sunucuya bağlantılar bir web sayfası üzerinden yapılır ve bu yüzden ClientResource kullanmamıştım. parçacığı havuzu sorunun tükenme verilen cevapların çoğu

#exhaust + #release

dahil edilmesini önerdi web hizmetinin süreci tek function.Receive olarak web sayfası, sorgudan GET isteklerini tarif edilebilir

veritabanı, sonuçları XML'de çerçevelendirip nihai gösterimi döndürür. BeforeHandle ve AfterHandle'ı geçersiz kılmak için bir Filtre kullandım.

bileşen oluşturma kodu için kod:

Component component = new Component(); 
component.getServers().add(Protocol.HTTP, 8188); 
component.getContext().getParameters().add("maxThreads", "512"); 
component.getContext().getParameters().add("minThreads", "100"); 
component.getContext().getParameters().add("lowThreads", "145"); 
component.getContext().getParameters().add("maxQueued", "100"); 
component.getContext().getParameters().add("maxTotalConnections", "100"); 
component.getContext().getParameters().add("maxIoIdleTimeMs", "100"); 
component.getDefaultHost().attach("/orcamento2013", new ServerApp()); 
component.start(); 

parametreleri verimliliğini en üst düzeye çabasıyla benim açımdan bu forum ve modifikasyon bir tartışma mevcut sonucudur. aşağıdaki gibi

uygulama gelince, kodu:

@Override 
public synchronized Restlet createInboundRoot() { 
    // Create a router Restlet that routes each call to a 
    // new instance of HelloWorldResource. 
    Router router = new Router(getContext()); 

    // Defines only one route 
    router.attach("/{taxes}", ServerImpl.class); 
    //router.attach("/acores/{taxes}", ServerImplAcores.class); 

    System.out.println(router.getRoutes().size()); 

    OriginFilter originFilter = new OriginFilter(getContext()); 
    originFilter.setNext(router); 

    return originFilter; 
} 

Çok, burada bir tartışma bulunan bir örnek filtre kullanılır. Uygulama aşağıdaki gibidir:

public class ServerImpl extends ServerResource { 

String itemName; 

@Override 
protected void doInit() throws ResourceException { 
    this.itemName = (String) getRequest().getAttributes().get("taxes"); 

} 

@Get("xml") 
public Representation makeItWork() throws SAXException, IOException { 

    DomRepresentation representation = new DomRepresentation(MediaType.TEXT_XML); 

    DAL dal = new DAL(); 

    String ip = getRequest().getCurrent().getClientInfo().getAddress(); 

    System.out.println(itemName); 

    double tax = Double.parseDouble(itemName); 

    Document myXML = Auxiliar.getMyXML(tax, dal, ip); 
    myXML.normalizeDocument(); 

    representation.setDocument(myXML); 

    return representation; 

} 

@Override 
protected void doRelease() throws ResourceException { 

    super.doRelease(); 

} 

} 
: Bu uyarıyı veren süreçleri çöküyor çünkü

public OriginFilter(Context context) { 
    super(context); 
} 

@Override 
protected int beforeHandle(Request request, Response response) { 
    if (Method.OPTIONS.equals(request.getMethod())) { 
     Form requestHeaders = (Form) request.getAttributes().get("org.restlet.http.headers"); 
     String origin = requestHeaders.getFirstValue("Origin", true); 


     Form responseHeaders = (Form) response.getAttributes().get("org.restlet.http.headers"); 
     if (responseHeaders == null) { 
      responseHeaders = new Form(); 
      response.getAttributes().put("org.restlet.http.headers", responseHeaders); 

      responseHeaders.add("Access-Control-Allow-Origin", origin); 
      responseHeaders.add("Access-Control-Allow-Methods", "GET,POST,DELETE"); 
      responseHeaders.add("Access-Control-Allow-Headers", "Content-Type"); 
      responseHeaders.add("Access-Control-Allow-Credentials", "true"); 
      response.setEntity(new EmptyRepresentation()); 
      return SKIP; 
     } 
    } 

    return super.beforeHandle(request, response); 
} 

@Override 
protected void afterHandle(Request request, Response response) { 

    if (!Method.OPTIONS.equals(request.getMethod())) { 
     Form requestHeaders = (Form) request.getAttributes().get("org.restlet.http.headers"); 
     String origin = requestHeaders.getFirstValue("Origin", true); 


     Form responseHeaders = (Form) response.getAttributes().get("org.restlet.http.headers"); 
     if (responseHeaders == null) { 
      responseHeaders = new Form(); 
      response.getAttributes().put("org.restlet.http.headers", responseHeaders); 

      responseHeaders.add("Access-Control-Allow-Origin", origin); 
      responseHeaders.add("Access-Control-Allow-Methods", "GET,POST,DELETE"); // 
      responseHeaders.add("Access-Control-Allow-Headers", "Content-Type"); 
      responseHeaders.add("Access-Control-Allow-Credentials", "true"); 

     } 
    } 

    super.afterHandle(request, response); 

    Representation requestRepresentation = request.getEntity(); 
    if (requestRepresentation != null) { 
     try { 
      requestRepresentation.exhaust(); 
     } catch (IOException e) { 
      // handle exception 
     } 

     requestRepresentation.release(); 
    } 

    Representation responseRepresentation = response.getEntity(); 
    if(responseRepresentation != null) { 
     try { 
      responseRepresentation.exhaust(); 
     } catch (IOException ex) { 
      Logger.getLogger(OriginFilter.class.getName()).log(Level.SEVERE, null, ex); 
     } finally { 

     } 

    } 

} 

responseRepresentation bir #release method yok WARNING: A response with a 200 (Ok) status should have an entity (...)

ServerResource uygulamasının kod şudur

Diğer konulardaki çözümleri denedim ancak bunların hiçbiri işe yaramıyor gibi görünüyor. İlk olarak, iş parçacığı havuzunun warnings state that the thread pool available is 10 olarak ayarlanan parametrelerle artırıldığı görünmüyor. Daha önce de belirtildiği gibi, maxThreads değerinin artışı sadece sonucu erteliyor gibi görünüyor.

Example: INFO: Worker service tasks: 0 queued, 10 active, 17 completed, 27 scheduled. 

Restlet version ile ilgili bazı hata olabilir, ama bu issue.The Web Servis çok değil günde yaklaşık 5000 istekleri, yaşıyor değildi doğrulamak için kararlı sürümü indirilebilir. Not:ServerResource or OriginFilter döner hata #release method biriyle yerleştirme ve sevk

("WARNING: A response with a 200 (Ok) status should have an entity (...)") kılavuzluk Lütfen uyarı. Teşekkürler!

cevap

1

Bu site numaralı belgeyi okuyarak, anlattığım sunucu tarafında bulunan sorun, Restlet dağıtımı 2.1 version'a yükseltilerek giderilmiştir. Bazı kodları değiştirmeniz gerekecektir. İlgili migration guide'a başvurmalısınız.

İlgili konular