Java AMQP防止自动消息读取
我使用SpringAMQP来侦听消息(配置有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"/&
侦听器容器、服务激活器、链、桥接器和聚合器)。在应用程序启动时,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