spring-xd中是否有API写入消息总线?

时间:2015-01-29 22:53:21

标签: spring-integration spring-xd

考虑到可以使用spring-xd部署任何消息总线,是否有spring-xd提供的任何API可以根据xd / config / servers.yml中的配置写入部署的消息总线,例如Kafka / rabbitmq或任何其他这样的地方。

我正在编写一个处理器(itemprocessor),它处理数据,编写器现在将数据写入rabbitmq队列。因为,在当前的部署场景中,Rabbitmq可能部署也可能不部署,处理器应该能够写入默认的Redis消息总线。我知道我可以使用spring-rabbit提供的apis写入rabbitmq但是这会绑定我的处理器到RabbitMQ。我正在寻找一种概括它的方法。我试着查看spring-xd代码,看看是否有这样的例子。我找到了一个MessageProcessor示例,但是这个示例是一个流处理器,不确定如何应用它或者我是否在正确的轨道上。

https://github.com/spring-projects/spring-xd/blob/master/spring-xd-rxjava/src/test/java/org/springframework/xd/rxjava/PongMessageProcessor.java

我刚开始使用spring-xd,所以如果已经讨论过,请原谅我的无知。任何指针都非常感谢。

更新

感谢Gary,根据你的回答,我尝试了spring-integration jms样本。

我有一个春季批处理作业

<batch:chunk reader="reader" processor="processor" writer="writer" /> 

我希望将编写器的输出写入任何基础消息总线,RabiitMQ开始。所以我根据我在示例中看到的内容添加了以下内容:

 <beans:bean id="writer" class="abc" scope="step">
</beans:bean>

<channel id="outputme"/>

                                                                                   

<beans:bean id="requestQueue" class="org.apache.activemq.command.ActiveMQQueue">
    <beans:constructor-arg value="queue.demo"/>
</beans:bean>

<beans:bean id="replyQueue" class="org.apache.activemq.command.ActiveMQQueue">
    <beans:constructor-arg value="queue.reply"/>
</beans:bean>

<jms:outbound-gateway request-channel="outputme"
                      request-destination="requestQueue"
                      reply-channel="jmsReplyChannel"/>

<channel id="jmsReplyChannel" />

<beans:beans profile="default">

    <stream:stdout-channel-adapter channel="jmsReplyChannel" append-newline="true"/>

</beans:beans>

当我执行此操作时,我看到以下输出,这使我相信某些内容已写入嵌入式ActiveMQ代理。

16:05:42,400 [AbstractApplicationContext] - Closing org.springframework.context.support.GenericApplicationContext@125a6d70: startup date [Tue Feb 03 16:05:40 PST 2015]; root of context hierarchy
16:05:42,401 [DefaultLifecycleProcessor$LifecycleGroup] - Stopping beans in phase 0
16:05:42,402 [EventDrivenConsumer] - Removing {jms:outbound-gateway} as a subscriber to the 'outputme' channel
16:05:42,402 [AbstractSubscribableChannel] - Channel 'org.springframework.context.support.GenericApplicationContext@125a6d70.outputme' has 0 subscriber(s).
16:05:42,402 [AbstractEndpoint] - stopped org.springframework.integration.config.ConsumerEndpointFactoryBean#0
16:05:42,402 [EventDrivenConsumer] - Removing {service-activator} as a subscriber to the 'jmsReplyChannel' channel
16:05:42,402 [AbstractSubscribableChannel] - Channel 'org.springframework.context.support.GenericApplicationContext@125a6d70.jmsReplyChannel' has 1 subscriber(s).
16:05:42,402 [AbstractEndpoint] - stopped org.springframework.integration.config.ConsumerEndpointFactoryBean#1
16:05:42,402 [EventDrivenConsumer] - Removing {stream:outbound-channel-adapter(character)} as a subscriber to the 'jmsReplyChannel' channel
16:05:42,403 [AbstractSubscribableChannel] - Channel 'org.springframework.context.support.GenericApplicationContext@125a6d70.jmsReplyChannel' has 0 subscriber(s).
16:05:42,403 [AbstractEndpoint] - stopped org.springframework.integration.config.ConsumerEndpointFactoryBean#2

然而,当我尝试通过更改connectionfactory来改变使用RabbitMQ的ActiveMQ时:

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

我收到错误说:

 Cannot convert value of type [org.springframework.amqp.rabbit.connection.CachingConnectionFactory] to required type [javax.jms.ConnectionFactory] for property 'connectionFactory'

我根据http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd的模式文件中提到的内容理解,因为所需的类型是元素connection-factory的javax.jms.ConnectionFactory。我环顾四周,没有找到为RabbitMQ创建conenctionFactory的方法,就像我们为ActiveMQ创建ConnectionFactory一样。

我环顾四周,不知道如何解决这个问题。也许我错过了一些非常基本的东西。我甚至不确定这是否是正确的方法。你能告诉我我错过了什么,如果这是正确的方法吗?如果已经讨论过,我会提前道歉。

再次感谢您的时间。


非常感谢您的时间。

的问候,

爱丽丝

1 个答案:

答案 0 :(得分:1)

MessageBus SPI非常适用于XD模块内通信;它不是为任意应用程序级消息传递而设计的。

也就是说,XD(及其消息总线实现)广泛使用Spring Integration project

该项目提供了您需要的抽象。您可以发送到消息通道(使用MessagingGatewayMessagingTemplate,并且在该通道的下游,您可以连接任何类型的通道适配器(rabbit [amqp],redis等)。

因此,您的项目处理器与接收消息的实际技术分离。

查看Spring Integration参考手册(项目页面上有一个链接)。