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删除文件。
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。