2017-07-24 3 views
3

J'utilise Atomikos pour la transaction JTA. Je suit réglage pour JTA:Modifier le délai de transaction jta de la valeur par défaut à la valeur personnalisée

UserTransactionImp userTransactionImp = new UserTransactionImp(); 
userTransactionImp.setTransactionTimeout(900); 

mais quand mon code effectue la transaction JTA, alors si cela prend plus de 5 minutes (ce qui est la valeur par défaut), il émet une exception:

Caused by: com.atomikos.icatch.RollbackException: Prepare: NO vote 
    at com.atomikos.icatch.imp.ActiveStateHandler.prepare(ActiveStateHandler.java:231) 
    at com.atomikos.icatch.imp.CoordinatorImp.prepare(CoordinatorImp.java:681) 
    at com.atomikos.icatch.imp.CoordinatorImp.terminate(CoordinatorImp.java:970) 
    at com.atomikos.icatch.imp.CompositeTerminatorImp.commit(CompositeTerminatorImp.java:82) 
    at com.atomikos.icatch.imp.CompositeTransactionImp.commit(CompositeTransactionImp.java:336) 
    at com.atomikos.icatch.jta.TransactionImp.commit(TransactionImp.java:190) 
    ... 25 common frames omitted 

il On dirait qu'il prend le délai de transaction JTA par défaut (bien que je mette explicitement le délai d'attente à 15 minutes/900 secondes)

J'ai essayé d'utiliser les propriétés suivantes dans le fichier application.properties, mais il prend toujours la valeur de délai d'attente par défaut (300 secondes).

spring.jta.atomikos.properties.max-timeout=600000 
spring.jta.atomikos.properties.default-jta-timeout=10000 

J'ai aussi essayé avec la propriété ci-dessous, mais pas de chance:

spring.transaction.default-timeout=900 

Quelqu'un peut-il suggérer si je besoin d'un autre établissement? J'utilise le plugin wildfly, spring boot et atomikos api pour la transaction JTA.

Répondre

1

De l'Atomikos documentation:

com.atomikos.icatch.max_timeout

Indique le délai maximal (en millisecondes) qui peut être autorisé pour les transactions. La valeur par défaut est 300 000. Cela signifie que les appels à UserTransaction.setTransactionTimeout() avec une valeur supérieure à celle configurée ici seront maximisés à cette valeur. Pour 4.x ou supérieur, une valeur de 0 signifie aucun maximum (c'est-à-dire que des délais d'expiration illimités sont autorisés).

En effet, si vous regardez le code source de la bibliothèque Atomikos (pour les deux versions 4.0.0M4 et 3.7.0), dans la méthode createCC de la classe com.atomikos.icatch.imp.TransactionServiceImp vous verrez:

387: if (timeout > maxTimeout_) { 
388:  timeout = maxTimeout_; 
389:  //FIXED 20188 
390:  LOGGER.logWarning ("Attempt to create a transaction with a timeout that exceeds maximum - truncating to: " + maxTimeout_); 
391: } 

Ainsi, tout La tentative de spécification d'un délai d'expiration de transaction plus long est plafonnée à maxTimeout_ qui a une valeur par défaut de 300000 définie lors de l'initialisation si aucune n'est spécifiée.

Vous pouvez définir le com.atomikos.icatch.max_timeout comme argument JVM avec:

-Dcom.atomikos.icatch.max_timeout=900000

ou vous pouvez utiliser The Advanced Case recette spécifiée dans la configuration pour le printemps Section de la documentation Atomikos.

0

J'ai résolu un problème similaire où la configuration dans application.yml (ou les propriétés d'application.) De Spring Boot n'a pas été détectée.

Il y avait même un journal que j'ai trouvé plus tard mentionné dans le docs officiel.

Cependant, j'ai ajouté le fichier transactions.properties (à côté du fichier application.yml) où j'ai défini les propriétés souhaitées.

# Atomikos properties 

# Service must be defined! 
com.atomikos.icatch.service = com.atomikos.icatch.standalone.UserTransactionServiceFactory 

# Override default properties. 
com.atomikos.icatch.log_base_dir = ./atomikos 

Certaines propriétés peuvent être définies au sein transactions.properties et autres dans le fichier jta.properties.