zoukankan      html  css  js  c++  java
  • 使用ActiveMQ 传输文件 以及使用Jetty搭建内嵌文件服务器

    使用Active发送文件

    ActiveMq 本身提供对于传输文件的支持。

    1. 直接传输文件: 使用connection.createOutputStream 的形式。这种方式适合小文件。不能传输大文件。

    2. BlobMessage:(Binary Large OBjects) 这种方式可以传输大文件。其本质是发送一个BlobMessage时,先将文件传输到文件服务器上,然后接受消息时再从文件服务器上取。这样我们在mq里面传输的实际上只是一个文件ID

    本文介绍的是第二种方法,MQ本身自带jetty启动方式。

            ActiveMQConnectionFactory fac = new ActiveMQConnectionFactory(ActiveMQConnectionFactory.DEFAULT_USER, ActiveMQConnectionFactory.DEFAULT_PASSWORD, "tcp://localhost:61616?jms.blobTransferPolicy.defaultUploadUrl=http://localhost:8161/fileserver/");
            Connection createConnection = fac.createConnection();
            createConnection.start();
            ActiveMQSession activeMQSession = (ActiveMQSession) createConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            File file = new File("D:\1.html");
            BlobMessage createBlobMessage = activeMQSession.createBlobMessage(file);
            Queue createQueue = activeMQSession.createQueue("test.blobmessage");
            MessageProducer createProducer = activeMQSession.createProducer(createQueue);
            createProducer.send(createBlobMessage);
            createConnection.close();

    这样就可以发送一个 BlobMessage 消息,接收端接收过程也差不多。就不重述了。

    但是当我使用ActiveMQ自带的服务器做文件服务器时,文件上传时报:PUT was not successful: 401 Unauthorized 异常。于是决定自己搭建基于jetty的文件服务器

    搭建jetty服务器

    1. 首先加入jetty的依赖或者引入jetty的jar包:

        <dependency>
          <groupId>org.eclipse.jetty.aggregate</groupId>
          <artifactId>jetty-all-server</artifactId>
          <version>7.6.4.v20120524</version>
        </dependency>

    2. 从 http://svn.apache.org/repos/asf/activemq/trunk/activemq-fileserver/ 中svn得到MQ提供文件服务的三个类。引入自己的项目

    3. 新建自己的Server类,加入如下代码:

            Server server = new Server(8080);  
            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();  

    4. 启动Server类。注意修改新建ConnectionFactory时的URL设置端口。上面服务器设置的是8080所以链接地址应为:

    tcp://localhost:61616?jms.blobTransferPolicy.defaultUploadUrl=http://localhost:8080/fileserver/

    5. 这样就完成了自己搭建一个MQ文件服务器的过程。再次发送文件和接受文件,成功!

    相关Jetty内嵌服务器参考链接: http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty

    本文MQ的内容参考 http://blog.csdn.net/kimmking/article/details/9421343

  • 相关阅读:
    最大子数组求和并进行条件组合覆盖测试
    Ubuntu 16.04 c++ Google框架单元测试
    The directory '/home/stone/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If execu
    Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/cache/app-info -a -e /usr/bin/appstreamcli; then appstreamcli refresh > /dev/null; fi'
    个人博客作业三:微软小娜APP的案例分析
    补交 作业一
    补交 作业二:个人博客作业内容:需求分析
    嵌入式软件设计第12次实验报告
    嵌入式软件设计第11次实验报告
    嵌入式软件设计第10次实验报告
  • 原文地址:https://www.cnblogs.com/atio/p/3628248.html
Copyright © 2011-2022 走看看