Keycloak自定义spi--自定义交易超时。

问题描述 投票:0回答:1

我想做一个 同步 流程,通过 钥匙扣导入同步化 接口。(wildlfy 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>

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

I 不想 来增加我们所有流程的超时时间,只是针对这个流程。也就是说,我正在寻找一个自定义事务超时的解决方案。(类似@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());
    }
java transactions timeout keycloak spi
1个回答
0
投票

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

没有可能自定义这个过程的事务超时,因为ImportSynchronization.sync是从 KeycloakModelUtils.runJobInTransaction这只能通过上面提到的默认超时来配置。

© www.soinside.com 2019 - 2024. All rights reserved.