目前项目使用的ActiveMQ版本是5.11.1,这个版本中可以使用BlobMessage的方式,用HTTP PUT的方式上传文件到ActiveMQ自带的fileserver中。
这个功能最方便的就是可以直接在生产者中使用BlobMessage来发送文件,ActiveMQ的接口封装了调用该接口的几个步骤:
- 将文件用Put方式传到fileserver中
- 将文件在MQ fileserver服务器上的地址url放在BlobMessage中
- 发送该BlobMessage到MQ
而消费者其实收到的消息并不是文件,而是文件在mq服务器上的地址。消费者可以直接通过getInputStream()方法来得到文件流,而后自己合成文件。这个getInputStream方法其实是http get方法的封装。
所以如果使用了硬件负载均衡如F5来负载均衡mq的客户端连接,很可能导致生产者发送文件消息时带上了F5的地址,从而导致消费者从该地址获取文件时连接到其他MQ。所以客户端需要知道自己连接的哪个MQ,并通过connection.setBlobUploadStrategy()方法来配置文件上传的地址。
现在这些都不用关心了。因为在最新的AMQ的5.14.x及以后版本中,fileserver功能被取消了!
fileserver功能取消的原因有两方面,第一是jira上有人反映这个功能不常用(╯‵□′)╯︵┻━┻;第二是这个功能有个漏洞,可以让用户任意上传文件到Mq服务器的任何位置。还有人做了实验,见http://m.weixindou.com/p/4S63O9N31U.html
AMQ 5.12.x和5.13.x未取消该功能,但是需要手工开启。开启配置在conf/jetty.xml中。
fileserver功能的取消带来的影响主要是生产者再也无法通过默认的http协议直接发送带文件的blobmessage了(会报出404错误),而是需要使用ftp协议来发送blobmessage,或自己将文件传到某个服务器上(通过FTP或其他方式),而后将该文件的url放在BlobMessage中再发送这条BlobMessage。消费者的消费不受影响。
真是坑爹,对我来说,要重写接口还要申请生产开大量火墙了。。。。