代码之家  ›  专栏  ›  技术社区  ›  lombocska

KeyClope自定义spi-自定义事务超时

  •  0
  • lombocska  · 技术社区  · 6 年前

    我正试着做一件事 同步 KeyClope导入同步 界面 (wildlfy 18.0.1.决赛) 它提供了以下重写方法:

        @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);
    ...}
    
    

    在这两种方法中,我都创建了一个新的keydoveSession和一个新的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());
        }
    
    0 回复  |  直到 6 年前
        1
  •  0
  •   lombocska    6 年前

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

    由于导入同步,因此无法为此进程自定义事务超时。同步是从 KeycloakModelUtils.runJobInTransaction ,只能通过如上所述的默认超时进行配置。