是否有可能将声明式交易管理(通过@Transactional)与@KafkaListener注释方法一起使用?例如,我想使用它来为每个侦听器定义单独的 tx 超时。我的设置如下:
交易管理器:
@Bean
@ConditionalOnBean(value = {HibernateTransactionManager.class})
public ChainedKafkaTransactionManager<Object, Object> chainedHibernateTm(KafkaTransactionManager<String, String> kafkaTransactionManager,
org.springframework.orm.hibernate5.HibernateTransactionManager hibernateTransactionManager) {
return new ChainedKafkaTransactionManager<>(
kafkaTransactionManager,
hibernateTransactionManager);
}
Run Code Online (Sandbox Code Playgroud)
卡夫卡监听器:
@KafkaListener(topic = "my_topic")
@Transactional(timeout = 5)
public void handleMessage(SomeMessage message){
}
Run Code Online (Sandbox Code Playgroud)
问题是 - KafkaMessageListenerContainer 在调用此类方法之前创建自己的事务 - 它使用自己的 TransactionTemplate:
@Nullable
private TransactionTemplate determineTransactionTemplate() {
return this.transactionManager != null
? new TransactionTemplate(this.transactionManager)
: null;
}
Run Code Online (Sandbox Code Playgroud)
未使用 TransactionInterceptor。那么如何为具体的 @KafkaListener 方法设置特定的 tx 超时呢?
我想使用“直接访问授权”对 KeyCloak 进行身份验证: https: //www.keycloak.org/docs/latest/server_admin/index.html#resource-owner-password-credentials-grant-direct-access-grants
当 keycloak 自己管理用户和密码时,我的工作就像一个魅力。
但是,我的情况有所不同:
我希望 keycloak 充当某些外部 IDP 的经纪人。KeyCloak 具有身份代理功能 - 但仅适用于“授权代码流程” - 将用户重定向到外部 IDP 登录表单。我有移动应用程序,希望使用“直接访问授权” - 以便应用程序与 keycloak 通信来验证用户 - 并且 keycloak 作为代理,在外部 IDP 中验证此用户(使用 openid-connect)
如何实现这样的场景?我知道这是不可能的 - 但也许有人可以建议如何编写 keycloak 的扩展来使这种情况成为可能?