我想做一个 同步 流程,通过 钥匙扣导入同步化 接口。(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());
}
我可以回答我自己的答案。
没有可能自定义这个过程的事务超时,因为ImportSynchronization.sync是从 KeycloakModelUtils.runJobInTransaction
这只能通过上面提到的默认超时来配置。