我使用的是org.springframework.jms.core.JmsTemplate在我的项目中向SQS队列发送消息。
我在@Service 中自动连接JmsTemplate
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);
}
}
在这里,我在jmsTemplate中使用setDeliveryDelay。所以我的问题是:正如我所知,bean在默认情况下是单例的。如果我使用了jmsTemplatebean的setter,我应该重置它吗?在我的例子中,我应该在方法sendMessageToFifo:的末尾添加这个吗
jmsTemplate.setDeliveryDelay(0);
如果我不添加此项,当我调用sendMessage而不是sendMessageToFifo时,传递延迟将不会为零,对吧?
此外,我想问一下,对于自动连线bean的调用设置器,是否有任何最佳实践??
默认情况下,所有bean都是singleton的,所以有一种方法是重置它
但这是一个丑陋的解决方案。
您应该定义一个自定义配置的专用JmsTemplate
@Bean
,然后在需要的地方定义autowire
。
如果任何其他地方都需要另一个JmsTemplate
,则可以定义第二个@Bean
,并使用@Qualifiers
将这两个位置分隔开。
默认情况下,所有bean都是singleton,所以我认为您应该按照建议重置它。
如Spring的文档所述:
singleton作用域是Spring中的默认作用域。(…(当一个bean是singleton时,只有一个bean的共享实例被管理,以及对具有与之匹配的一个或多个id的bean的所有请求bean定义将导致一个特定的bean实例Spring容器返回。
这意味着下次调用jmsTemplate
时,它将具有以前添加的状态数据。
还有其他bean作用域,您可以在上面的源代码中查看。
就通过@AutoWired
注释使用字段注入而言,由于此处列出的各种问题,通常不认为这是一种好的做法(更喜欢构造函数或setter注入(。