如何轮询目录中的文件,并使用spring集成将文件发送到消息队列

时间:2014-09-03 03:54:26

标签: java spring jms activemq spring-integration

我正在尝试开发一个应用程序,我希望能够将zip文件发送到在单独的服务器上运行的消息传递队列。我已经使用ActiveMQ成功实现了消息传递位,并且队列已启动并正在侦听服务器端的消息。 我有一个类似的应用程序,它将json文件作为消息发送到队列,它工作正常。我正在尝试根据前一个应用程序的实现来编写我的应用程序。

以下是我的spring集成配置的一部分:

<int-file:inbound-channel-adapter id="filesIn" directory="${harvest.directory}" filename-pattern="*.zip">
    <int:poller id="poller" fixed-rate="${harvest.pollRate}" max-messages-per-poll="${harvest.queueCapacity}" />
</int-file:inbound-channel-adapter>

<int:transformer id="copyFiles" input-channel="filesIn"
    output-channel="routingChannel" ref="transformationHandler" method="handleFile"/>

<int-jms:outbound-channel-adapter id="jmsOut" destination="requestQueue" channel="filesIn"/>
.
.
.
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="${activemq.url}" />
</bean>
<bean id="requestQueue" class="org.apache.activemq.command.ActiveMQQueue">
    <constructor-arg value="myQueue"/>
</bean> 

你可以看到有一个变压器。但在我的情况下,如果可能的话,我没有任何改变,也很乐意放弃变压器。我只需要能够在目录中查询zip文件,只要有一个,就把它发送到名为myQueue的队列。不幸的是,从filesIn入站通道适配器接收文件并使用jmsOut出站通道适配器发送到队列的方法似乎无法正常工作。

我不确定这是否是正确的方法,或者它是否可行。有人可以告诉我这里有什么问题,我该怎么办?

2 个答案:

答案 0 :(得分:3)

我知道您的问题是如何在Spring中完成此操作,但是您是否考虑过使用Apache Camel

最具体的是File组件和一个JMS(JMS / ActiveMQ)组件。

它为您进行轮询,并且具有高度可配置性。它还可以与您在示例中使用的其他技术非常匹配。该路由可以完全在Spring中配置。

答案 1 :(得分:2)

您是否尝试发送File对象或内容?

虽然java.io.FileSerializable,但它并没有真正正确传输(它有许多瞬态字段)。

如果服务器可以访问文件系统(例如NFS),则只传输文件名...

<int:transformer ... expression="payload.absolutePath" />

如果要传输zip文件的内容,请使用

<int-file:file-to-bytes-transformer/>

相关问题