2016-06-07 9 views
0

У меня есть компонент на основе Spring, который должен иметь возможность общаться через JMS и хотел бы использовать аннотированный метод @JmsListener. Мой класс слушателя должен прочитать полезную нагрузку, кодированную JSON, но также должен прочитать некоторый пользовательский заголовок. Я создал bean-компонент @Configuration и добавил его к текущей конфигурации на основе XML, в которой я настраиваю необходимый конвертер сообщений. В настоящее время мой метод слушатель помечается как это:Настройка имени назначения в Spring @JmsListener

@JmsListener(destination = "activemq:queue:queue.name") 
    public void handleItemCommand(ProvisionItemCommand itemCommand, @Header(AUTH_HEADER_NAME) String auth) { 

Это все работает, но, очевидно, имя очереди не может быть жёстко, оно должно быть настраиваемым. Чтобы усложнить дело, мы используем какой-то пользовательский класс для чтения данных конфигурации, поэтому использование @PropertySource и файла свойств не может быть и речи.

Где я продолжаю застревать, это увидеть, как настроить вещи, чтобы это произошло. В справочной документации Spring 4.2 мне сообщается о создании и регистрации пользовательского класса PropertySource (который может быть подкреплен нашим настраиваемым кодом конфигурации), но пример в документе (http://docs.spring.io/spring/docs/4.1.9.RELEASE/spring-framework-reference/htmlsingle/#beans-property-source-abstraction) просто создает контекст приложения на лету и добавляет источник настраиваемого свойства к тому, что. Возможно, я создал здесь слепое пятно, но как создать собственный источник свойств и добавить его в среду, которая уже существует? Я нашел несколько частных примеров в Интернете, но большинство из них относятся к весне 3, а некоторые, похоже, противоречат друг другу. Буду признателен, если кто-нибудь может это прояснить, так как я думаю, что нахожусь на 99%, но почему-то последний 1% не может «нажать» для меня.

ответ

0

Отвечая на мой собственный вопрос, как простейшая вещь, о которой я мог думать, на самом деле, похоже, решает мою проблему. В моем @Configuration классе я добавил следующее:

@Autowired 
public void setCustomConfiguration(CustomConfiguration customConfiguration, ConfigurableEnvironment env) { 
    LOG.trace("setCustomConfiguration()"); 
    this.customConfiguration = customConfiguration; 
    env.getPropertySources().addFirst(new CustomPropertySource("custom-config", customConfiguration)); 
} 

Тогда CustomPropertySource класс просто смотрит на то, что ключ он попросил в это CustomConfiguration. Добавлено в надежде, что это поможет кому-то еще; если у кого-то есть замечания или улучшения по этому решению, я был бы рад услышать это.