【发布时间】:2021-09-12 20:54:48
【问题描述】:
我开发了User Storage SPI 的实现,它调用旧系统中的 API 来迁移用户。我需要为storageProviderTimeout 配置我自己的值,因为获得响应的时间很可能会超过默认的 3 秒。我已经将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() 的内容。
到目前为止,我尝试的是在standalone-ha.xml 中手动添加标签<user>,与<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
我希望有人可以为我阐明这一点,因为我感觉好像遗漏了一些明显的东西。提前致谢!
【问题讨论】: