spring amqp 连接和资源管理(2)

连接和资源管理:

虽然我们在前一节中描述的AMQP模型是通用的,并且适用于所有实现,但是当我们进入资源管理时,详细信息是特定于代理实现的。因此,在本节中,我们将重点讨论仅存在于“spring-rabbit”模块中的代码,因为此时RabbitMQ是惟一受支持的实现。

管理到RabbitMQ代理的连接的中心组件是ConnectionFactory接口。ConnectionFactory实现的职责是提供org.springframework.amq .rabbit.connection的实例。Connection,它是com.rabbitmq.client.Connection的包装器。我们提供的唯一具体实现是CachingConnectionFactory,默认情况下,它建立了一个可以由应用程序共享的连接代理。共享连接是可能的,因为使用AMQP进行消息传递的“工作单元”实际上是一个“通道”(在某些方面,这类似于JMS中的连接和会话之间的关系)。连接实例提供了一个createChannel方法。CachingConnectionFactory实现支持缓存这些通道,并根据它们是否是事务性的,为通道维护单独的缓存。创建CachingConnectionFactory实例时,可以通过构造函数提供“主机名”。您还应该提供“用户名”和“密码”属性。要配置通道缓存的大小(默认为25),可以调用setChannelCacheSize()方法。

从1.3版开始,您可以配置CachingConnectionFactory来缓存连接和通道。在这种情况下,每次调用createConnection()都会创建一个新的连接(或从缓存中检索空闲连接)。关闭连接将返回到缓存(如果没有达到缓存大小)。在这样的连接上创建的通道也会被缓存。在某些环境中,使用单独的连接可能是有用的,例如从HA集群使用连接,与负载平衡器一起连接到不同的集群成员,以及其他。要缓存连接,请将cacheMode设置为cacheMode . connection。

注意:连接缓存数量  并不限制连接的数量。相反,它指定允许多少空闲的打开连接并缓存。

 

从1.5.5版本开始,提供了一个名为connectionLimit的新属性。当设置此属性时,它将限制允许的连接总数。设置时,如果达到限制,则使用channelCheckoutTimeLimit等待连接空闲。如果超时,则抛出AmqpTimeoutException。

 

当缓存模式为连接时,不支持自动声明队列和其他(请参阅自动声明交换、队列和绑定)。

另外,在撰写本文时,amqm -client库默认情况下为每个连接创建一个固定的线程池(默认大小:Runtime.getRuntime(). availableprocessors() * 2个线程)。当使用大量连接时,应该考虑在CachingConnectionFactory上设置自定义执行器。然后,所有连接都可以使用同一个执行器,并且可以共享它的线程。执行程序的线程池应该是无界的,或者为预期的使用进行适当的设置(通常,每个连接至少有一个线程)。如果在每个连接上创建多个通道,那么池大小会影响并发性,因此最适合使用变量(或简单缓存)线程池执行器。

 

重要的是要理解缓存大小(默认情况下)不是限制,而是可以缓存的通道数量。缓存大小为10时,实际上可以使用任意数量的通道。如果使用超过10个通道,并且它们都返回到缓存中,则10个通道进入缓存。其余部分在物理上是封闭的。

从1.6版开始,默认通道缓存大小从1增加到25。在大容量、多线程环境中,小缓存意味着以高速率创建和关闭通道。增加默认缓存大小可以避免这种开销。您应该通过RabbitMQ管理UI监视正在使用的通道,如果您看到正在创建和关闭许多通道,则应考虑进一步增加缓存大小。缓存只按需增长(以适应应用程序的并发性需求),因此此更改不会影响现有的低容量应用程序。

从1.4.2版本开始,CachingConnectionFactory有一个名为channelCheckoutTimeout的属性。当此属性大于零时,channelCacheSize将成为对可以在连接上创建的通道数量的限制。如果达到此限制,则调用thread块,直到通道可用或达到此超时为止,在这种情况下,将抛出AmqpTimeoutException。

框架中使用的通道(例如RabbitTemplate)会可靠地返回到缓存中。如果您在框架之外创建通道(例如,通过直接访问连接并调用createChannel()),您必须(通过关闭)可靠地返回它们(可能是在finally块中),以避免通道耗尽。

下面的例子展示了如何创建一个新的连接:

 CachingConnectionFactory connectionFactory = new CachingConnectionFactory("somehost");
    connectionFactory.setUsername("guest");
    connectionFactory.setPassword("guest");
    Connection connection = connectionFactory.createConnection();

xml配置

<bean id="connectionFactory"
          class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
        <constructor-arg value="somehost"/>
        <property name="username" value="guest"/>
        <property name="password" value="guest"/>

</bean>

还有一个SingleConnectionFactory实现,它只在框架的单元测试代码中可用。它比CachingConnectionFactory更简单,因为它不缓存通道,但是由于它缺乏性能和弹性,不适合在简单测试之外的实际使用。如果出于某种原因需要实现自己的ConnectionFactory, AbstractConnectionFactory基类可能会提供一个很好的起点。

使用rabbit命名空间可以快速方便地创建ConnectionFactory,如下所示:

<rabbit:connection-factory id="connectionFactory"/>

在大多数情况下,这种方法更可取,因为框架可以为您选择最佳默认值。创建的实例是CachingConnectionFactory。请记住,通道的默认缓存大小是25。如果您想让更多的通道成为cachedm,可以通过设置“channelCacheSize”属性设置更大的值。在XML中,它看起来像这样:

<bean id="connectionFactory"
          class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
        <constructor-arg value="somehost"/>
        <property name="username" value="guest"/>
        <property name="password" value="guest"/>
        <property name="channelCacheSize" value="50"/>

</bean>

此外,使用名称空间,您还可以添加“channel-cache-size”属性,如下所示:

<rabbit:connection-factory id="connectionFactory" channel-cache-size="50"/>

默认缓存模式是CHANNEL,但是您可以将其配置为缓存连接。在下面的例子中,我们使用connection-cache-size:

<rabbit:connection-factory
        id="connectionFactory" cache-mode="CONNECTION" connection-cache-size="25"/>

您可以使用名称空间提供主机和端口属性,如下所示:

<rabbit:connection-factory
        id="connectionFactory" host="somehost" port="5672"/>

或者,如果在集群环境中运行,可以使用address属性,如下所示:

<rabbit:connection-factory
        id="connectionFactory" addresses="host1:5672,host2:5672"/>

下面的例子是一个自定义线程工厂,它用rabbitmq-前缀线程名:

    <rabbit:connection-factory id="multiHost" virtual-host="/bar" addresses=
    "host1:1234,host2,host3:4567"
        thread-factory="tf"
        channel-cache-size="10" username="user" password="password" />
    <bean id="tf" class=
    "org.springframework.scheduling.concurrent.CustomizableThreadFactory">
        <constructor-arg value="rabbitmq-" />
    </bean>

 

命名连接 

从1.7版本开始,为注入AbstractionConnectionFactory提供了ConnectionNameStrategy。生成的名称用于目标RabbitMQ连接的特定于应用程序的标识。如果RabbitMQ服务器支持该连接名,则该连接名将显示在管理UI中。这个值不必是惟一的,也不能用作连接标识符——例如,在HTTP API请求中。这个值应该是可读的,并且是connection_name键下ClientProperties的一部分。您可以使用一个简单的Lambda,如下所示:

    connectionFactory.setConnectionNameStrategy(connectionFactory -> "MY_CONNECTION");

ConnectionFactory参数可以用一些逻辑来区分目标连接名。默认情况下,AbstractConnectionFactory的beanName、表示对象的十六进制字符串和内部计数器用于生成connection_name。<rabbit:connection-factory> 还提供了connection-name-strategy属性。

SimplePropertyValueConnectionNameStrategy的实现将连接名设置为应用程序属性。您可以将其声明为@Bean并将其注入连接工厂,如下面的示例所示:

@Bean

    public ConnectionNameStrategy cns() {
        return new SimplePropertyValueConnectionNameStrategy("spring.application.name

"); }

@Bean

    public ConnectionFactory rabbitConnectionFactory(ConnectionNameStrategy cns) {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        ...
        connectionFactory.setConnectionNameStrategy(cns);
        return connectionFactory;
    }

属性必须存在于应用程序上下文的环境中。

当使用Spring Boot及其自动配置的连接工厂时,您只需要声明ConnectionNameStrategy @Bean。Boot自动检测bean并将其连接到工厂。

 

 

 

阻塞连接和资源约束

连接可能被阻塞,以便与内存警报对应的代理进行交互。从2.0版本开始,org.springframework.amqp.rabbit.connection 连接可以提供BlockedListener实例,用于通知连接阻塞和解除阻塞事件。此外,AbstractConnectionFactory通过其内部BlockedListener实现分别发出ConnectionBlockedEvent和ConnectionUnblockedEvent。这使您能够提供应用程序逻辑来对代理上的问题做出适当的反应,并(例如)采取一些纠正措施

当应用程序配置为一个CachingConnectionFactory时(默认情况下是使用Spring Boot auto-configuration),当连接被代理阻塞时,应用程序将停止工作。当它被经纪人阻止时,它的任何客户都会停止工作。如果在同一个应用程序中有生产者和消费者,当生产者阻塞连接(因为代理上已经没有资源了)而消费者无法释放它们(因为连接被阻塞了)时,我们可能会陷入死锁。为了缓解这个问题,我们建议使用另一个CachingConnectionFactory实例,它具有相同的选项——一个用于生产者,一个用于消费者。对于在使用者线程上执行的事务生产者来说,不可能有单独的CachingConnectionFactory,因为它们应该重用与使用者事务关联的通道。

 

从2.0.2版本开始,RabbitTemplate有一个配置选项来自动使用第二个连接工厂,除非正在使用事务。有关更多信息,请参见使用单独的连接。发布者连接的ConnectionNameStrategy与主策略相同,其中.publisher附加到调用方法的结果中。

从1.7.7版本开始,将提供一个AmqpResourceNotAvailableException,当simpleconconnection . createchannel()无法创建通道时抛出该异常(例如,因为通道elmax限制已经达到,缓存中没有可用通道)。您可以在RetryPolicy中使用此异常,以便在某些回退之后恢复操作。

 

配置基础客户端连接工厂

CachingConnectionFactory使用Rabbit client ConnectionFactory的实例。在CachingConnectionFactory上设置等效属性时,会传递许多配置属性(例如主机、端口、用户名、密码、requestedHeartBeat和connectionTimeout)。要设置其他属性(例如clientProperties),可以定义Rabbit factory的一个实例,并通过使用CachingConnectionFactory的适当构造函数提供对它的引用。当使用名称空间(如前所述)时,您需要在connection-factory属性中提供对已配置工厂的引用。为了方便起见,提供了一个factory bean 来帮助在Spring应用程序上下文中配置连接工厂,下一节将对此进行讨论。

<rabbit:connection-factory
          id="connectionFactory" connection-factory="rabbitConnectionFactory"/>

 

4.0.x client 启用自动恢复。虽然与此特性兼容,但Spring AMQP有自己的恢复机制,通常不需要客户机恢复特性。我们建议禁用amqm -client自动恢复,以避免在代理可用但连接尚未恢复时获得AutoRecoverConnectionNotCurrentlyOpenException实例。您可能会注意到这个异常,例如,当在RabbitTemplate中配置了RetryTemplate时,甚至在集群中失败切换到另一个代理时也是如此。由于自动恢复连接是在计时器上恢复的,因此使用Spring AMQP的恢复机制可以更快地恢复连接。从1.7.1版本开始,Spring AMQP禁用amqm -client自动恢复,除非您显式地创建自己的RabbitMQ连接工厂并将其提供给CachingConnectionFactory。RabbitConnectionFactoryBean创建的RabbitMQ ConnectionFactory实例默认情况下也禁用了该选项。

 

 

RabbitConnectionFactoryBean and Configuring SSL

从1.4版开始,提供了一个方便的RabbitConnectionFactoryBean,通过使用依赖项注入在底层客户机连接工厂上启用SSL属性的方便配置。其他setter委托给底层工厂。在此之前,必须以编程方式配置SSL选项。下面的例子展示了如何配置RabbitConnectionFactoryBean:

    <rabbit:connection-factory id="rabbitConnectionFactory"
        connection-factory="clientConnectionFactory"
        host="${host}"
        port="${port}"
        virtual-host="${vhost}"
        username="${username}" password="${password}" />
    <bean id="clientConnectionFactory"
            class=
    "org.springframework.amqp.rabbit.connection.RabbitConnectionFactoryBean">
        <property name="useSSL" value="true" />
        <property name="sslPropertiesLocation" value=
    "file:/secrets/rabbitSSL.properties"/>
    </bean>

有关配置SSL的信息,请参阅RabbitMQ文档。省略密钥存储库和信任存储库配置,以便在没有证书验证的情况下通过SSL连接。下一个示例显示如何提供密钥和信任存储配置。

sslPropertiesLocation属性是指向包含以下键的属性文件的Spring资源:

keyStore=file:/secret/keycert.p12
    trustStore=file:/secret/trustStore
    keyStore.passPhrase=secret
    trustStore.passPhrase=secret

 

keyStore和truststore是指向这些存储的Spring资源。通常,该属性文件由具有读访问权的应用程序的操作系统保护。

从Spring AMQP 1.5版本开始,您可以直接在工厂bean上设置这些属性。如果同时提供了离散属性和sslPropertiesLocation,则后者中的属性将覆盖离散值。

从2.0版本开始,默认情况下将验证服务器证书,因为它更安全。如果由于某种原因希望跳过此验证,请将工厂bean的skipServerCertificateValidation属性设置为true。从2.1版开始,RabbitConnectionFactoryBean现在默认调用enableHostnameVerification()。要恢复到前面的行为,将enableHostnameVerification属性设置为false。

 

Routing Connection Factory

从1.3版本开始,已经介绍了AbstractRoutingConnectionFactory。这个工厂提供了一种机制来为几个ConnectionFactory配置映射,并在运行时通过一些lookupKey来确定目标ConnectionFactory。通常,实现检查线程绑定上下文。为了方便起见,Spring AMQP提供了SimpleRoutingConnectionFactory,它从SimpleResourceHolder获取当前线程绑定的lookupKey。下面的例子展示了如何在XML和Java中配置SimpleRoutingConnectionFactory:

<bean id="connectionFactory"
          class=
    "org.springframework.amqp.rabbit.connection.SimpleRoutingConnectionFactory">
        <property name="targetConnectionFactories">
            <map>
                <entry key="#{connectionFactory1.virtualHost}" ref="
    connectionFactory1"/>
                <entry key="#{connectionFactory2.virtualHost}" ref="
    connectionFactory2"/>
            </map>
        </property>
    </bean>
    <rabbit:template id="template" connection-factory="connectionFactory" />

 

public class MyService {
        @Autowired
        private RabbitTemplate rabbitTemplate;
        public void service(String vHost, String payload) {
            SimpleResourceHolder.bind(rabbitTemplate.getConnectionFactory(), vHost);
            rabbitTemplate.convertAndSend(payload);
            SimpleResourceHolder.unbind(rabbitTemplate.getConnectionFactory());
} }

重要的是在使用资源后解除绑定。有关更多信息,请参见JavaDoc中的AbstractRoutingConnectionFactory。

从1.4版开始,RabbitTemplate支持SpEL  sendConnectionFactorySelectorExpression和receiveConnectionFactorySelectorExpression属性,这些属性在每个AMQP协议交互操作上((send、sendAndReceive、receive或receiveAndReply))进行评估,并解析为提供的AbstractRoutingConnectionFactory的lookupKey值。您可以在表达式中使用bean引用,比如@vHostResolver.getVHost(#root)。对于发送操作,要发送的消息是根评估对象。对于接收操作,queueName是根计算对象。

 

路由算法如下:如果选择器表达式为null,或者被计算为null,或者提供的ConnectionFactory不是AbstractRoutingConnectionFactory的实例,那么一切都像以前一样工作,依赖于提供的ConnectionFactory实现。如果计算结果不为空,但该lookupKey没有目标ConnectionFactory,并且AbstractRoutingConnectionFactory配置了lenientFallback = true,也会发生相同的情况。在AbstractRoutingConnectionFactory的情况下,它会返回到基于行列式urrentlookupkey()的路由实现。但是,如果lenientFallback = false,则抛出IllegalStateException。

 

命名空间支持还在组件上提供了  send-connection-factory-selector-expression 和  receive-connection-factory-selector-expression  属性。

同样,从1.4版本开始,您可以在侦听器容器中配置路由连接工厂。在这种情况下,队列名称列表用作查找键。例如,如果您使用setQueueNames("thing1", "thing2")配置容器,那么查找键就是[thing1,thing]"(注意键中没有空格)。

从1.6.9版本开始,您可以在侦听器容器上使用setLookupKeyQualifier向查找键添加一个限定符。这样做可以监听具有相同名称但位于不同虚拟主机(每个虚拟主机都有一个连接工厂)中的队列。

例如,使用lookup key qualifier thing1和侦听队列thing2的容器,您可以注册目标连接工厂的查找键可以是thing1[thing2]

 

队列关联和LocalizedQueueConnectionFactory

在集群中使用HA队列时,为了获得最佳性能,您可能希望连接到主队列所在的物理代理。而CachingConnectionFactory可以配置多个代理地址。这是故障转移,客户端尝试按顺序连接。LocalizedQueueConnectionFactory使用管理插件提供的REST API来确定队列控制在哪个节点上。然后,它创建(或从缓存中检索)一个CachingConnectionFactory,该工厂仅连接到该节点。如果连接失败,则确定新的主节点并由使用者连接到它。LocalizedQueueConnectionFactory配置了一个默认连接工厂,以防无法确定队列的物理位置,在这种情况下,它将正常连接到集群。

LocalizedQueueConnectionFactory是一个RoutingConnectionFactory, SimpleMessageListenerContainer使用队列名称作为查找键,如上面的路由连接工厂中讨论的那样。

由于这个原因(使用队列名称进行查找),LocalizedQueueConnectionFactory只能在容器被配置为侦听单个队列时使用。

必须在每个节点上启用RabbitMQ管理插件。

这个连接工厂适用于长生命周期的连接,比如SimpleMessageListenerContainer使用的连接。由于在建立连接之前调用REST API的开销,所以不打算使用短连接,比如使用RabbitTemplate。此外,对于发布操作,队列是未知的,而且消息无论如何都会发布给所有集群成员,因此查找节点的逻辑没有什么价值。

 

下面的配置示例展示了如何使用Spring Boot的RabbitProperties来配置工厂:

@Autowired

    private RabbitProperties props;
    private final String[] adminUris = { "http://host1:15672", "http://host2:15672" };
    private final String[] nodes = { "rabbit@host1", "rabbit@host2" };

@Bean

    public ConnectionFactory defaultConnectionFactory() {
        CachingConnectionFactory cf = new CachingConnectionFactory();
        cf.setAddresses(this.props.getAddresses());
        cf.setUsername(this.props.getUsername());
        cf.setPassword(this.props.getPassword());
        cf.setVirtualHost(this.props.getVirtualHost());

return cf; }

@Bean

    public ConnectionFactory queueAffinityCF(
            @Qualifier("defaultConnectionFactory") ConnectionFactory defaultCF) {
        return new LocalizedQueueConnectionFactory(defaultCF,
                StringUtils.commaDelimitedListToStringArray(this.props.getAddresses()),                this.adminUris, this.nodes,
this.props.getVirtualHost(), this.props.getUsername(), this.props.getPassword(),
false, null);

}

 

注意,前三个参数是地址、adminuri和节点的数组。当容器尝试连接到队列时,它确定队列控制在哪个节点上,并连接到相同数组位置的地址

 

发布确认机制

通过将CachingConnectionFactory的publisherconfirm和publisherReturns属性设置为“true”,可以支持已确认和返回的消息。设置了这些选项后,工厂创建的通道实例被包装在PublisherCallbackChannel中,该通道用于促进回调。当获得这样一个通道时,客户机可以在这个渠道上注册一个PublisherCallbackChannel.listener 。PublisherCallbackChannel实现包含了将确认或返回的消息路由到适当的侦听器的逻辑。下面几节将进一步解释这些特性。

还请参见simplepublisherconfirm在Scoped Operations.。

有关更多背景信息,请参见RabbitMQ团队的博客文章《介绍发布者confirm》。

 

Connection and Channel Listeners

连接工厂支持注册ConnectionListener和ChannelListener实现。这允许您接收连接和通道相关事件的通知。(当连接建立时,RabbitAdmin使用ConnectionListener执行声明—有关更多信息,请参见交换、队列和绑定的自动声明)。下面的清单显示ConnectionListener接口定义:

@FunctionalInterface
    public interface ConnectionListener {
        void onCreate(Connection connection);
        default void onClose(Connection connection) {
        }
        default void onShutDown(ShutdownSignalException signal) {
        }

}

 

从2.0版本开始,org.springframework.amqp.rabbit.connection。连接对象可以提供com.rabbitmq.client.BlockedListener 实例,用于通知连接阻塞和解除阻塞事件。下面的例子显示了ChannelListener接口定义:

    @FunctionalInterface
    public interface ChannelListener {
        void onCreate(Channel channel, boolean transactional);
        default void onShutDown(ShutdownSignalException signal) {
        }

}

请参阅“发布是异步的”—如何为您可能希望注册ChannelListener的场景检测成功和失败。

 

Logging Channel Close Events

Version 1.5引入了一种机制,使用户能够控制日志记录级别。

CachingConnectionFactory使用默认策略记录通道关闭,如下所示:

•正常通道关闭(200 OK)不被记录。

•如果通道由于被动队列声明失败而关闭,则将其记录在调试级别。

•如果一个通道因为basic而关闭。由于独占消费者条件而拒绝消费,它记录在INFO级别。

•所有其他日志记录在错误级别。

要修改此行为,可以将自定义的ConditionalExceptionLogger注入

CachingConnectionFactory在它的closeExceptionLogger属性中。参见消费者事件

 

运行时缓存属性

从1.6版开始,CachingConnectionFactory现在通过getCacheProperties()方法提供缓存统计信息。这些统计数据可用于在生产中优化缓存。例如,可以使用high water mark来确定是否应该增加缓存大小。如果它等于缓存大小,您可能需要考虑进一步增加。下表描述了CacheMode.channel属性:

表1。缓存Cache.channel的属性

Property

Meaning

connectionName

 ConnectionNameStrategy生成的连接的名称。

channelCacheSize

当前配置的允许空闲的最大通道

Property

Meaning

localPort

连接的本地端口(如果可用)。这可以用来关联RabbitMQ管理UI上的连接和通道。

idleChannelsTx

当前空闲(缓存)的事务通道的数量。

idleChannelsNotTx

当前空闲(缓存)的非事务性通道的数量。

idleChannelsTxHighWater

The maximum number of transactional channels that have been concurrently idle (cached).

并发空闲(缓存)的事务通道的最大数量。

idleChannelsNotTxHighWater

The maximum number of non-transactional channels have been concurrently idle (cached).

并发空闲(缓存)的非事务性通道的最大数量。

The following table describes the CacheMode.CONNECTION properties:

Table 2. Cache properties for CacheMode.CONNECTION

Property

Meaning

connectionName:<localPort>

The name of the connection generated by the ConnectionNameStrategy.

ConnectionNameStrategy生成的连接的名称。

openConnections

The number of connection objects representing connections to brokers.

表示到代理的连接的连接对象的数量。

channelCacheSize

The currently configured maximum channels that are allowed to be idle.

当前配置的允许空闲的最大通道。

connectionCacheSize

The currently configured maximum connections that are allowed to be idle.

当前配置的允许空闲的最大连接。

idleConnections

The number of connections that are currently idle.

当前空闲的连接数。

idleConnectionsHighWater

The maximum number of connections that have been concurrently idle.

并发空闲的最大连接数。

idleChannelsTx:<localPort>

The number of transactional channels that are currently idle (cached) for this connection. You can use the localPort part of the property name to correlate with connections and channels on the RabbitMQ Admin UI.

此连接当前空闲(缓存)的事务通道的数量。您可以使用属性名的localPort部分来关联RabbitMQ管理UI上的连接和通道。

 idleChannelsNotTx:<localPort
>

The number of non-transactional channels that are currently idle (cached) for this connection. The localPort part of the property name can be used to correlate with connections and channels on the RabbitMQ Admin UI.

此连接当前空闲(缓存)的非事务性通道的数量。属性名的localPort部分可用于与RabbitMQ管理UI上的连接和通道关联。

 idleChannelsTxHighWater:<loc
alPort>

The maximum number of transactional channels that have been concurrently idle (cached). The localPort part of the property name can be used to correlate with connections and channels on the RabbitMQ Admin UI.

并发空闲(缓存)的事务通道的最大数量。属性名的localPort部分可用于与RabbitMQ管理UI上的连接和通道关联。

28

Property

Meaning

idleChannelsNotTxHighWater:<
localPort>

The maximum number of non-transactional channels have been concurrently idle (cached). You can use the localPort part of the property name to correlate with connections and channels on the RabbitMQ Admin UI.

并发空闲(缓存)的非事务性通道的最大数量。您可以使用属性名的localPort部分来关联RabbitMQ管理UI上的连接和通道。

The cacheMode property (CHANNEL or CONNECTION) is also included.

 

RabbitMQ Automatic Connection/Topology recovery

自Spring AMQP的第一个版本以来,该框架在代理失败时提供了自己的连接和通道恢复。此外,正如在配置代理中讨论的,当重新建立连接时,RabbitAdmin会重新声明任何基础设施bean(队列和其他)。因此,它不依赖于现在由amqm -client库提供的自动恢复。Spring AMQP现在使用4.0.x amqm -client的x版本,默认情况下启用了自动恢复功能。如果您愿意,Spring AMQP仍然可以使用它自己的恢复机制,在客户机中禁用它(通过将底层RabbitMQ connectionFactory上的automaticRecoveryEnabled属性设置为false)。但是,该框架与启用的自动恢复完全兼容。这意味着您在代码中创建的任何消费者(可能通过RabbitTemplate.execute())都可以自动恢复。

只有定义为bean的元素(队列、交换器、绑定)在连接失败后才会重新声明。直接从用户代码调用RabbitAdmin.declare*()方法声明的元素对框架来说是未知的,因此无法恢复。如果您需要可变数量的声明,请考虑定义一个或多个声明类型的bean,如在声明交换器、队列和绑定集合时所讨论的那样。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值