[英]Keycloak custom spi - custom transaction timeout
我正在嘗試通過keycloak ImportSynchronization接口執行同步過程。 (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>
但不幸的是,這不是我想要的。
我不想增加我們所有進程的超時時間,只是為了這個。 這意味着我正在尋找自定義事務超時解決方案。 (類似於@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
調用的,只能通過如上所述的默認超時進行配置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.