Java AMQP防止自动消息读取

Java AMQP防止自动消息读取,java,spring,spring-mvc,rabbitmq,spring-amqp,Java,Spring,Spring Mvc,Rabbitmq,Spring Amqp,我使用SpringAMQP来侦听消息(配置有侦听器容器、服务激活器、链、桥接器和聚合器)。在应用程序启动时,AMQP开始读取我们不想要的消息。我尝试了auto startup=false,但它不起作用。我遗漏了什么吗 此外,如果它确实有效,那么如何以编程方式再次启动它们?我尝试了listenerContainer.start()。聚合器和其他的呢 编辑 以下是我的配置: <rabbit:queue name="my_queue1" declared-by="consumerAdmin"/&

我使用SpringAMQP来侦听消息(配置有
侦听器容器、服务激活器、链、桥接器和聚合器
)。在应用程序启动时,AMQP开始读取我们不想要的消息。我尝试了
auto startup=false
,但它不起作用。我遗漏了什么吗

此外,如果它确实有效,那么如何以编程方式再次启动它们?我尝试了
listenerContainer.start()。聚合器和其他的呢

编辑 以下是我的配置:

<rabbit:queue name="my_queue1" declared-by="consumerAdmin"/>
<rabbit:queue name="my_queue2" declared-by="consumerAdmin"/>
<rabbit:queue name="my_batch1" declared-by="consumerAdmin"/>

<int-amqp:channel id="myPollableChannel" message-driven="false" connection-factory="consumerConnFactory" queue-name="my_queue2"/>
<int-event:inbound-channel-adapter channel="myPollableChannel" auto-startup="false"/>

<int-amqp:channel id="myAggregateChannel" connection-factory="consumerConnFactory"/>
<int-event:inbound-channel-adapter channel="myAggregateChannel" auto-startup="false"/>

<int-amqp:channel id="myChannel" connection-factory="consumerConnFactory"/>
<int-event:inbound-channel-adapter channel="myChannel" auto-startup="false"/>

<int-amqp:channel id="myFailedChannel" connection-factory="consumerConnFactory"/>
<int-event:inbound-channel-adapter channel="myFailedChannel" auto-startup="false"/>

<rabbit:template id="genericTopicTemplateWithRetry" connection-factory="connectionFactory" exchange="my_exchange" retry-template="retryTemplate"/>

<rabbit:topic-exchange name="my_exchange" declared-by="consumerAdmin">
        <rabbit:bindings>
            <rabbit:binding queue="my_queue1" pattern="pattern1"/>
            <rabbit:binding queue="my_queue2" pattern="pattern1"/>
        </rabbit:bindings>
</rabbit:topic-exchange>

<int:handler-retry-advice id="retryAdvice" max-attempts="5" recovery-channel="myFailedChannel">
    <int:exponential-back-off initial="3000" multiplier="5.0" maximum="300000"/>
</int:handler-retry-advice>

<int:bridge input-channel="myPollableChannel" output-channel="myAggregateChannel">
    <int:poller max-messages-per-poll="100" fixed-rate="5000"/>
</int:bridge>

<int:aggregator id="myBatchAggregator"
    ref="myAggregator" 
    correlation-strategy="myCorrelationStrategy" 
    release-strategy="myReleaseStrategy" 
    input-channel="myAggregateChannel" 
    output-channel="myChannel" 
    expire-groups-upon-completion="true"
    send-partial-result-on-expiry="true"
    group-timeout="1000" />

<int:chain input-channel="myFailedChannel">
    <int:transformer expression="'Failed to publish messages to my channel:' + payload.failedMessage.payload" />
    <int-stream:stderr-channel-adapter append-newline="true"/>
</int:chain>

<int:service-activator input-channel="myChannel" output-channel="nullChannel" ref="myWorker" method="myMethod">
    <int:request-handler-advice-chain><ref bean="retryAdvice" /></int:request-handler-advice-chain>
</int:service-activator>

<rabbit:listener-container connection-factory="consumerConnFactory" requeue-rejected="false" concurrency="1">
    <rabbit:listener ref="myListener" method="listen" queue-names="queues1" admin="consumerAdmin" />
</rabbit:listener-container>

好的。感谢您的配置

不确定您为什么需要AMQP基础频道,但您的主要问题就在这里

但是请注意,
也有
自动启动=“false”
选项


您将准备好接收来自AMQP的数据,您只需通过其
id
确定
start()
这些通道即可。感谢您的配置

不确定您为什么需要AMQP基础频道,但您的主要问题就在这里

但是请注意,
也有
自动启动=“false”
选项


您将准备好接收来自AMQP的数据,您只需要
start()
这些通道的
id

就可以共享您的配置。不要读取来自AMQP的消息。入站通道适配器上确实存在
自动启动=false
。够了。您不需要担心聚合器和其他Hanks Artem。已经在上面添加了我的配置。我使用以下函数再次打开它:
private void startMessageListeners(){final Map containers=this.applicationContext.getBeansOfType(AbstractMessageListenerContainer.class);if(containers!=null&&!containers.isEmpty()){for(final AbstractMessageListenerContainer容器:containers.values()){if(!container.isRunning()){container.start();}}}
请提出建议。您必须共享您的配置。不要阅读来自AMQP的消息。入站通道适配器上确实存在
自动启动=false
。这就足够了。您不必担心聚合器和其他hanks-Artem。已在上面添加了我的配置。我正在使用以下功能重新打开它:
private void startMessageListeners(){final-Map containers=this.applicationContext.getBeansOfType(AbstractMessageListenerContainer.class);if(containers!=null&&!containers.isEmpty()){for(final-AbstractMessageListenerContainer:containers.values()){if(!container.isRunning()){container.start();}}}}
请建议。即使更新了如下配置:
我仍然得到:
[org.springframework.integration.amqp.channel.PollableAmqpChannel](task-scheduler-1)在PollableAmqpChannel上使用超时值调用receive。由于不支持接收超时,超时将被忽略。
我错过了什么吗?当然。因为你必须使用
停止
myPollableChannel
桥接。抱歉,我错过了。`message driven=“false”`表示不基于
listener
。因此,其生命周期由
poller
端点控制。我让基于listener的频道启动/停止并阻止
PollableAmqpChannel
自动启动。但我无法以编程方式启动()
it.Config/code:
最终对象通道=this.applicationContext.getBean(“myPollableChannel”);if(SmartLifecycle的通道实例){return((SmartLifecycle)channel.stop();}否则if(PollableAmqpChannel的通道实例){//FIXME:无法强制转换到生命周期。如何停止?}
不,如果我们已经在谈论
,那么它就是
端点
,在这种情况下,您必须
start()
就是这样。因此,只需在
中添加一个
id
,并将其用作标识符,以获取执行
start()的bean
即使更新了如下配置:
我仍然得到:
[org.springframework.integration.amqp.channel.PollableAmqpChannel](任务调度器-1)在PollableAmqpChannel上使用超时值调用receive。由于不支持接收超时,超时将被忽略。
我错过了什么吗?当然。因为你必须使用
停止
myPollableChannel
桥接。抱歉,我错过了。`message driven=“false”`表示不基于
listener
。因此,其生命周期由
poller
端点控制。我让基于listener的频道启动/停止并阻止
PollableAmqpChannel
自动启动。但我无法以编程方式启动()
it.Config/code:
最终对象通道=this.applicationContext.getBean(“myPollableChannel”);if(SmartLifecycle的通道实例){return((SmartLifecycle)channel.stop();}否则if(PollableAmqpChannel的通道实例){//FIXME:无法强制转换到生命周期。如何停止?}
不,如果我们已经在谈论
,那么它就是
端点
,在这种情况下,您必须
开始()
就是这样。因此,只需在
中添加一个
id
,并将其用作标识符,以获取执行
开始()
的bean