Spring JMS, определяющий несколько направлений - PullRequest
1 голос
/ 01 апреля 2019

пружинная документация гласит:

Места назначения, как экземпляры ConnectionFactory, управляются JMS объекты, которые вы можете хранить и получать в JNDI. При настройке Контекст приложения Spring, вы можете использовать JNDI JndiObjectFactoryBean фабричный класс или для внедрения зависимости ссылки вашего объекта на места назначения JMS.

Однако эта стратегия часто бывает громоздким, если в приложение или, если есть расширенные функции управления пунктом назначения уникальный для провайдера JMS.

Вопрос:

Как действовать, если в моем заявлении указано большое количество адресатов?

Используя вышеупомянутую стратегию, я должен определить:

  • JndiTemplate
  • JndiDestinationResolver
  • JndiObjectFactoryBean
  • CachingConnectionFactory
  • JmsTemplate

Для КАЖДЫЙ пункт назначения.

Итак, если у меня 20 очередей, мне нужно определить 100 таких бинов ...

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Вы можете просто использовать один JmsTemplate, CachingConnectionFactory и JndiDestinationResolver ...

Весь смыслиспользование DestinationResolver означает ленивое решение пунктов назначения для вас.Используйте определенный send или [convertAndSend][5]. The destininationName will be passed on to the DestinationResolver`, чтобы получить пункт назначения.

Единственным недостатком является то, что вам нужно использовать jndi-name в качестве destinationName.


@Bean
public JndiDestinationResolver jndiDestinationResolver() {
  return new JndiDestinationResolver();
}

@Bean
public JmsTemplate jmsTemplate() {
  JmsTemplate jmsTemplate = new JmsTemplate();
  jmsTemplate.setDestinationResolver(jndiDestinationResolver());
  jmsTemplate.setConnectionFactory(connectionFactory());
  return jmsTemplate;
}

При этом вы можете использовать следующее для динамического разрешения пункта назначения из JNDI.


jmsTemplate.send("jms/queue1", "This is a message");
jmsTemplate.send("jms/queue3", "This is another message");
1 голос
/ 02 апреля 2019

В комментарии к документации Spring делается пометка о том, что «использование JNDI для конечных точек назначения» и «не использование JNDI для конечных точек назначения».Так в вашем случае - хранятся ли ваши пункты назначения в JNDI?Если вам не нужно это использовать, забудьте об этом.Загружайте только ваш ConnectionFactory (один объект) из JNDI или просто создайте его с нуля.

И тогда вам не нужно назначать один bean-компонент Spring для каждого места назначения.Вы можете иметь только один потребительский компонент Java, который затем использует JmsTemplate.Я думаю, что ваша фабрика соединений такая же, так что это только один new JmsTemplate(connectionFactory).Затем выполните createSession / createConsumer и т. Д. По мере необходимости.

...