将JMS基础结构定义为Spring应用程序的此配置究竟如何工作?

时间:2015-03-05 15:22:28

标签: java spring spring-mvc jms spring-jms

我正在Spring上对JMS做一些练习,我有一些疑问。

在练习的解决方案中,我有一个名为 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 获得的。

根据我的理解阅读文档,连接 JMS核心组件之一,它用于将消息放入队列\ topic并使用消息从队列\主题。这个断言是真的还是这是一个错误的断言?

JMS 连接是从工厂对象获取的,因此在之前的配置类中声明了这个创建并返回特定工厂的bean:

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

我很清楚但在这里我有第一个怀疑。它创建了一个新的 ActiveMQConnectionFactory 对象,因为它使用 Apache Active MQ 作为面向消息的中间件

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

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

然后进入 JmsInfrastructureConfig 类创建这两个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.dining rewards.queue.confirmation (我认为这些是队列名称与否?)

因此,这些bean创建了一个队列,生产者可以在其中放置消息,消费者可以阅读消息。

这些方法返回一个目的地对象,究竟是什么代表了这个对象?它是访问队列的网关(访问意味着写入队列中的读取)吗?或者是什么?

另一个疑问是:为什么在这个应用程序的acrhitecture中,返回 ConnectionFactory 的bean的声明是在同一个类中定义创建队列的bean?

1 个答案:

答案 0 :(得分:2)

  

是否用于将消息放入队列\主题并使用?

是的,是的。

  

究竟什么是vm:// embedded?broker.persistent = false

这是您的brokerURL,这就是您应该解释它的方式:

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

我认为这些是队列名称

是的,这些是你的队列。

  

目标

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

  

为什么在这个应用程序的体系结构中,返回ConnectionFactory的bean的声明是在同一个类中定义了创建队列的bean?

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

  

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

我认为回答的问题太过广泛。如果你需要一个非常高级的解释,你应该先读一些东西,比如: Message broker