#spring-boot #yaml #spring-bean
#spring-boot #yaml #spring-bean
Вопрос:
Я пытаюсь прочитать файл свойств YAML, используя аннотацию @PropertySource в Spring Boot.
файл configuration.yaml содержит около 7,5 тыс. строк данных в приведенном ниже формате:
# Configuration for privilege management
---
role-configuration:
roles:
- name: Agent
groups:
-name: privilege-group
group-configuration:
groups:
- name: privilege-group
privilege-configuration:
privileges:
- name: admin-dashboard-view
description: View Admin dashboard
groups:
- name: privilege-group
- name: admin-dashboard-edit
description: Edit Admin dashboard
groups:
- name: privilege-group
....
...
..
Компонент конфигурации и специфичный для YAML PropertySourceFactory был реализован, перейдя по этой ссылке
PrivilegeProvider.java
@Configuration
@ConfigurationProperties(prefix = "privilege-configuration")
@PropertySource(value = "classpath:security/configuration.yaml", factory = YamlPropertySourceFactory.class)
@Data # lombok annotation for generating getter/setter and other helper functions
public class PrivilegeProvider {
private List<Privilege> privileges;
}
YamlPropertySourceFactory.java
public class YamlPropertySourceFactory implements PropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource encodedResource) throws IOException {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(encodedResource.getResource());
Properties properties = factory.getObject();
return new PropertiesPropertySource(encodedResource.getResource().getFilename(), properties);
}
}
Все данные успешно загружены из файла YAML, но загрузка занимает ~ 5-7 минут, что довольно много времени, учитывая размер файла.
Можно ли это оптимизировать? или есть какой-либо другой способ, которым я могу реализовать то же самое?
Комментарии:
1. Spring использует SnakeYaml для чтения в файле, вы пробовали просто создать грубый код, чтобы прочитать его, чтобы посмотреть, сколько времени это займет? Если это происходит быстро, вы можете попробовать настроить свое приложение с помощью более ручных средств определения собственного
@Bean
, который обеспечиваетList<Privilege>
.2. Наконец, я заканчиваю тем, что делаю это только без внесения каких-либо изменений в формат YAML. Теперь это занимает всего пару секунд. Переходя к вопросу, почему это происходит медленно с @PropertySource ? Я сделал снимки с помощью jstack, и основной поток ожидал метода addAll в течение задержки @Welsh
3. Я не уверен, я полагаю
@PropertySource
, что пытается выполнить дополнительную работу, чем просто разбор YAML, это может быть из-за того, как структурированы данные. Возможно, вам повезет больше с Spring Boot Github , если вы можете предоставить репозиторий, который может воспроизвести проблему.