2013-08-23 2 views
6

(Bahar Hala biraz yeni) atar o.Bahar: @Transactional @Scheduled yöntemi ben bir DAO çağırmak için olsun böylece, aynı zamanda <code>@Scheduled</code> ve <code>@Transactional</code> olan bir hizmet yöntemi olması gerekir</p> <p>TransactionException

Beyanatlı işlemler etkinleştirilir, işlem yöneticisi hazırda bekleme oturumunu temel alan bir org.springframework.orm.hibernate3.HibernateTransactionManager'dur.

Hizmet sınıfı, CGLIB proxy kullanıldığından hiçbir arabirim uygulamıyor.

Bu kurulum, genel olarak iyi çalışır (web yığını yani. Struts denilen yöntemler), ancak bu yöntem, zamanlayıcı tarafından çağrıldığında bir istisna ortaya çıkarır.

hizmet yöntemi (sınıf ClientWakeAndTerminateManager olarak adlandırılır):

<!-- switch on the transactional infrastructure --> 
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> 

    <!-- Utility class to execute transactional code where use of annotation is not possible --> 
    <bean class="org.springframework.transaction.support.TransactionTemplate" id="txTemplate"> 
     <constructor-arg name="transactionManager" ref="transactionManager"/> 
    </bean> 

    <!-- Transaction manager based on Hibernate --> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="hibernateSessionFactory"/> 
    </bean> 

durum yığın: başvurum bağlam

@Scheduled(initialDelay = 5000, fixedRateString = "${rmi.server.threads.clientsScheduleManagement.rate}") 
    @Transactional(readOnly = true) 
    public void runCheck(){ 

     //Call a read-only DAO method (the DAO is @Autowired as a class field) 

     //do some stuff with the data loaded from DB 

    } 

Buradan ilgili kısımlar, burada

kod ilgili bitlerdir izlenme:

[ERROR] : Unexpected error occurred in scheduled task. 
org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started 
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:661) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:755) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:475) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:270) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631) 
    at ch.unine.sitel.lis.rmi.shared.ClientWakeAndTerminateManager$$EnhancerByCGLIB$$d8be4f34.runCheck(<generated>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:64) 
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:53) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
    at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:351) 
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: org.hibernate.TransactionException: Transaction not successfully started 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:127) 
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:657) 
    ... 22 more 

Yığın izlemesi, bir işlem vekilinin gerçekten kullanıldığını söylüyor, bu yüzden bu özel durumu anlamıyorum. Yardım et !

DÜZENLEME: tarafından @Transactional ve @Scheduled ek not ayrı çalıştı

:

  • bu fasulye benim hizmetini enjekte @Scheduled yöntemini contaisn yeni sınıf/fasulye oluşturma

    • @Scheduled özgün yöntemimden kaldırıldı, ancak @Transactional

    Ancak yine de aynı özel durumla karşılaşıyorum. Ayrıca, DAO yöntemine @Transactional'u koyup hizmet yöntemimden kaldırmayı denedim: aynı sonuç.

  • +0

    zaten kararlı ya da işlem işlemek veya – wedens

    +0

    Eğer dao yöntemini gösterebilir geri almak çalışır geri alındı ​​zaman buna yol açabilecek hareketi geri alır emin? – wedens

    +1

    Tamam, DAO yöntemim suçlu olanıydı. Şüphelenmeye başladım ve sonra yorumun bana iki kez bakmamı sağladı. Bu yöntem bazı sol-over manuel oturum taahhüt içeriyordu (Ben son zamanlarda bu uygulamayı modernize ve "yaylıyorum"), bu yüzden işlem proxy'si çağrıda bulunduğunda taahhüt edildi çünkü başarısız oldu zaten! Zaman ayırdığın için teşekkürler. Cevabınızı DAO yönteminden bahsetmek için düzenlerseniz kabul edeceğim. –

    cevap

    11

    @Transactional ile açıklamalı bir yöntemle ayrı bir sınıf oluşturun ve bu yöntemi @Scheduled açıklamalı yönteminizde arayın. yay, vekil aracılığıyla bir çağrı yapar ve @Transactional'u doğru şekilde kullanır.

    DÜZENLEME: da DAO yöntemine bakmak ve yapmak değil taahhüt veya el

    +0

    Teşekkürler, ben yaptım, ama aynı hatayı alıyorum (düzenle) –

    +0

    Teşekkürler @wedens bu cevap için, Onun benim için çalışıyorum.Yani aynı sınıfta çalışırken neden çalışmadığını açıkla. – hayat

    +0

    Biliyorum, çok eski bir yazı ama sorumu asmaktan nefret ediyorum. Bunun sebebi vekilin işleyiş şeklidir. En basit cevap, içeri giren şeyin ne olduğunu ve içeride ne olup bittiğini görmemesidir. Bu bir vekilin doğasından kaynaklanmaktadır. – Wes

    İlgili konular