Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,14 +1,23 @@

package example;

import io.micronaut.context.propagation.slf4j.MdcPropagationContext;
import io.micronaut.core.propagation.PropagatedContext;
import io.micronaut.transaction.TransactionOperations;
import io.micronaut.transaction.annotation.Transactional;
import jakarta.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.UUID;

@Singleton
public class ProductManager {
private static final Logger LOG = LoggerFactory.getLogger(ProductManager.class);

private final Connection connection;
private final TransactionOperations<Connection> transactionManager;
Expand Down Expand Up @@ -72,4 +81,51 @@ Product findUsingRepo(String name) {
return productRepository.findByName(name).orElse(null);
});
}

/**
* Creates new product using transaction operations and product repository.
*
* @param name the product name
* @param manufacturer the manufacturer
* @return the created product instance
*/
Product saveUsingRepoAndMDC(String name, Manufacturer manufacturer) {
UUID newUserId = UUID.randomUUID();
MDC.put("userId", newUserId.toString());
MDC.put("product", name);
try (PropagatedContext.Scope ignore = PropagatedContext.getOrEmpty().plus(new MdcPropagationContext()).propagate()) {
return transactionManager.executeWrite(status -> {
String product = MDC.get("product");
LOG.info("Saving product {}", product);
return productRepository.save(new Product(name, manufacturer));
});
}
}

/**
* Creates new product using transaction operations and product repository.
*
* @param name the product name
* @param manufacturer the manufacturer
* @return the created product instance
*/
Product saveUsingRepoAndMDCTransactional(String name, Manufacturer manufacturer) {
UUID newUserId = UUID.randomUUID();
MDC.put("userId", newUserId.toString());
MDC.put("product", name);
try (PropagatedContext.Scope ignore = PropagatedContext.getOrEmpty().plus(new MdcPropagationContext()).propagate()) {
Product product = saveProductTransactional(name, manufacturer);
System.out.println("MDC.get(\"another\") = " + MDC.get("another"));
return product;
}
}

@Transactional
Product saveProductTransactional(String name, Manufacturer manufacturer) {
String product = MDC.get("product");
LOG.info("Saving product {}", product);
MDC.put("another", product);
return productRepository.save(new Product(name, manufacturer));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n</pattern>
<pattern>product=%X{product} %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n</pattern>
</encoder>
</appender>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,16 @@ void testProductManagerUsingRepo() {
assertNull(product);
}

@Test
void testProductManagerUsingRepoMDC() {
Manufacturer intel = manufacturerRepository.save("Intel");
productManager.saveUsingRepoAndMDCTransactional("Processor", intel);

Product product = productManager.findUsingRepo("Processor");
assertEquals("Processor", product.getName());

product = productManager.findUsingRepo("NonExistingProduct");
assertNull(product);
}

}
Loading