Ускорить обработку файлов YAML при загрузке Spring

#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 , если вы можете предоставить репозиторий, который может воспроизвести проблему.