我正在使用Spring 4.3.30中的JmsTemplate示例将消息写入消息队列。代码看起来像这样:
public void sendObjectMessage(final Serializable msg, final Long scheduledDelaySeconds) {
try {
this.jmsTemplate.send(this.queue, new MessageCreator() {
public Message createMessage(final Session session) throws JMSException {
Message m = session.createObjectMessage(msg);
if (scheduledDelaySeconds != null){
m.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 1000 * scheduledDelaySeconds);
}
return m;
}
});
} catch (Exception e) {
Logging.logError("Error sending MQ object message", e);
}
}
另外,在上面的代码中,this.queue
是org.apache.activemq.command.ActiveMQQueue
所以我想知道this.jmsTemplate
和this.queue
的这种用法是否是线程安全的。
如果在多个线程中同时调用这段代码(同时使用JmsTemplate
和队列的这些共享示例),会发生什么?会不会有什么问题?
1条答案
按热度按时间omqzjyyz1#
你不会有任何问题的。
如Spring文档中所述:
JmsTemplate
类的示例 * 一旦配置 * 就是线程安全的。这很重要,因为这意味着您可以配置JmsTemplate
的单个示例,然后安全地将此共享引用注入到多个协作者中。需要明确的是,JmsTemplate
是有状态的,因为它维护了对ConnectionFactory
的引用,但这种状态是 * 非 * 会话状态。此外,JMS目的地(例如
org.apache.activemq.command.ActiveMQQueue
)是JMS中为数不多的线程安全对象之一。