Должен ли я вручную сбросить данные о состоянии Autowired Bean весной (поскольку это Singleton)? - PullRequest
0 голосов
/ 15 марта 2020

Я использую org.springframework.jms.core.JmsTemplate; в моем проекте для отправки сообщений в очереди SQS.

Я автоматически подключил JmsTemplate в @ Service

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;

@Service
public class AmazonSQSPublisherImpl implements AmazonSQSPublisher {
    @Autowired
    private JmsTemplate jmsTemplate;
    @Override
    public boolean sendMessageToFifo(String queueName, String message,
                                     String messageGroupId, String messageDedupeId, long delayTime) throws EventBrokerException {
        jmsTemplate.setDeliveryDelay(delayTime);
        jmsTemplate.send(queueName, session -> {/* somemessage here*/});
    }

    @Override
    public boolean sendMessage(String queueName, String message) throws EventBrokerException {
        jmsTemplate.convertAndSend(queueName, message);
    }
}

Здесь я использую setDeliveryDelay внутри jmsTemplate. Итак, мой вопрос: как я знаю, бин по умолчанию одноэлементный. если я использовал установщик bean-компонента jmsTemplate, должен ли я его сбросить? В моем примере я должен добавить это в конце метода sendMessageToFifo:

jmsTemplate.setDeliveryDelay(0);

Если я не добавлю это, когда я вызываю sendMessage вместо sendMessageToFifo задержка доставки не будет равна нулю, верно?

Кроме того, я хочу спросить, есть ли какие-либо передовые практики для установщика вызовов автоматического связанного компонента?

Ответы [ 2 ]

4 голосов
/ 16 марта 2020

Все бины по умолчанию одноэлементны, поэтому да, один из способов - сбросить их.

Но imho - это уродливое решение.

Что вам нужно сделать, это определить выделенный JmsTemplate @Bean, который вы настраиваете индивидуально, а затем autowire там, где вам нужно.

Если вам нужен еще один JmsTemplate для любого другого места, вы определяете секунду @Bean и разделяете эти два с помощью @Qualifiers .

2 голосов
/ 16 марта 2020

Все бины по умолчанию одноэлементные, поэтому я думаю, что вы должны сбросить их, как вы предлагаете.

Как указано в Документация Spring :

Область Singleton - это область по умолчанию в Spring. (...) Когда компонент является одноэлементным, будет управляться только один общий экземпляр компонента, и все запросы для компонентов с идентификатором или идентификаторами, соответствующими определению компонента, приведут к тому, что будет возвращен один указанный экземпляр компонента c контейнером Spring.

Это означает, что при следующем вызове jmsTemplate у него будут ранее добавленные данные о состоянии.

Существуют другие области действия bean, которые вы можно посмотреть в приведенном выше источнике.

С точки зрения использования инжекции поля через аннотацию @AutoWired, это обычно не считается хорошей практикой из-за различных проблем, перечисленных здесь (предпочитайте конструктор или Сеттер впрыска вместо).

...