activemq BlobMessage对文件中转的封装

 

举个例子来说,典型的使用步骤:

发送端:

1.        启动ActiveMQ时,也启动jetty(即activemq.xml中有import jetty.xml),此时jetty中运行了一个ActiveMQ自带的http文件服务器

2.        使用tcp://localhost:61616?jms.blobTransferPolicy.defaultUploadUrl=http://localhost:8161/fileserver/创建connection,然后创建session和producer

3.        使用如下代码发送文件:

BlobMessageblobMessage = session.createBlobMessage(file); 

blobMessage.setStringProperty("FILE.NAME",file.getName()); 

blobMessage.setLongProperty("FILE.SIZE",file.length()); 

producer.send(blobMessage); 

接收端比较简单,正常的使用jms接收到消息:

InputStream inputStream = blobMessage.getInputStream();

然后直接读取文件数据即可。文件名和文件大小可以从message的属性中拿到。

这个过程中ActiveMQ做了什么呢?

发送端:producer.send的时候,把文件通过http协议的PUT方法发到jetty中的fileserver(默认128K走http的chunk分片传输)。然后把http的url写入消息中。再把消息发送到broker。

接收端:接收到消息以后,发现是BlobMessage,拿到url,直接使用GET方法获取文件数据。处理完毕后,使用DELETE方法从fileserver删除文件。

activemq BlobMessage对文件中转的封装

BlobMessage支持3种文件中转方式:

FILE

         要求client和broker在同一个机器或者使用同一个共享存储。发送文件的时候,把文件从本地写入到指定路径。接收文件的时候,把文件从此路径读出来。

HTTP

         使用http的fileserver,PUT/GET/DELETE方法。ActiveMQ自带了简单的实现。就是前面场景中使用的方式。

FTP

         使用一个独立的ftpserver作为文件中转方式。发送文件的时候,把文件发送到ftp服务器。接收文件的时候,从ftp把文件读取下来。

详见:http://activemq.apache.org/blob-messages.html

优势:消息处理与文件处理传输分开,极大的提高了文件传输的效率。而且可以使用类似jms协议的方式来处理文件发送。

劣势:FILE方式不太实用。HTTP和FTP方式都需要额外的fileserver。

相关推荐