JMS 使用 ActiveMQ 传送文件

这里使用的 MQ 中间件是开源的 ActiveMQ,我们没有采用 BytesMessage 来按字节传送文件,而是 ActiveMQ 为我们提供了 org.apache.activemq.BlobMessage,可以用它来传送大对象。org.apache.activemq.ActiveMQSession 中有以下几个创建 BlobMessage 对象的方法:

createBlobMessage(URL url)

createBlobMessage(URL url, boolean deletedByBroker)

createBlobMessage(File file)

createBlobMessage(InputStream in)

接收到 BlobMessage 消息后,可以调用其 getInputStream() 方法获得数据,然后写成磁盘文件,文件名、文件大小等可通过 Message 的 getXxxProperty("Property.Name") 取的。

注意,传输入文件的时候,发送方创建 ConnectionFactory 时的 brokerURL 需要指定 jms.blobTransferPolicy.uploadUrl 或者jms.blobTransferPolicy.defaultUploadUrl 属性为 ActiveMQ 中 fileserver 应用的 URI,即指定传输 BlogMessage 的 BlobTransferPolicy 策略,参看 Configuring the BLOB Transfer Policy

先上图看真相,包括执行 FileSender 时选择文件,FileReciever 在收到文件时会弹出保存文件的对话框,还有控制台的打印信息。

具体来看例子,使用 P2P 队列的方式,你也可以用发布/订阅的方式,只是代码中创建的 Destination 类型不同。

1. 启动 ActiveMQ

http://activemq.apache.org/activemq-531-release.html 下载  ActiveMQ,然后解压,执行其中的 bin/activemq.bat,控制台可以看到:

 INFO | ActiveMQ Console at http://0.0.0.0:8161/admin

 INFO | Initializing Spring root WebApplicationContext

 INFO | Successfully connected to tcp://localhost:61616

 INFO | Camel Console at http://0.0.0.0:8161/camel

 INFO | ActiveMQ Web Demos at http://0.0.0.0:8161/demo

 INFO | RESTful file access application at http://0.0.0.0:8161/fileserver

 INFO | Started SelectChannelConnector@0.0.0.0:8161

表示启动成功了,假设运行 ActiveMQ 机器的 IP 地址是 10.80.38.10。

2. 编写发送文件的程序 FileSender.java

3. 编写接收文件的程序 FileReceiver.java

4. 运行程序

先执行 FileReceiver 程序来监听消息

再执行发送程序 FileSender,将会提示你选择一个要传送的文件(上图左边),确定后就会把文件发送到 ActiveMQ 服务器上

接收端 FileReceiver 监听到有文件传过来的消息后,会自动弹出保存文件的对话框,要你选择保存位置(上图右边),文件名能保持一致。确定后就开始接收文件,存到指定的位置。

如果设置 producer.setDeliveryMode(DeliveryMode.PERSISTENT); 消息持久性的话,发送方传文件的时候,接收方可以不在线,文件会暂存在 ActiveMQ 服务器上,等到接收程序上线后仍然可以收到发过来的文件。

参考:1. A problem with blobmessage on activemq 5.0

        2. Apache ActiveMQ > Features > Message Features > Blob Messages

        3. Apache ActiveMQ > Features > Message Dispatching Features > Async Sends

类别: Uncategorized. 阅读(2,489). 订阅评论. TrackBack.

Leave a Reply

Be the First to Comment!

avatar
wpDiscuz