Ne pouvez pas vous engager JPA transaction - RollbackException: Transaction marqué comme rollbackOnly

d'abord je tiens à dire que j'ai vu tous les sujets ici sur stackoverflow pour mon cas, mais n'a pas pu résoudre mon problème de toute façon.

J'ai besoin d'exécuter une tâche planifiée tous les soirs pour vérifier la météo, la tâche était fini ou pas, je fais comme ceci:

@Service
@Transactional
public class CronBackGroundProcess {

@Autowired
private CronJobService cronJobService;

@Scheduled(cron = "15 01 01 ? * *")
public void StartNightJob() {
    CronJobLog log = new CronJobLog();
    int count = 0;
    try {
        log.setStartTime(new Date());
        log.setStatus("Entered StartNightJob Function");
        cronJobService.saveCronJobLog(log);

        List<Task> Tasks = cronJobService.getActive_AND_InArreasTasks();
        log.setStatus("Grabbed List of tasks to Check");
        cronJobService.saveCronJobLog(log);

        for (Task Task : Tasks) {
            cronJobService.StartNightJobProcess(Task, true);
            count++;
        }
    } catch (Exception e) {
        CronJobLog log2 = new CronJobLog();
        log2.setStatus("Error Occurred " + new Date().toString() + e.getMessage());
        cronJobService.saveCronJobLog(log2);
    }

    log.setLoansChecked(count);
    log.setStatus("Finished");
    log.setEndDate(new Date());
    cronJobService.saveCronJobLog(log);
}
}

CronJobService lui-même est @Transactionnelle et autowires plusieurs @Transactional services

@Service
@Transactional
public class CronJobService {

@Autowired
private ProductService productService;

@Autowired
private RepaymentService repaymentService;

@Autowired
private CronJobLogDAO cronJobLogDAO;


@Autowired
private TransferService transferService;

public String StartNightJobProcess(Account account, boolean makeTransfers) {

    do something....
            }
        }
    }

le processus se déroule sans erreur et lors de toutes les transactions doivent être engagés, je reçois cette erreur:

 org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:524) ~[spring-orm-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757) ~[spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726) ~[spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:478) ~[spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:272) ~[spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) ~[spring-tx-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:646) ~[spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at ge.shemo.services.core.CronBackGroundProcess$$EnhancerByCGLIB$$30cdcf31.StartNightJob(<generated>) ~[spring-core-4.0.0.RELEASE.jar:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_79]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_79]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_79]
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_79]
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65) ~[spring-context-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81) [spring-context-4.0.0.RELEASE.jar:4.0.0.RELEASE]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [na:1.7.0_79]
at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_79]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178) [na:1.7.0_79]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292) [na:1.7.0_79]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_79]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_79]
at java.lang.Thread.run(Thread.java:745) [na:1.7.0_79]
Caused by: javax.persistence.RollbackException: Transaction marked as rollbackOnly
at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:58) ~[hibernate-entitymanager-5.0.1.Final.jar:5.0.1.Final]
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:515) ~[spring-orm-4.0.0.RELEASE.jar:4.0.0.RELEASE]
... 22 common frames omitted

Je ne peux pas comprendre pourquoi.
Aussi Si je me lance même fonction auprès de @Contrôleur, il fonctionne très bien

@Controller
@RequestMapping("/test")
public class test {
@Autowired
private ClientService clientService;
@Autowired
private CronBackGroundProcess cronBackGroundProcess;
@RequestMapping(value = "/test")
@ResponseBody
public void test() throws Exception {
try {
cronBackGroundProcess.StartNightJob();
} catch (Exception e) {
String s = "sd";
}
}
}

Donc ma question est pourquoi cette fonction de contrôleur - s'engage tout comme prévu et pas de travaux à partir de la tâche planifiée(passe par tous les processus sans erreurs)?

  • Est que l'ensemble des stacktrace?
  • oui plein de trace de pile
  • Votre Transaction marked as rollbackOnly parce qu'il y a une erreur qui se passe juste avant, la corruption de la connexion. Regardez de plus près dans vos logs pour trouver de l'exception, de même activer la journalisation supplémentaire si nécessaire (seulement nécessaire si vous avez attrapé cette exception quelque part et ne l'ai pas imprimé).
  • Je ne pense pas que c'est l'erreur qui se passe parce que lorsque je lance même fucntion de @Contrôleur tout fonctionne bien.
  • Votre code est erroné. Vous êtes l'interception d'une exception, qui n'est jamais passé à l'extérieur de la transaction, qui pense toujours que c'est ok pour valider, mais en raison d'une exception, il a déjà été indiqué pour la restauration. Vous devez renvoyer l'exception et de mettre le truc c'est que la capture dans un bloc finally et assurez-vous que ce qui est écrit dans une nouvelle transaction (ainsi que le début du travail). Ou tout simplement supprimer @Transactional de votre CronBackGroundProcess.
  • retiré @Transactional de CronBackGroundProcess et j'ai été en mesure de rattraper l'erreur, mais l'erreur dit la même chose que la pile
  • Si vous pouvez alors mettre un debug point de rupture dans org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionInfo txInfo, Throwable ex) et ensuite voir ce que l'exception est.
  • Essayé de retirer @Transactional de CronbackgroundProcess - ce qui m'a permis d'intercepter l'erreur mais rien ne gagner cette erreur de fait: org.springframework.des transactions.TransactionSystemException: ne Pouvait pas s'engager JPA transaction; nested exception javax.la persistance.RollbackException: Transaction marqué comme rollbackOnly. J'ai essayé d'inspecter tous les valiable marqué comme Autocâblés pour s'assurer qu'ils sont inicialised - et ils le sont.
  • J'ai fait comme vous avez dit et a trouvé que la valeur null pointer exception est levée par UserService -> SecurityContextHolder.getContext().getAuthentication().getPrincipal(). Peut-il être la cause de il n'y a aucun utilisateur connecté à cette opération?
  • Votre utilisateur sera toujours null ainsi qu'avec le titulaire se remplit lorsque l'utilisateur saisit par le biais de l'interface web. Comment faut-il une tâche en arrière-plan savoir quel utilisateur il s'agit?
  • vient de mettre un autre debug point là pour voir ce qui est null.
  • OK - Donc j'ai trouvé le problème. Le problème est que j'ai été en utilisant le même service pour l'utilisateur connecté et le système - où j'ai été la journalisation qui a fait les changements - comme le Système lui-même n'avez pas d'utilisateur que j'ai été reçu erreur lors de l'obtention de l'utilisateur courant du Printemps de Sécurité. modifier la fonction et maintenant tout fonctionne. @PallavJha - je vous Remercie, j'ai pu trouver réelle de l'erreur -> completeTrasactionAfterThrowing fucntion que vous avez offert. Merci à vous tous qui m'ont aidé 🙂
  • Upvote mon commentaire, je atteignez plus de 300 rep :-p.
  • Je ne sais pas comment faire pour upvote ici. blanc en bas de votre commentaire en bas dans les réponses et je vais le marquer.
  • je crois que une Exception est survenue alors JPA est marqué transaction d'annulation seulement. Peut-être vous pouvez déboguer et de savoir ce que l'exception est soulevée. Utiliser org.springframework.web.la méthode.de soutien.InvocableHandlerMethod classe doInvoke méthode pour savoir le quelle était la raison exacte de la restauration.

InformationsquelleAutor Irakli | 2016-02-12