当前位置: 首页 > 知识库问答 >
问题:

Spring Integration和RabbitMQ,如何避免轮询入站通道适配器

林亦
2023-03-14

我目前有一个Rabbit MQ Broker设置,带有直接交换,我使用Spring Integration来生成和使用队列中的消息。我使用的是责任链模式,其中我使用SI将消耗的消息从一个POJO传递到另一个POJO。为此,我使用了一个Spring Integration入站通道适配器。这要求它具有对轮询器的引用。

如何移除轮询器,使其不在轮询机制上工作,而是使用回调,以便一旦消息可用,它将从队列中获取消息,同时仍然能够使用SI提供的责任链模式。

ref="eventConsumer" method="onReceiveEvent"
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:int="http://www.springframework.org/schema/integration"
    xsi:schemaLocation="http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-2.0.xsd
                        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <import resource="classpath:datasource-config.xml" />

    <int:logging-channel-adapter id="logger" level="DEBUG" log-full-message="true" />

    <int:channel id="eventChannel">
        <int:interceptors>
            <int:wire-tap channel="logger" />
        </int:interceptors>
    </int:channel>

    <int:channel id="errorChannel">
        <int:interceptors>
            <int:wire-tap channel="logger" />
        </int:interceptors>
    </int:channel>

    <bean id="connectionFactory" class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
        <property name="host" value="${rabbitmq.host}" />
        <property name="port" value="${rabbitmq.port}" />
        <property name="username" value="${rabbitmq.username}" />
        <property name="password" value="${rabbitmq.password}" />
        <property name="virtualHost" value="${rabbitmq.events.virtual.host}" />
    </bean>

    <bean id="rabbitTemplate" class="org.springframework.amqp.rabbit.core.RabbitTemplate">
        <constructor-arg name="connectionFactory" ref="connectionFactory" />
        <property name="exchange" value="${rabbitmq.events.exchange.name}" />
        <property name="routingKey" value="${rabbitmq.events.routing.key}" />
    </bean>

    <bean id="pollingInterval" class="java.lang.String">
        <constructor-arg value="${rabbitmq.message.polling.interval}" />
    </bean>

    <int:poller id="rabbitConsumerPoller" fixed-rate="#{pollingInterval}" error-channel="errorChannel" />

    <bean id="eventConsumer" class="com.idna.events.consumer.EventsConsumer">
        <property name="rabbitTemplate" ref="rabbitTemplate"/>
        <property name="consumerDao" ref="eventsConsumerDao" />
        <property name="queueName" value="${rabbitmq.events.queue.name}" />
    </bean>

    <int:inbound-channel-adapter id="inboundChannelAdapter" channel="eventChannel" ref="eventConsumer" method="onReceiveEvent">
        <int:poller ref="rabbitConsumerPoller"/>
    </int:inbound-channel-adapter>

</beans>

谢了!

共有1个答案

陈松
2023-03-14

使用 向您的EventChannel发送消息。你的消费者不需要知道兔子;它可以通过 调用

 类似资料:
  • 我也有弹出绑定网关适配器,但它也是一样的。我会非常感谢您的帮助。非常感谢

  • 我对Spring集成相当陌生,我正在尝试设置一个简单的用例: 轮询远程RESTendpoint,将返回的有效负载拆分为多行,并将其发送到Kafka出站适配器。我成功地做了类似的事情,使用了一个文件适配器,但我仍然坚持使用HTTP适配器。我不明白如何将轮询器与HTTP入站适配器相关联。 到目前为止,我的方法是创建一个简单的流: inboundChannelAdapter似乎不接受轮询器。在我之前使用

  • 问题内容: Spring Integration FTP中的入站通道适配器和出站通道适配器之间有什么区别?我应该使用哪一个?何时使用? 我从文档中了解到,出站可以发送任何类型的文件(例如byte [],String,java.io.File),但入站仅限于文件类型。那仅仅是区别还是其他? 问题答案: 我建议您首先阅读理论 。 任何Inbound适配器都旨在从外部系统获取数据。Outbound-放置

  • 如果我创建一个SFTP入站通道适配器,并使用在SFTP中配置为channel属性的通道发送一些文件。文件将传输到SFTP远程目录本地目录,还是直接从通道流到本地目录

  • 问题内容: 入站和出站通道适配器之间的根本区别是什么? 任何示例都将非常有帮助。 我已经查看过Spring文档,这种“方向性”的区别对我来说还不清楚。我支持配置了outbound-channel-adapter的应用程序,但是我发现使用 出站 标签可以直观地了解行为计数器。该适配器获取一个外部文件,然后 将其 引入应用程序中, 在 该应用程序中我们解析文件并保留数据。 这类似于这个问题,但是我想更