ActiveMQ的BlobMessage传输文件示例:完全嵌入式的使用jetty的fileserver
来源:互联网 发布:ubuntu alt 指令 编辑:程序博客网 时间:2024/06/06 07:49
上文《ActiveMQ传输文件的几种方式原理与优劣》中提到BlobMessage这种利用fileserver中转的高效处理文件的方式。
其实ActiveMQ自带的web console中已经有了fileserver的demo,位于ActiveMQ安装目录的webapps下。
启动ActiveMQ的时候,如果配置文件中import了jetty.xml,一般会自动加载这个fileserver,就可以使用了。
另外,如果在embedded的环境下使用ActiveMQ,也可以简单的完全embedded的方式使用这个fileserver。
只需要两个步骤:
1、拿到fileserver的代码。很简单,就3个类,而且不需要什么依赖包。
从http://svn.apache.org/repos/asf/activemq/trunk/activemq-fileserver/ 拿到这三个类,可以mvn eclipse:eclipse方式变成项目再引用,
也可以直接把这几个类复制到自己的项目代码里去。
2、嵌入方式启动jetty并加载fileserver
Server server = new Server(8162);ServletContextHandler handler = new ServletContextHandler ();handler.setResourceBase("."); handler.setContextPath("/fileserver");System.out.println(handler.getServletContext().getRealPath("/")); handler.addFilter(org.apache.activemq.util.FilenameGuardFilter.class, "/*", DispatcherType.FORWARD.ordinal() );handler.addFilter(org.apache.activemq.util.RestFilter.class, "/*", DispatcherType.FORWARD.ordinal() );ServletHolder defaultServlet = new ServletHolder();defaultServlet.setName("DefaultServlet");defaultServlet.setClassName("org.eclipse.jetty.servlet.DefaultServlet");handler.addServlet(defaultServlet, "/*");server.setHandler( handler );server.start();然后就可以启动fileserver来使用了。可以简单测试一下。
步骤如下:
1、手工启动一个ActiveMQ,嵌入或是独立的都可以。
2、运行上面的代码,启动jetty。
3、使用如下代码发送了接收文件:
package kk;import java.io.File;import java.io.InputStream;import java.util.List;import javax.jms.Message;import javax.jms.MessageConsumer;import javax.jms.MessageListener;import javax.jms.MessageProducer;import javax.jms.Queue;import javax.jms.Session;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;import org.apache.activemq.ActiveMQSession;import org.apache.activemq.BlobMessage;import org.apache.activemq.command.ActiveMQBlobMessage;import org.apache.activemq.command.ActiveMQQueue;import org.apache.commons.io.IOUtils;public class TestBlob {public static void main(String[] args) {try {ActiveMQConnectionFactory factoryA = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616?jms.blobTransferPolicy.defaultUploadUrl=http://localhost:8162/fileserver/");Queue queue = new ActiveMQQueue("blob.kk");ActiveMQConnection conn = (ActiveMQConnection) factoryA.createConnection();conn.start();ActiveMQSession session = (ActiveMQSession) conn.createSession(false, Session.AUTO_ACKNOWLEDGE);MessageConsumer consumer = session.createConsumer(queue);MessageListener listener = new MessageListener() {public void onMessage(Message message) {try {System.out.println(" => receive from blob.kk: ");if (message instanceof BlobMessage) {System.out.println("filename:"+message.getStringProperty("FILE.NAME"));System.out.println("filesize:"+message.getLongProperty("FILE.SIZE")); BlobMessage blobMessage = (BlobMessage) message; InputStream in = blobMessage.getInputStream(); List list = IOUtils.readLines(in); for(Object s : list) System.out.println(s); in.close(); ((ActiveMQBlobMessage)blobMessage).deleteFile();//注意处理完后需要手工删除服务器端文件 }} catch (Exception e) {e.printStackTrace();}}};consumer.setMessageListener(listener);File file = new File("D://y.txt");MessageProducer producer = session.createProducer(queue);BlobMessage blobMessage = session.createBlobMessage(file);blobMessage.setStringProperty("FILE.NAME",file.getName()); blobMessage.setLongProperty("FILE.SIZE",file.length()); producer.send(blobMessage);} catch (Exception e) {e.printStackTrace();}}}特别要注意broker是不会自动删除文件的,需要手工删除:
((ActiveMQBlobMessage)blobMessage).deleteFile(); //注意处理完后需要手工删除服务器端文件
=> receive from blob.kk:
filename:y.txt
filesize:39
hello,BlobMessage and jetty FileServer
文件没有被成功消费之前,在fileserver运行的项目文件夹下可以看到类似如下文件:ID_kimmking-33950-1374560343447-1_1_1_1_1
文件名和消息的关系是 filename = msg.getJMSMessageID().toString().replace(":", "_")
- ActiveMQ的BlobMessage传输文件示例:完全嵌入式的使用jetty的fileserver
- 使用ActiveMQ的BLOBMessage
- 嵌入式jetty的使用
- Jetty学习【一】 Jetty的嵌入式使用
- 一个简单的文件共享工程 -- FileServer
- Puppet的fileserver注意事项
- activemq 对象的传输
- 【ActiveMQ】ActiveMQ的使用
- ActiveMQ传输文件的几种方式原理与优劣
- ActiveMQ传输文件的几种方式原理与优劣
- ActiveMQ传输文件的几种方式原理与优劣
- ActiveMQ传输文件的几种方式原理与优劣
- ActiveMQ传输文件的几种方式原理与优劣
- ActiveMQ传输文件的几种方式原理与优劣
- ActiveMQ传输文件的几种方式原理与优劣
- ActiveMQ传输文件的几种方式原理与优劣
- golang http.FileServer 遇到的坑
- java 嵌入式的Web服务器jetty使用例子
- Available Memory is low
- 解决source insight输入中文间距大,删除键Del键左右方向光标半个汉字的问题
- iOS 切换到后台任务执行
- FileUpload控件使用
- 黑马程序员享元设计模式
- ActiveMQ的BlobMessage传输文件示例:完全嵌入式的使用jetty的fileserver
- lab3
- GridView的监听,选择,美化等详解<一>
- Android 高级控件学习--ProgressDialog
- java HashMap 高效遍历
- oracle首字母大写
- NOI 2003 逃学的小孩
- myeclipse注册码生成
- IIS的HTTPERR错误日志引起C盘占用率过高解决方法