Skip to main content

How to Implement JBoss Narayana with Spring Boot: Java 21 to Master Distributed Transactions, Ensure Data Consistency, and Reliable Transactions

Integrating JBoss Narayana with Spring Boot: A Comprehensive Guide for Java 21 to Master Distributed Transactions, Ensure Data Consistency, and Reliable Transactions.

Overview
JBoss Narayana is a transaction manager that supports distributed transactions. It is part of the JBoss suite of projects and ensures data consistency across multiple resources, such as databases and message queues, in a distributed system. Narayana is compliant with the Java Transaction API (JTA) and supports both XA and non-XA transactions.

Key FeaturesDistributed Transactions
Steps to Integrate JBoss Narayana in a Spring Boot Project
Step 1: Add Dependencies
Add the necessary Narayana dependencies to your pom.xml file.
XML
<dependency>
<groupId>org.jboss.narayana.jta</groupId>
<artifactId>narayana-jta</artifactId>
<version>5.12.6.Final</version>
</dependency>

Step 2: Configure JTA in Spring Boot
Create a configuration class to set up the Narayana transaction manager.
Java (Sample class)

//JtaConfig.java
import javax.transaction.UserTransaction;
import javax.transaction.TransactionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.jta.JtaTransactionManager;

@Configuration
public class JtaConfig {

@Bean
public UserTransaction userTransaction() {
return com.arjuna.ats.jta.UserTransaction.userTransaction();
}

@Bean
public TransactionManager narayanaTransactionManager() {
return com.arjuna.ats.jta.TransactionManager.transactionManager();
}

@Bean
public JtaTransactionManager transactionManager(UserTransaction userTransaction, TransactionManager narayanaTransactionManager) {
return new JtaTransactionManager(userTransaction, narayanaTransactionManager);
}
}

Step 3: Enable Transaction Management
Ensure that transaction management is enabled in your Spring Boot application.

Java
// EmployeeServiceImpl.java

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class EmployeeServiceImpl implements EmployeeService {

@Override
@Transactional
public void performTransactionalOperation() {

// Your transactional code here
}
}

Example: Logging in a Controller Class
Let’s assume you have an EmployeeController class that handles HTTP requests and responses. Use SLF4J for logging to verify that transactions are correctly managed.

Step 4: Implement Logging in the Controller
First, add the SLF4J dependency to your pom.xml if it’s not already included:

XML
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.36</version>
</dependency>

Next, create the EmployeeController class and use SLF4J for logging:

Java
// EmployeeController.java

import com.employee_management.services.EmployeeService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/employees")
public class EmployeeController {

private static final Logger logger = LoggerFactory.getLogger(EmployeeController.class);

@Autowired
private EmployeeService employeeService;

@GetMapping("/performTransaction")
public String performTransaction() {

logger.info("Starting transaction...");
try {

employeeService.performTransactionalOperation();
logger.info("Transaction completed successfully.");

return "Transaction completed successfully.";
} catch (Exception e) {

logger.error("Transaction failed: ", e);
return "Transaction failed.";
}
}
}

In this example:
  • The EmployeeController class handles HTTP GET requests to the /employees/performTransaction endpoint.
  • SLF4J is used to log messages at different stages of the transaction.
  • The performTransaction method calls the performTransactionalOperation method from the EmployeeService class.
  • Log messages are displayed in the console to verify that the transaction is correctly handled by JBoss Narayana.
Summary
By following above steps, you can integrate JBoss Narayana into your Spring Boot project to manage distributed transactions effectively. This setup ensures that your application can handle complex transaction scenarios across multiple resources, maintaining data consistency and reliability. By adding logging to your Controller class, you can easily verify that transactions are being managed correctly by JBoss Narayana. This approach helps in monitoring and debugging transaction-related issues in your application.

Comments

Popular posts from this blog

Fix: "Cannot set a credential for principal 'sa' . (Microsoft SQL Server, Error: 15535)" and “User is not associated with a trusted sql server connection" Errors

Recently, I had happen to struck with the following errors when I tried to reset the SA password through the SQL Server 2008 R2 Express. " Cannot set a credential for principal 'sa' . (Microsoft SQL Server, Error: 15535) " and then, “ User is not associated with a trusted sql server connection " From my research I have found the solution and that perfectly worked in SQL management studio. Hence, I thought of sharing my findings with others. ========================================================= Advertisement: Choosing .NET Core Worker Services OR Windows Services? ========================================================= Steps to reset the password in SQL Server 2008 R2 Express and fix for the errors: Step 1. Go to SQL Server Instance -> Properties/Security tab and change the mode to SQL Server authentication mode. Step 2. Go to Security/Logins, then open 'sa' login properties,          a. Uncheck the "Enforce passwor...

How to Implement Lombok in IntelliJ for Java Projects: A Step-by-Step Guide

Lombok in IntelliJ for Java Projects Implementing Lombok in your Java project can streamline your code by reducing boilerplate. Follow these steps to set up Lombok in IntelliJ: Step 1 :  Ensure Java SDK Version. Ensure that your project is using Java 8 or higher.  You can check and set the Java SDK version in pom.xml: XML <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> Step 2 : Add Lombok Dependency to pom.xmlOpen the pom.xml file in your project. Add the following Lombok dependency inside the <dependencies> section: XML <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> <scope>provided</scope> </dependency> Step 3 : Download Lombok Plugin for IntelliJ IDEAGo to File > Settings (or press Ctrl+Alt+S). Navigate to Plugins. Search for Lombo...

How to create a GenAI Talking Avatar ChatBot using Streamlit and Anthropic Claude LLM Model

GenAI Talking Avatar ChatBot   using Streamlit and Anthropic Claude LLM Model GenAI-Talking-Avatar-Chatbot is a web application that allows users to interact with an AI-powered talking chatbot with a static avatar. The chatbot uses AWS Bedrock for generating responses and Google Text-to-Speech (gTTS) for voice output. The backend is built with FastAPI, and the frontend uses Streamlit for the user interface. Features API Backend (api.py) Provides an API endpoint to handle chat requests. Uses AWS Bedrock to generate AI responses in a specified JSON format. Ensures the responses include the message, avatar expression, and voice tone. Includes a health check endpoint to verify the API status. Chat UI (chat_frontend.py) Chat Interface: Provides a chat interface where users can input their queries and receive responses from the AI assistant. Avatar Display: Displays an avatar that changes expressions based on the AI assistant's responses and actions (e.g., thinking, speaking). AI Respons...