开发者社区> 问答> 正文

我应该在Spring中手动重置Autowired Bean的状态数据(因为它是Singleton)?

我正在使用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);
    }
}

这里我用setDeliveryDelay JmsTemplate的内部。所以我的问题是:正如我所知,bean默认是单例的。如果我使用了jmsTemplate bean的setter,是否应该重置它?在我的示例中,是否应该在sendMessageToFifo方法的末尾添加此代码:

jmsTemplate.setDeliveryDelay(0);

如果我不添加它,当我调用sendMessage而不是sendMessageToFifo时,传递延迟将不为零,对吗?

另外,我想问一下自动接线豆的呼叫设置器的最佳实践吗?

问题来源:Stack Overflow

展开
收起
montos 2020-03-23 17:03:13 653 0
1 条回答
写回答
取消 提交回答
  • 默认情况下,所有bean均为单例,因此,一种方法是将其重置。

    但是恕我直言,这是一个丑陋的解决方案。

    您应该做的是定义一个JmsTemplate @Bean自定义配置的专用对象,然后autowire在需要的地方定义。

    如果在其他JmsTemplate任何地方需要另一个,则定义第二个,@Bean然后使用分隔这两个@Qualifiers。

    回答来源:Stack Overflow

    2020-03-23 17:03:27
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多