我已经开发了一个实现用户存储SPI的程序,调用遗留系统中的API以迁移用户。 由于存在偶发可能需要超过默认的3秒才能获得响应,因此我需要配置自己的
storageProviderTimeout
值。 我已经将socket-timeout-millis
配置为默认5秒以上以超时,但是这无法帮助我,因为storageProviderTimeout
默认为3秒。 查看Keycloak源代码,特别是AbstractStorageManager.java
,提到了该值可进行配置: /**
* Timeouts are used as time boundary for obtaining models from an external storage. Default value is set
* to 3000 milliseconds and it's configurable.
*/
private static final Long STORAGE_PROVIDER_DEFAULT_TIMEOUT = 3000L;
读取已配置值的函数如下:
protected Long getStorageProviderTimeout() {
if (storageProviderTimeout == null) {
storageProviderTimeout = Config.scope(configScope).getLong("storageProviderTimeout", STORAGE_PROVIDER_DEFAULT_TIMEOUT);
}
return storageProviderTimeout;
}
当创建UserStorageManager
实例时(该实例扩展了AbstractUserManager
),构造函数使用以下代码实例化超类:
public UserStorageManager(KeycloakSession session) {
super(session, UserStorageProviderFactory.class, UserStorageProvider.class,
UserStorageProviderModel::new, "user");
}
"user"
是后面传递给 getStorageProviderTimeout()
函数的参数,用于在 Config.scope()
中设置存储提供者超时时间。
到目前为止我尝试手动将标签 <user>
添加到 standalone-ha.xml
文件中与 <theme>
标签处于同一级别,如下所示:
<user>
<storageProviderTimeout>10000</storageProviderTimeout>
</user>
但是在启动Keycloak时,我得到了这个错误:
10:55:59,730 ERROR [org.jboss.as.server] (Controller Boot Thread) WFLYSRV0055: Caught exception during boot: org.jboss.as.controller.persistence.ConfigurationPersistenceException: WFLYCTL0085: Failed to parse configuration
at org.jboss.as.controller@15.0.1.Final//org.jboss.as.controller.persistence.XmlConfigurationPersister.load(XmlConfigurationPersister.java:143)
at org.jboss.as.server@15.0.1.Final//org.jboss.as.server.ServerService.boot(ServerService.java:403)
at org.jboss.as.controller@15.0.1.Final//org.jboss.as.controller.AbstractControllerService$1.run(AbstractControllerService.java:416)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: javax.xml.stream.XMLStreamException: Unknown keycloak-server subsystem tag: user
希望有人能为我解决这个问题,因为感觉自己漏看了什么显而易见的东西。提前致谢!