按照JMS规范,为了保证可靠性,所有的消息都应该是发送到broker,然后交由broker来投递的。也即是说其实JMS是不建议或不支持传输文件的。
对于比较小的文件,简单的处理方式是先读取所有的文件成byte[],然后使用ByteMessage,把文件数据发送到broker,像正常的message一样处理。对于大文件,例如1GB以上的文件,这么搞直接把client或是broker给oom掉了。
这种方式仅仅适用于小文件的传输。特别是如果broker端使用数据库作为存储,message序列化以后存放于blob字段,文件传输频繁或是稍微有点大,写入效率极低。
直接传输文件
为了解决传输大文件的问题,ActiveMQ在jms规范之外引入了jms streams的概念。PTP模式下,连到同一个destination的两端,可以通过broker中转来传输大文件。
发送端使用connection.createOutputStream打开一个输出流,往流里写文件。
OutputStream out =connection.createOutputStream(destination)
接收端则简单的使用connection.createInputStream拿到一个输入流,从中读取文件数据即可。
InputStream in = connection.createInputStream(destination)
第一步 安装activemq,参考http://blog.163.com/yangzhanghui_job/blog/static/17957506220127171173225/。第二步 登录activemq查询信息http://localhost:8161/admin/,原始用户名和密码都为admin,为了安全起见,可以修改密码,控制台的登录用户名密码保存在conf/jetty-realm.properties文件中admin: admin(新密码), admin(值得注意的是 用户名和密码的格式是:用户名 : 密码 ,角色名)。
第三步 activemq持久化,默认是<kahaDB directory="${activemq.base}/data/kahadb"/>,activemq总共支持三种持久化,可以自行百度。
第三步 项目中引入activemq,javamail配置文件(pom.xml)!
最近一直在关注一些文件传输中间件的实现,想用ActiveMQ实现一些具体的功能。经过几周的ActiveMQ的学习,以及中间件必须一些功能。发现一些问题自己还是不能搞懂,希望网上一些,大牛拍一下砖,支持一下。1.在消息中间件的消息的路由的算法怎么实现的。
如A、B、C、D、E 五个节点上都是提供消息服务的 AMQ ,五个节点连通成一个网络,连接到 A
节点的客户端可以发消息到五个节点中的任意一个节点,AMQ 会自动寻找一条最佳路径传递消息到目标节点。如从A
发消息到D,有两条连通路径:A->B->C->D 和A->E->D,其中 A->E->D
经过的节点最少,该路径为最佳路径, AMQ 将根据此路径对消息进行传递。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)