Spring Data ve Hibernate kullanan basit bir Tomcat webapp yapıyorum. Çok fazla iş yapan bir bitiş noktası var, bu yüzden işi bir arka plan iş parçacığına boşaltmak istiyorum, böylece iş yapılırken web isteği 10+ dakika boyunca askıda kalmaz. Yani bir bileşen scan'd paketinde yeni bir hizmet yazdı: Yay Verilerini ve Hazırda Bekletme'yi kullanırken arka plan iş parçacığını düzgün bir şekilde nasıl yaparım?
@Service
public class BackgroundJobService {
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
public void startJob(Runnable runnable) {
threadPoolTaskExecutor.execute(runnable);
}
}
Sonra baharda yapılandırılmış
ThreadPoolTaskExecutor
var:
<bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="5" />
<property name="maxPoolSize" value="10" />
<property name="queueCapacity" value="25" />
</bean>
Bu, tüm çalışma harika. Ancak, sorun Hibernate'den geliyor. Koşuculuğumun içinde sadece yarım iş var.
MyObject myObject = myObjectRepository.findOne()
myObject.setSomething("something");
myObjectRepository.save(myObject);
Ama tembel yüklenen alanları varsa, başarısız: Yapabileceğim
MyObject myObject = myObjectRepository.findOne()
List<Lazy> lazies = myObject.getLazies();
for(Lazy lazy : lazies) { // Exception
...
}
alıyorum aşağıdaki hata:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.stackoverflow.MyObject.lazies, could not initialize proxy - no Session
yüzden (bana öyle Hibernate görünüyor newbie) yeni iş parçacığının bu ev yapımı iş parçacığı üzerinde bir oturumu olmadığını, ancak Spring Data HTTP İstek iş parçacıkları için otomatik olarak yeni oturumlar oluşturuyor.
- Oturumun içinden yeni bir oturum başlatmak için bir yol var mı?
- Ya benim için bunu yapmak için iş parçacığı havuzu anlamanın bir yolu?
- Bu tür işleri yapmak için standart uygulama nedir?
Biraz bir @Transactional
yöntemi içinde her şeyi yaparak kendisine geçici bir çözüm mümkün oldum ama bu beni işe yöntemleri kullanmak izin vermez gibi çabuk, bu çok iyi bir çözüm değil öğreniyorum sadece web istekleri için iyi.
Teşekkürler. ne olur
Sorun, çalıştığı sırada işin durumunu güncelleyebilmek istiyorum. Bu yüzden hepsini tek bir işlemde sarsam, durum en fazla dışa aktarma işlemine kadar güncellenmez. Burada bir şey kaçırmadığım sürece ... ki bu tamamen mümkün :) – Joel
Runnable uygulama sınıfınızı ve belki ObjectRepository'nizi gösterebilir misiniz? Ayrıca, durum güncellemelerini nasıl ve nerede yayınlamayı planladığınızı merak ediyorum. http tabanlı web uygulamaları ile bu kadar açık değil. – alobodzk
Özellikle işlem durumunu güncellemek için: iç içe geçmiş bir işlem kullanın. JPA sağlayıcınızın bunları desteklediğinden emin olun. – Virmundi