Quarkus is a popular framework for building efficient and scalable Java applications. One critical aspect of application development is managing transactions, and Quarkus provides flexible ways to configure transaction timeouts. In this article, we’ll explore how to configure transaction timeouts in Quarkus.
Default Transaction Timeout
The Narayana JTA transaction manager lets you coordinate and expose JTA transactions to your Quarkus applications. To learn how to configure Transaction in Quarkus we recommend checking this article: How to manage Transactions in Quarkus
Quarkus allows you to set a default transaction timeout for your entire application. This timeout specifies how long a transaction can remain active before it’s automatically rolled back. By default, the default transaction timeout is set to 60 seconds.
Configuration Property
You can configure the default transaction timeout by using the quarkus.transaction-manager.default-transaction-timeout
configuration property.
The default Transaction Timeout is set to 60 seconds as you can see from the Quarkus Properties List:
If your Transaction attempts to commit after the transaction timeout value you will see the following WARN Message on your logs:
2023-07-24 20:11:59,874 WARN [com.arj.ats.arjuna] (Transaction Reaper) ARJUNA012117: TransactionReaper::check timeout for TX 0:ffff0a000020:d58d:5cdad26e:81 in state RUN 2023-07-24 20:12:47,198 WARN [com.arj.ats.arjuna] (DefaultQuartzScheduler_Worker-3) ARJUNA012077: Abort called on already aborted atomic action 0:ffff0a000020:d58d:5cdad26e:81 Caused by: javax.transaction.RollbackException: ARJUNA016102: The transaction is not active! Uid is 0:ffff0a000020:d58d:5cdad26e:81
To change the default timeout, you can add the following property to your application.properties
or application.yaml
file:
quarkus.transaction-manager.default-transaction-timeout=180
In the above example, we’ve set the default transaction timeout to 180 seconds (3 minutes).
It is also possible to set the time using the standard java.time.Duration format. For example, to set the timeout to 5 minutes, enter the following configuration:
quarkus.transaction-manager.default-transaction-timeout=PT5M
Transaction Timeout Annotation
While setting a default transaction timeout is useful for most cases, there might be scenarios where you need to specify a different timeout for a specific method. Quarkus provides the @TransactionConfiguration
annotation for this purpose.
@TransactionConfiguration
Annotation
To set a timeout property for a transaction created within an annotated method, you can use the @TransactionConfiguration
annotation. Here’s how you can do it:
import io.quarkus.hibernate.orm.TransactionConfiguration; @Transactional @TransactionConfiguration(timeout = 40) public void myTransactionalMethod() { // Your transactional logic here }
In the above code snippet, we’ve annotated the myTransactionalMethod
with @TransactionConfiguration(timeout = 40)
. This means that any transactions created within this method will have a timeout of 40 seconds, overriding the default transaction timeout.
Please note that you can apply the @TransactionConfiguration
also at Class level. When you define @TransactionConfiguratio
on a class, it is equivalent to defining it on all the @Transactional
methods of the class.However, the configuration defined on a method takes precedence over the configuration defined on a class.
Practical Use Cases
Configuring transaction timeouts can be crucial in various scenarios:
- Long-Running Operations: If you have a specific method that performs a long-running operation within a transaction, you can set a longer timeout to accommodate the task’s duration.
- Critical Transactions: Some transactions might be more critical than others and require shorter timeouts to ensure timely completion or rollback in case of issues.
- Resource Management: When working with external resources like databases or web services, setting appropriate transaction timeouts can prevent resource leaks and ensure efficient resource utilization.
Conclusion
In Quarkus, you can easily configure transaction timeouts at both the application-wide and method-specific levels. This flexibility allows you to fine-tune your application’s transaction management to meet specific requirements, ensuring the reliability and efficiency of your application.