ActiveMQ的BlobMessage傳輸檔案樣本:完全嵌入式的使用jetty的fileserver

來源:互聯網
上載者:User

上文《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(); //注意處理完後需要手工刪除伺服器端檔案   

4、運行TestBlob,查看結果:

 => 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(":", "_")

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.