这个将 JMS 基础结构定义到 Spring 应用程序中的配置到底是如何工作的?

How exactly works this configuration that definies the JMS infrastracture into a Spring application?

我正在 Spring 做一些关于 JMS 的练习,我有一些疑问。

进入一个练习的解决方案我有这个配置class命名为JmsInfrastructureConfig:

package config;

import javax.jms.ConnectionFactory;
import javax.jms.Destination;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JmsInfrastructureConfig {

    /**
     * Create a ConnectionFactory using ActiveMQ:
     */
    @Bean
    public ConnectionFactory connectionFactory(){
        return new ActiveMQConnectionFactory("vm://embedded?broker.persistent=false");
    }


    /**
     *  Create a Queue for Dining objects using ActiveMQ: 
     */
    @Bean
    public Destination diningQueue() {
        return new ActiveMQQueue("rewards.queue.dining");
    }


    /**
     *  Create a Queue for Confirmation objects using ActiveMQ: 
     */
    @Bean
    public Destination confirmationQueue() {
        return new ActiveMQQueue("rewards.queue.confirmation");
    }

}

我知道在基于 JMS 的应用程序中,Connection 对象是从 ConnectionFactory.

获得的

根据我阅读文档的理解,ConnectionJMS 核心组件之一,它用于将消息放入queue\topic 并使用来自 queue\topic 的消息。这个断言是正确的还是错误的断言?

JMS Connection是从factory对象中获取的,所以在之前的配置中class声明了这个bean创建并 return 特定工厂:

@Bean
public ConnectionFactory connectionFactory(){
    return new ActiveMQConnectionFactory("vm://embedded?broker.persistent=false");
}

这对我来说很清楚,但在这里我有第一个疑问。它创建一个新的 ActiveMQConnectionFactory 对象,因为它被用作 Apache Active MQ 作为 Message Oriented Middleware.

Apache Active MQ(以及一般的 MOM)究竟做了什么?它处理队列和主题以及对这些对象的访问?)。

vm://embedded 到底是什么?broker.persistent=false?是经纪人URL吗?我该如何解释这个地址?

然后进入 JmsInfrastructureConfig class 创建这两个 bean:

// Create a Queue for Dining objects using ActiveMQ:
@Bean
public Destination diningQueue() {
    return new ActiveMQQueue("rewards.queue.dining");
}

// Create a Queue for Confirmation objects using ActiveMQ:
@Bean
public Destination confirmationQueue() {
    return new ActiveMQQueue("rewards.queue.confirmation");
}

两者都创建了一个特定的队列,分别命名为:rewards.queue.diningrewards.queue.confirmation (我认为这些是队列名称,对吗?)

所以这些 bean 创建了一个队列,生产者可以在其中放置消息,而消费者可以从中读取消息。

这些方法return一个Destination对象,这个对象到底代表什么?它是访问队列的网关(访问意味着从队列中读取时写入)?或者什么?

另一个疑问是:为什么在这个应用程序的结构中,return a ConnectionFactory 的 bean 声明在同一个 class 中定义了创建队列的 bean?

Is it used to put messages into a queue\topic and to consume?

是的,是的。

What exactly is vm://embedded?broker.persistent=false

这是您的 brokerURL,您应该这样解释它:

  • vm - 这是您的协议,意思是虚拟机(因为您使用的是嵌入式代理,运行 在您自己的应用程序中)
  • embedded - 这是您的 brokerName,所以现在您有一个名为 "embedded" 的嵌入式代理(有点令人困惑)
  • ?broker.persistent=false - 这只是您的经纪人的一个参数。这是一个可选参数,如果需要,您可以附加更多

I think that these are the queues name

是的,这些是你的队列。

Destination

这是您可以用来访问队列的对象。通过使用它,您可以生成(发送)或使用(读取)消息。

why in the architecture of this application the declaration of the bean that return a ConnectionFactory is in the same class where are defined the beans that creats queues?

他们不一定在同一个class。然而,该示例旨在尽可能简单,因此它会在现场为您创建这些队列,以便您可以使用它。

What exactly do Apache Active MQ (and a MOM in general)? It handle the queues and topics and the access to these objects?).

我认为这个问题太宽泛了,无法回答。如果您需要非常高层次的解释,您可能应该先阅读一些内容,如下所示: Message broker