java 这种向队列发送消息的方式是线程安全的吗?

qvtsj1bj  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(88)

我正在使用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.jmsTemplatethis.queue的这种用法是否是线程安全的。
如果在多个线程中同时调用这段代码(同时使用JmsTemplate和队列的这些共享示例),会发生什么?会不会有什么问题?

omqzjyyz

omqzjyyz1#

你不会有任何问题的。
如Spring文档中所述:
JmsTemplate类的示例 * 一旦配置 * 就是线程安全的。这很重要,因为这意味着您可以配置JmsTemplate的单个示例,然后安全地将此共享引用注入到多个协作者中。需要明确的是,JmsTemplate是有状态的,因为它维护了对ConnectionFactory的引用,但这种状态是 * 非 * 会话状态。
此外,JMS目的地(例如org.apache.activemq.command.ActiveMQQueue)是JMS中为数不多的线程安全对象之一。

相关问题