2011-05-04 9 views
12

Yay fasulyesinin yok etme yönteminde, veritabanındaki bazı öğeleri temizlemek için bazı sorgular yürütmek istiyorum. Bahar, bunu bulabildiğim herhangi bir yolla buna izin vermiyor gibi görünüyor.Bir baharlık fasulyede, işlemleri kullanabilen bir kapatma yöntemine sahip olmak mümkün müdür?

hata her zamanki gibi bir şeydir: isimde fasulye başarısız yöntemi yok arasında

Invocation 'someBean': org.springframework.beans.factory.BeanCreationNotAllowedException: adı ile oluşturma hatası fasulye ' transactionManager ': Bu fabrikanın tekilleri imhası sırasında tekil çekirdeği oluşturulmasına izin verilmez (yok bir BeanFactory'den bir yok yöntemiyle uygulamasında!)

Aşağıdakiler, fasulyeye artık ihtiyaç duyulmadığında shutdownDestroy'u çağırmak için yayı bildirecektir. Ancak, işlemleri kullanmaya çalışırken yukarıdaki hatayı alıyorum.

<bean class="org.springframework. ... .CommonAnnotationBeanPostProcessor"/> 

ve sonra @PreDestroy ile yöntemini işaretlemek: Kullandığım ortak yaşam döngüsü ek açıklamaları etkinleştirdiğinizde

<bean id="someId" name="someName" class="someClass" 
destroy-method="shutdownDestroy"/> 

aynı durum geçerlidir. Bu yöntem, işlemleri de kullanamaz.

Bunu yapmanın bir yolu var mı?

EDIT: Teşekkürler! Bean'in SmartLifecycle'ı uygulayıp aşağıdakileri ekledim ve çok güzel çalışıyor.

private boolean isRunning = false; 

@Override 
public boolean isAutoStartup() {return true;} 

@Override 
public boolean isRunning() {return isRunning;} 

/** Run as early as possible so the shutdown method can still use transactions. */ 
@Override 
public int getPhase() {return Integer.MIN_VALUE;} 

@Override 
public void start() {isRunning = true;} 

@Override 
public void stop(Runnable callback) { 
    shutdownDestroy(); 
    isRunning = false; 
    callback.run(); 
} 

@Override 
public void stop() { 
    shutdownDestroy(); 
    isRunning = false; 
} 
+0

Ben senin yöntemin shutdownDestroy() @Transactional ek açıklama vardır varsayıyorum? Sorgularınızı bu yöntemde nasıl yürütüyorsunuz? Bunu bahar tarafından otomatikleştirilmiş bir EntityManager ile yapmaya çalışıyorum. Otomatik kablolama işleri iyi çalışıyor, ancak sorgumu yürütmeye çalıştığımda aşağıdakileri elde ediyorum: javax.persistence.TransactionRequiredException: Bir güncelleştirme/silme sorgusu yürütme – mag382

cevap

12

İlginç Bir Soru. letting your bean implement SmartLifeCycle ile yapabilmeniz gerektiğini söyleyebilirim.

Bu şekilde, int getPhase(); yönteminiz Integer.MAX_VALUE yöntemini döndürürse, ApplicationContext nihayet kapandığında ilk arananlardan biri olacaktır.

Referans:

+1

Aslında başlangıç ​​işlemi "Integer.MIN_VALUE" ile başlıyor ve kapatma işlemi ters sırada uygulanacakken "Integer.MAX_VALUE" ile bitiyor, bu nedenle yönteminizin kapatma sırasında ilk çalıştırılmasını istiyorsanız "Integer.MIN_VALUE" yerine "Integer.MAX_VALUE" kullanılmalıdır. Bununla birlikte, bu özel durumda, herhangi bir değer, işlemin durmaktan yapılmasına izin verir. – John29

1

Bu aynı konu rastlamak. çek bahar kaynak kodundan sonra, U fasulye destory önce aramak olacak

public class SomeBean implements ApplicationListener<ContextClosedEvent> { 
    public void onApplicationEvent(ContextClosedEvent event) { 
     stopHook(); 
    } 
} 

onApplicationEvent uygular deneyebilirsiniz, sen bahar org.springframework.context.support.AbstractApplicationContext # doClose yöntemine kontrol edebilirsiniz. Aşağıda yapıştırıyorum, böylece ContextEvent -> LifeCycle -> Bean destory.

 try { 
      // Publish shutdown event. 
      publishEvent(new ContextClosedEvent(this)); 
     } 
     catch (Throwable ex) { 
      logger.warn("Exception thrown from ApplicationListener handling ContextClosedEvent", ex); 
     } 

     // Stop all Lifecycle beans, to avoid delays during individual destruction. 
     try { 
      getLifecycleProcessor().onClose(); 
     } 
     catch (Throwable ex) { 
      logger.warn("Exception thrown from LifecycleProcessor on context close", ex); 
     } 

     // Destroy all cached singletons in the context's BeanFactory. 
     destroyBeans(); 

     // Close the state of this context itself. 
     closeBeanFactory(); 

     // Let subclasses do some final clean-up if they wish... 
     onClose(); 
İlgili konular