Java 无法使用Spingboot应用程序配置带有Camel Kafka的事务
我目前正在创建一个Springboot应用程序,它将使用来自Kafka主题的消息,并在处理后将写回另一个主题。我使用CAMEL进行集成Java 无法使用Spingboot应用程序配置带有Camel Kafka的事务,java,spring-boot,apache-kafka,apache-camel,Java,Spring Boot,Apache Kafka,Apache Camel,我目前正在创建一个Springboot应用程序,它将使用来自Kafka主题的消息,并在处理后将写回另一个主题。我使用CAMEL进行集成 My Route looks like this : onException(IllegalArgumentException.class).maximumRedeliveries(4); from("kafka:CDC-GEXPUAT-CUSTOMER") .id("Came
My Route looks like this :
onException(IllegalArgumentException.class).maximumRedeliveries(4);
from("kafka:CDC-GEXPUAT-CUSTOMER")
.id("CamelRouteCustomer_1")
.**transacted**()
.choice()
.when(simple("${body} contains 'GEXPUAT.CUSTOMER'" ))
.unmarshal().json(JsonLibrary.Jackson, CustomerWrapper.class)
.process(customerProcessor)
.otherwise()
.log("${body}")
.end()
.to("seda:aggregate_1");
在路由中使用.Transact()时,出现以下错误:
org.apache.camel.NoSuchBeanException:在类型为PlatformTransactionManager的注册表中找不到bean
@Configuration
public class CommonBean {
@Bean
SpringTransactionPolicy springTransactionPolicy() throws Exception {
SpringTransactionPolicy txRequired = new SpringTransactionPolicy();
txRequired.setTransactionManager(transactionManager());
txRequired.setPropagationBehaviorName("PROPAGATION_REQUIRED");
return txRequired;
}
@Bean
public DefaultKafkaProducerFactory<byte[], byte[]> producerFactory() {
DefaultKafkaProducerFactory<byte[], byte[]> defaultKafkaProducerFactory = new DefaultKafkaProducerFactory<byte[], byte[]>(
kafkaConfigs());
// enable transaction manager
defaultKafkaProducerFactory.setTransactionIdPrefix(transactionIdPrefix);
return defaultKafkaProducerFactory;
}
@Bean
@Primary
public ChainedKafkaTransactionManager<byte[], byte[]> transactionManager() throws Exception {
return new ChainedKafkaTransactionManager<>(kafkaTransactionManager());
}
@Bean
public PlatformTransactionManager kafkaTransactionManager() {
KafkaTransactionManager<byte[], byte[]> kafkaTransactionManager = new KafkaTransactionManager<>(producerFactory);
kafkaTransactionManager.setTransactionSynchronization(AbstractPlatformTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION);
kafkaTransactionManager.setRollbackOnCommitFailure(true);
return kafkaTransactionManager;
}
}
因此,我现在尝试创建一个配置类来定义TransactionManager
@Configuration
public class CommonBean {
@Bean
SpringTransactionPolicy springTransactionPolicy() throws Exception {
SpringTransactionPolicy txRequired = new SpringTransactionPolicy();
txRequired.setTransactionManager(transactionManager());
txRequired.setPropagationBehaviorName("PROPAGATION_REQUIRED");
return txRequired;
}
@Bean
public DefaultKafkaProducerFactory<byte[], byte[]> producerFactory() {
DefaultKafkaProducerFactory<byte[], byte[]> defaultKafkaProducerFactory = new DefaultKafkaProducerFactory<byte[], byte[]>(
kafkaConfigs());
// enable transaction manager
defaultKafkaProducerFactory.setTransactionIdPrefix(transactionIdPrefix);
return defaultKafkaProducerFactory;
}
@Bean
@Primary
public ChainedKafkaTransactionManager<byte[], byte[]> transactionManager() throws Exception {
return new ChainedKafkaTransactionManager<>(kafkaTransactionManager());
}
@Bean
public PlatformTransactionManager kafkaTransactionManager() {
KafkaTransactionManager<byte[], byte[]> kafkaTransactionManager = new KafkaTransactionManager<>(producerFactory);
kafkaTransactionManager.setTransactionSynchronization(AbstractPlatformTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION);
kafkaTransactionManager.setRollbackOnCommitFailure(true);
return kafkaTransactionManager;
}
}
@配置
公共类公共bean{
@豆子
SpringTransactionPolicy SpringTransactionPolicy()引发异常{
SpringTransactionPolicy txRequired=新的SpringTransactionPolicy();
txRequired.setTransactionManager(transactionManager());
txRequired.setPropagationBehaviorName(“需要传播”);
返回txRequired;
}
@豆子
公共默认KafkaProducerFactory producerFactory(){
DefaultKafkaProducerFactory DefaultKafkaProducerFactory=新建DefaultKafkaProducerFactory(
卡夫卡(图());
//启用事务管理器
defaultKafkaProducerFactory.setTransactionIdPrefix(transactionIdPrefix);
返回defaultKafkaProducerFactory;
}
@豆子
@初级的
public ChainedKafkaTransactionManager transactionManager()引发异常{
返回新的ChainedKafkaTransactionManager(kafkaTransactionManager());
}
@豆子
公共平台交易管理器kafkaTransactionManager(){
KafkaTransactionManager KafkaTransactionManager=新的KafkaTransactionManager(producerFactory);
kafkaTransactionManager.setTransactionSynchronization(AbstractPlatformTransactionManager.SYNCHRONIZATION在实际事务上);
kafkaTransactionManager.setRollbackOnCommitFailure(true);
返回kafkaTransactionManager;
}
}
但是现在我发现编译错误并且找不到类:
4.0.0
org.springframework.boot
spring启动程序父级
2.4.5
com.surajit.camel
camel-microservice-a
0.0.1-快照
骆驼计划
用于Spring Boot的Camel项目
8.
3.7.0
2.3.3.2发布
Hoxton.SR8
org.springframework.boot
弹簧靴起动器执行器
org.springframework.boot
SpringBootStarterWeb
org.apache.camel.springboot
驼形弹簧靴起动器
${camel.version}
org.apache.camel.springboot
camel-activemq启动器
${camel.version}
org.apache.camel.springboot
骆驼卡夫卡曲
${camel.version}
org.apache.camel.springboot
骆驼杰克逊起动器
${camel.version}
org.springframework.boot
弹簧靴开发工具
运行时
真的
org.springframework.boot
弹簧起动试验
测试
org.springframework.boot
springbootmaven插件
我可以通过在pom.xml中添加以下内容来解决问题
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<!-- <version>2.2.14.RELEASE</version> -->
<version>2.7.0</version>
</dependency>
现在按路线正确地开始卡夫卡客户端当前使用的版本是什么?你能分享你的POM/Gradle文件吗?添加POM文件。我使用了kafka客户端版本0.11,但没有解决依赖关系。当前已在pom.xml文件中注释掉。您可能希望尝试使用
spring kafka
,并确保您的初学者父版本和引导版本兼容
Added the following in the application.properties
spring.kafka.producer.transaction-id-prefix="producer"
spring.kafka.producer.bootstrap-servers=xxx.xxx.xxx.xxx:9092
spring.kafka.jaas.enabled=false