2011-08-22 6 views
33

Web uygulamasında 20 saniyeden uzun süren bazı istekler var. Ancak bazı durumlarda kod, sonsuz döngüye veya sunucuyu yavaşlatan benzer bir şeye yol açabilir.Tomcat istek zaman aşımı

Sunucu tarafında 60 saniyelik bir istek zaman aşımı yapmak istiyorum. Bu tomcat'ta uygulandı mı?

, Horatiu teşekkür ederiz

+0

Eğer 'socket' ve' ServerSocket' kullanıyorsunuz kullanılır? çünkü eğer öyleyse, zaman aşımını orada 'SetSoTimeout' yöntemiyle ayarlayabilirsiniz. –

+0

Sadece düz tomcat –

+0

@Eran, o web uygulaması geliştiriyor. Tomcat tarafından açılan sunucu soketini açamaz. – AlexR

cevap

37

Tomcat 7 ile StuckThreadDetectionValve ekleyebilir ve "sıkışmış" konuları tanımlamanızı sağlayabilirsiniz.Sen set-up uygulamaların Bağlam elemanda vanayı Eğer tespit yapmak istiyorum burada:

<Context ...> 
    ... 
    <Valve 
    className="org.apache.catalina.valves.StuckThreadDetectionValve" 
    threshold="60" /> 
    ... 
</Context> 

Bu tomcat içine girdi 60 saniyeden fazla süren herhangi bir iş parçacığı, olur için log WARN yazardım uygulamaları tanımlamanızı ve hatalı olduklarından bunları yasaklamanızı sağlar.

source code'a dayanarak, ipliği durdurmaya çalışan kendi valfinizi yazabilirsiniz, ancak bu, iş parçacığı havuzu üzerinde etkilere neden olabilir ve bununla birlikte Java'da bir iş parçacığını no reliable way durdurur. zaman aşımına ne gibi sn için ayarlar 45 de gösterildiği gibi iplik ...

+1

Bu iş parçacığı (sözünü ettiğiniz gibi güvenilir değil) öldürmek yerine, runtimeexception atmak yeterlidir –

9

sonra bir zaman aşımı ayarı, çok uzun çalışan bir istek önlemek çalışıyorsanız Sen server.xml

<Connector URIEncoding="UTF-8" 
    acceptCount="100" 
    connectionTimeout="20000" 
    disableUploadTimeout="true" 
    enableLookups="false" 
    maxHttpHeaderSize="8192" 
    maxSpareThreads="75" 
    maxThreads="150" 
    minSpareThreads="25" 
    port="7777" 
    redirectPort="8443"/> 
+0

Sadece başvurumu etkilemenin bir yolu var mı? –

+1

Zaman aşımını sunucudan ne zaman etkileyemezsiniz AFAIK Yanlış olabilir – Chris

+6

BağlantıTimeout, Tomcat'in bağlantı kurulduktan sonra http istek satırı için ne kadar bekleyeceğidir. Sunucunun, işlemin sonlandırılması için sunucunun ne kadar bekleyeceğini etkilemez. – Dave

19

varsayılan zaman aşımına ayarlayabilirsiniz Tomcat sana yardım etmeyecek. Chris'in dediği gibi, Tomcat için global zaman aşımı değerini ayarlayabilirsiniz.

JK da istek yanıtları bir zaman aşımı kullanabilirsiniz: Ama The Apache Tomcat Connector - Generic HowTo Timeouts itibaren Yanıtla Zaman Aşımı bölümüne bakın. Bu zaman aşımı, yanıtının tam işlem süresini ölçmez. Bunun yerine, kontrol eder, ardışık yanıt paketleri arasında ne kadar zamana izin verilir. Çoğu durumda, aslında bunun istediği şey budur. Örneğin, uzun koşu yüklemelerini düşünün. İndirmeler birkaç dakika sürebileceğinden, etkin bir global yanıt zaman aşımı ayarlayamazsınız. Çoğu uygulama, yanıtı döndürmek için başlamadan önce sınırlı işlem süresine sahiptir. Bu uygulamalar için bir açık yanıt zaman aşımı ayarlayabilirsiniz. Yanıtla uyumlu olmayan uygulamalar zaman aşımları, uzun işlem sürelerini gözlemlemesi beklenen yığın tipi uygulamalar, veri ambarı ve raporlama uygulamalardır.

JK bir yanıt beklemeyi bekliyorsa, bir yanıt zaman aşımına uğradığı için, arka uçta işlemeyi durdurmanın bir yolu yoktur. Web sunucunuzda işlem kaynaklarını ücretsiz olarak kullanmanıza rağmen, istek arka uçta çalıştırmaya devam eder - yanıt zaman aşımına uğramadan bir sonuç göndermek için herhangi bir yol göndermeden.

Yani Tomcat servlet zaman aşımı süresi içinde yanıt vermedi ve kullanıcıya, bir yanıt geri gönderir ancak çalışan iş parçacığı durdurmaz tespit eder. Yapmak istediğin şeyi başarabileceğini sanmıyorum.

+0

Belki jboss içinde? Google uygulama motoru bunu yaptı, 30 saniye ya da bunun gibi bir şey –

+3

Link güncel değil – rouan

1

Bu makalede, zaman aşımlarını sunucu düzeyinde ayarlama hakkında konuşuyor. http://www.coderanch.com/t/364207/Servlets/java/Servlet-Timeout-two-ways

Uygulamanın sonsuz döngüye girmesine neden olan nedir? Başka kaynaklara bağlantı açarsanız, zaman aşımlarını bu bağlantılara koymak ve bu zaman aşımı gerçekleştiğinde uygun yanıt göndermek isteyebilirsiniz.

+0

Neden bunun üzerinde bir işaret var? Cevap, burada yayınlanan soruyla ilgilidir. – thcricketfan

+4

Sanırım oylama yapıldığı için makale hakkında ** oturum ** zaman aşımları –

-6

özelliklerini değiştirin, tomcat sunucu çift tıklama "localhostta Tomcat v7.0 Sunucusu" olarak, Eclipse

Eclipse

yılında tomcat ekle

+2

Belki de sunucu başlangıç ​​zaman aşımını karıştırıyor musunuz zaman aşımı kendisi ister misiniz? –

+0

soru, http istek zaman aşımı hakkında konuşuyor, başlangıç ​​/ bitiş zaman aşımı –

-1

Çözüm po içermeyen herkes için benim gibi yukarıda takıldıkça bir zamanlayıcıyı kendiniz uygulayabilirsiniz ve bir çalışma zamanı istisnası atayarak istek yürütme işlemini durdurabilirsiniz. Bir şey gibi aşağıda:

    try 
       { 
        timer.schedule(new TimerTask() { 
         @Override 
         public void run() { 
         timer.cancel(); 
         } 
        }, /* specify time of the requst */ 1000); 
       } 
       catch(Exception e) 
       { 
        throw new RuntimeException("the request is taking longer than usual"); 
       } 

veya tercihen java guava timeLimiter here

+1

downvote için nedir? – george