gpt4 book ai didi

java - Keycloak 自定义 spi - 自定义事务超时

转载 作者:行者123 更新时间:2023-12-01 16:30:05 27 4
gpt4 key购买 nike

我正在尝试通过keycloak ImportSynchronization接口(interface)执行同步过程。(狂野18.0.1.Final)它提供了以下方法来重写:

    @Override
public SynchronizationResult sync(
final KeycloakSessionFactory sessionFactory,
final String realmId,
final UserStorageProviderModel model) {
...}

此同步过程比我们的默认事务超时时间长得多(300 秒 = 5 分钟)。

我知道这个可能的机会:

            <core-environment node-identifier="${jboss.tx.node.id:1}">
<process-id>
<uuid/>
</process-id>
</core-environment>
<recovery-environment socket-binding="txn-recovery-environment" status-socket-binding="txn-status-manager"/>
<coordinator-environment statistics-enabled="${wildfly.transactions.statistics-enabled:${wildfly.statistics-enabled:false}}"
default-timeout="${env.TRANSACTION_TIMEOUT_SEC:300}"/>
<object-store path="tx-object-store" relative-to="jboss.server.data.dir"/>
</subsystem>

但是不幸的是,这不是我想要的。

不想增加所有进程的超时时间,只是为了这个进程。这意味着我正在寻找自定义事务超时解决方案。 (类似于@TransactionTimeout...)

<小时/>

我尝试过以下方法


@Override
public SynchronizationResult doCleanup(final KeycloakSessionFactory keycloakSessionFactory, final String realmId) {
final SynchronizationResult synchronizationResult = new SynchronizationResult();

try {

final RealmModel realmModel = this.getRealmModelInTx(realmId, keycloakSessionFactory);

Thread.sleep(<more than tx timeout>);

final int userEntityCountBeforeCleanup = this.getUserCountInTx(realmModel, keycloakSessionFactory);
...}

在这两种方法中,我创建了一个新的 keycloakSession 和一个新的 transactionManager关闭了它们,如下所示:

    private CleanupTransactionHandler createSession(final KeycloakSessionFactory  keycloakSessionFactory) {
KeycloakTransactionManager transactionManager = null;
final KeycloakSession keycloakSession = keycloakSessionFactory.create();

log.tracef("KeycloakSession has been created [%s].", keycloakSession.hashCode());
transactionManager = keycloakSession.getTransactionManager();
transactionManager.begin();
log.tracef("KeycloakTransactionManager's transaction has been begun [%s].", transactionManager.hashCode());
return new CleanupTransactionHandler(keycloakSession,transactionManager);
}

private void closeSession(final KeycloakSession keycloakSession) {
keycloakSession.close();
log.tracef("KeycloakSession has been closed [%s].", keycloakSession.hashCode());
}

private void rollback(final KeycloakTransactionManager keycloakTransactionManager) {
keycloakTransactionManager.rollback();
log.tracef("KeycloakTransactionManager's transaction has been rolled back [%s].", keycloakTransactionManager.hashCode());
}

最佳答案

我可以回答我自己的答案。

无法自定义此过程的事务超时,因为 ImportSynchronization.sync 是从 KeycloakModelUtils.runJobInTransaction 调用的,只能通过上面提到的默认超时进行配置。

关于java - Keycloak 自定义 spi - 自定义事务超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62064818/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com