İş parçacığı devam ederken ana iş parçacığı RESTful web hizmetinde sonlandırılabilir mi?

Her 10 saniyede bir başka işlem tarafından çağrılacak bir Java RESTful web servisim var. Koşullar doğruysa, web servisinin potansiyel olarak kapsamlı bir ETL işlemi gerçekleştirmesi gerekir (10 - 20 saniye arası). Bununla birlikte, çağrı yükünün, web servisine başarıyla yüklendiğini gösteren çağrıya hemen geri dönmek istiyoruz.

Gereksinimlerin Özeti:

  • Doğrulama ve giriş parametrelerini doğrulayın.
  • Doğrulama başarısız olursa, XML'de hata döndürün.
  • ETL işlemini gerçekleştiren iş parçacığı başlat. İşlem sadece belirli koşullar altında ilerleyecektir.
  • Gönderilen yükü gösteren XML'yi ve aktarılan girişin geçerliliğini geri döndür.

Bunu kodladım ve doğru şekilde çalışıyor gibi görünüyor. Ama bu doğru görünmüyor. Oluşturduğum iş parçacığı, ana web hizmeti iş parçacığından daha uzun süre çalışacak.

Bunu yapmanın daha iyi bir yolunu işaret etmek isteyen var mı?

1

3 cevap

Bunu yapmak için doğru yol budur. Çözüm hakkında “doğru görünmeyen” nedir?

Benim tek önerim, sadece willy-nilly konuları başlatmamalısınız. Bu ETL işlem iş parçacıklarını yöneten bir çeşit ExecutorService olmalıdır. Bu, başlatılan ve hala çalışmakta olanların görünürlüğünü ve arka plan süreçlerinin sayısını sınırlama/kontrol etme yeteneğini (ve potansiyel olarak herhangi bir sahtekar yürütme ile ilgilenme) sağlayacaktır.

Ayrıca başlatılan işlem için bir çeşit "jobId" oluşturmak ve bunu arayan kişiye iade etmek isteyebilirsiniz. daha sonra bir istemcinin işin durumunu kontrol etmek için kullanabileceği bir aramayı ekleyebilirsiniz.

1
katma
fikirler için teşekkür ederiz. Bir singletonda bir ExecutorService uyguladım. Ayrıca thread sınıfımdaki Callable <> arayüzünü kullanıyorum, böylece konuların sonuçlarını takip edebilir ve daha sonra kaçak iş parçacıklarını kontrol etmek için bazı kodları tanıtabiliyorum.
katma yazar BigRedBettaFish, kaynak

Alternatif olarak, görevi teslim etme ve görevi yürütme sorumluluklarını ayırabilirsiniz. Gönderme bölümünüz zaten var - web servisleriniz talebi alıyor, onaylıyor, ancak hemen yürütmek için bir iş parçacığı oluşturmak yerine, onu harici bir mağazada saklayabilirsiniz.

Sonra yeni görevleri almak ve bunları çalıştırmak için cron üzerinde çalışan basit bir zamanlanmış görev (Quartz) var.

Bu yaklaşımın avantajları, daha güçlü bir ayrıştırma ve daha fazla sistem esnekliğidir (web servisi kapalı olmak, görev yürütmeyi etkilemez ve tersi). Conlar, sistemdeki daha hareketli parçalardır (bileşenler).

Her durumda mevcut kurulumunuz çalışıyor ve doğru yoldasınız.

0
katma

... Ancak, hemen çağrı yapan uygulamaya dönmek istiyoruz   yükün başarılı bir şekilde web servisine iletildiğini gösteren ...

Doğrulama/başarısızlık mesajını doğrudan doğrulamanın ardından başarılı bir şekilde iade etmek istediğiniz gibi geliyor ve başarılı bir talebin yanıtını içeriyorsa tekrar.

Teknik bir neden olmamakla birlikte, bu durumun işe yaramayacağı, tipik RESTful web hizmeti değişimlerinde, istek üzerine bire-bir HTTP çağrısı söz konusudur; bu mimari, bir talep için potansiyel olarak iki yanıtı geri vererek kırılacaktır. Bu muhtemelen siz ya da şirketiniz olmayan müşterileri karıştırır.

İlk hizmet isteğinde döndürülen bir biletle eşzamansız olarak sorgulanabilecek ek bir geri bildirim hizmeti uygulamanızı öneririz. Bu, işleminizin sonucunu iade etmeyi beklerken servis 1'i engellememe ek avantajına sahiptir.

İşleminiz için başka bir iş parçacığı başlatmak, yükünüz düşük olduğu sürece iyi olur. Çok yüksek olursa istekleriniz daha fazla iş parçacığı başlayamayacağınız zaman zaman aşımına başlayacaktır.

0
katma