`
dreamoftch
  • 浏览: 497216 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

阿里巴巴dubbo处理文件上传下载

阅读更多

 

 注:使用InputStream 作为方法参数的时候,需要将该参数作为方法的最后一个参数,否则会有问题

 

 

dubbo和hessian的maven依赖:

 

		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>2.5.3</version>
		</dependency>
		<dependency>
			<groupId>com.caucho</groupId>
			<artifactId>hessian</artifactId>
			<version>4.0.7</version>
		</dependency>

 

 

 

服务提供者(项目名称:provider)

 

首先是web.xml配置(使用spring):

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:applicationContext.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<servlet>
		<servlet-name>dubbo</servlet-name>
		<servlet-class>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>dubbo</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>

</web-app>

 

 

 

然后是服务接口:

 

package com.tch.test.dubbo.service;


public interface DemoService {

        String sayHello(String name);
	/**
	 *  Created on: 			2013-12-11 
	 * <p>Discription:			下载</p>
	 * @return 				InputStream
	 */
	public InputStream download(String path);
        /**
         * 处理上传
         * @param in
         * @return
         */
        String upload(String destPath,InputStream in);
}

 

 

 

服务实现类:

 

package com.tch.test.dubbo.service;


import java.io.FileInputStream;
import java.io.InputStream;

public class DemoServiceImpl implements DemoService {
	@Override
	public InputStream download(String path) {
		System.out.println(path+"******************************");
		try {
			InputStream inputStream = new FileInputStream(path);
			return inputStream;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	@Override
	public String sayHello(String name) {
        return "Hello " + name;
    }
	@Override
	public String upload(String destPath,InputStream in) {
		try {
			//FileOutputStream out = new FileOutputStream("E:\\temp\\a.js");
			int n = -1;
			byte[] b = new byte[10240];
			while((n=in.read(b)) != -1){
				System.out.println(new String(b,0,n,"utf-8"));
				//out.write(b, 0, n);
			}
			//out.close();
			//out.flush();
			in.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "upload complete !";
	}

}

 

 

 

 

最重要的applicationContext.xml :

 

参考:dubbo hessian协议

 

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
        			http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
	<!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="hello-world-app"  />
    <!-- 使用multicast广播注册中心暴露服务地址 -->
    <dubbo:registry address="multicast://224.5.6.7:1234" />
    <!-- 用hessian协议在8080(servlet容器的端口)端口暴露服务,contextpath是项目名称,server这里是使用的web.xml里面配置的servlet -->
    <dubbo:protocol name="hessian" port="8080" contextpath="dubbo" server="servlet"/>
    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.tch.test.dubbo.service.DemoService" ref="demoService" />
    <!-- 和本地bean一样实现服务 -->
    <bean id="demoService" class="com.tch.test.dubbo.service.DemoServiceImpl" />
	
</beans>

 

启动项目之后,就同时启动了服务。。。

 

 

 

 

下面是 consumer :

 

首先是服务接口:

 

package com.tch.test.dubbo.service;


public interface DemoService {

        String sayHello(String name);
	/**
	 *  Created on: 			2013-12-11 
	 * <p>Discription:			下载</p>
	 * @return 				InputStream
	 */
	public InputStream download(String path);
        /**
         * 处理上传
         * @param in
         * @return
         */
        String upload(String destPath,InputStream in);
}

 

 

 

 

然后是applicationContext.xml :

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://code.alibabatech.com/schema/dubbo
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        ">
	<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
	<dubbo:application name="consumer-of-helloworld-app" />

	<!-- 使用multicast广播注册中心暴露发现服务地址 -->
	<dubbo:registry address="multicast://224.5.6.7:1234" />

	<!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
	<dubbo:reference id="demoService"
		interface="com.tch.test.dubbo.service.DemoService" />

</beans>

 

 

好了,开始调用provider提供的服务:

 

package com.alibaba.dubbo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.alibaba.dubbo.demo.DemoService;
public class Consumer {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});
        context.start();
        DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务代理
        sayHello(demoService);  //sayHello
        upload(demoService);    //upload
        download(demoService); //download
        context.close();
    }
    //调用sayHello
    public static void sayHello(DemoService demoService){
    	String result = demoService.sayHello(" dubbo "); // 执行远程方法
        System.out.println(result); // 显示调用结果
    }
    //调用upload
    public static void upload(DemoService demoService) throws FileNotFoundException{
    	String result = demoService.upload("E:\\temp\\a.js",new FileInputStream("D:\\Program files\\apache-maven-3.1.0\\repository\\com\\caucho\\hessian\\4.0.7\\hessian-4.0.7.pom")); // 执行远程方法
        System.out.println(result); // 显示调用结果
    }
    
    //调用upload
    public static void download(DemoService demoService) throws Exception{
    	String srcPath = "D:\\Program files\\apache-maven-3.1.0\\repository\\com\\caucho\\hessian\\4.0.7\\hessian-4.0.7.pom";
    	InputStream inputStream = demoService.download(srcPath); // 执行远程方法
    	byte b[] = new byte[1024];
		int n;
		try {
			while ((n = inputStream.read(b)) != -1) {
				System.out.print(new String(b,0,n,"utf-8"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			inputStream.close();
		}
    }
}

 

 

 如果调用到download方法的时候,出现 java.io.IOException: stream is closed    

 

 则此时应该是jar包的问题,貌似这是hessian的一个bug : 关于该bug

 

解决方法下载hessian.jar的源码包,修改 com.caucho.hessian.client.HessianProxy :

 

在   Object value = in.readReply(method.getReturnType()); 这一句话之后加上下面代码:

 

	 if (value instanceof InputStream) {
         value = new ResultInputStream(conn, is, in, (InputStream) value);
         is = null;
         conn = null;
	 }

 

然后重新打包,使用这个新的jar包就没问题了。。。

 

然后,就可以看到sayHello、下载、上传成功的结果了。。。

 

 最后提供一个我自己修改过之后的hessian.jar

 

 

 

 

分享到:
评论
3 楼 g_tao 2016-03-24  
作者你好,你这个例子中服务端是跑在tomcat中吗
2 楼 g_tao 2016-03-24  
作者你好,能把整个项目给我发一份吗?guotao114@126.com
1 楼 huyuran 2015-05-05  

相关推荐

    dubbo上传文件+oss上传文件服务.zip

    首先,Dubbo是由阿里巴巴开源的高性能Java RPC框架,它提供了服务治理、负载均衡、容错等特性,使得微服务之间的通信更加高效和稳定。在本项目中,`file_provider`模块可能是一个实现了文件上传功能的服务提供者,它...

    dubbo相关文件

    Dubbo是一款由阿里巴巴开源的高性能、轻量级的服务框架,它致力于提供一种简单、高效的服务治理解决方案。Dubbo的核心设计理念是面向接口编程,通过服务暴露和服务引用,实现服务间的远程调用(RPC)。在分布式系统...

    dubbo学习资料打包上传

    Dubbo,全称为Apache Dubbo,是阿里巴巴开源的一款高性能、轻量级的服务治理框架,主要用于实现分布式服务之间的调用。它以其强大的服务发现、负载均衡、容错处理等功能,被广泛应用于大型分布式系统中。本资料打包...

    maven+dubbo+eclipse

    接下来,Dubbo是阿里巴巴开源的一款高性能、轻量级的Java RPC框架,它致力于提供面向服务的、高性能的、稳定的服务治理解决方案。Dubbo的核心功能包括服务注册与发现、负载均衡、容错机制等。在本案例中,服务端会...

    Dubbo实现的文件服务器系统(java)

    Dubbo是阿里巴巴开源的一个高性能、轻量级的服务治理框架,它主要用于实现服务间的远程调用,提高系统的可扩展性和可维护性。 【描述】在Java开发中,构建文件服务器系统是为了集中存储、管理和分发文件,以满足多...

    dubbo-hessian协议http请求demo(java)

    在IT行业中,分布式服务框架Dubbo是阿里巴巴开源的一款高性能、轻量级的服务治理方案,它使得服务提供者可以在一个系统中发布服务,而服务消费者可以在任何地方调用这些服务。Hessian是Apache的一个子项目,它是一种...

    dubbo-admin-2.6.0下载

    Dubbo是阿里巴巴开源的一款高性能、轻量级的Java服务治理框架,它主要为企业级分布式应用提供服务治理解决方案。在分布式系统中,服务的管理和监控是非常关键的部分,而dubbo-admin就是这样一个工具,用于监控和管理...

    dubbo(兼容jdk1.8)

    Dubbo是中国阿里巴巴公司开源的一款高性能、轻量级的服务治理框架,主要应用于分布式服务的开发和管理。这个版本的Dubbo尤其适合那些已经或将要升级到Java 8的项目,保证了系统的稳定运行。 【描述】"dubbo-admin....

    dubbo-admin-2.5.4

    Dubbo是阿里巴巴开源的一款高性能、轻量级的服务治理框架,而`dubbo-admin-2.5.4`则是Dubbo框架中的一个重要组件,它是一个用于监控和服务管理的Web应用。这个war包的提供,使得开发者和运维人员能够更便捷地管理和...

    dubbo-admin-2.8.4的war包

    Dubbo是一个高性能、轻量级的开源Java RPC框架,由阿里巴巴集团贡献并维护。而dubbo-admin是Dubbo生态系统中的一个重要组成部分,它提供了图形化的服务治理工具,方便开发者对Dubbo服务进行监控和管理。 【描述】中...

    阿里巴巴的10款开源项目.pdf

    2. **Jstrom**:JStorm是基于Apache Storm的实时流处理框架,优化了网络IO、线程模型等,已被广泛应用于阿里巴巴集团,处理海量数据。JStorm在2015年成为Apache Storm的子项目,为实时大数据处理提供强大支持。 3. ...

    Dubbo管理控制台的安装

    Dubbo管理控制台是阿里巴巴开源的分布式服务框架Dubbo提供的一个可视化管理工具,它主要用于监控和管理Dubbo服务的运行状态。通过Dubbo管理控制台,我们可以直观地查看到Dubbo服务的调用链路、调用次数、异常情况等...

    阿里巴巴的10款开源项目.docx

    阿里巴巴的10款开源项目涵盖了多个领域,包括框架、服务框架、JavaScript 框架、AOP 框架、数据访问框架、Web 框架、MVC 框架、Canvas 图形框架、NodeJs 框架、数据库连接池、JSON 解析器、反向代理测试套件、异步...

    dubbo-admin-2.5.3.war包和部署文档

    Dubbo是阿里巴巴开源的一款高性能、轻量级的Java服务治理框架,它主要提供服务注册、服务发现、调用链路监控、服务配置等能力。在分布式系统中,Dubbo能够帮助开发者实现微服务架构,提高系统的可扩展性和可维护性。...

    netty springmvc dubbo 集成实例

    Dubbo是阿里巴巴开源的一款高性能的RPC框架,它专注于服务之间的远程调用,使得服务调用就像调用本地方法一样简单。Dubbo支持多种协议,如dubbo、http、hessian等,并且可以与Spring无缝集成,方便地管理服务的生命...

    阿里巴巴的10款开源项目 (2).docx

    阿里巴巴作为全球知名的科技巨头,其在...以上这些项目展示了阿里巴巴在软件开发领域的深度和广度,无论是在前端开发、后端架构、数据处理还是测试和调试方面,都有其独特的贡献,为全球开发者提供了宝贵的工具和资源。

    [电子商务]网龙java版仿阿里巴巴b2b平台 v3.0_wl-b2b.rar

    【标题】:“[电子商务]网龙java版仿阿里巴巴b2b平台 v3.0_wl-b2b.rar”指的是一个基于Java技术开发的电子商务系统,该系统模仿了阿里巴巴B2B(Business-to-Business)平台的功能和用户体验。网龙公司是一家知名的...

    dubbo_ZooKeeper安装.zip

    Dubbo 是阿里巴巴开源的一款高性能、轻量级的Java RPC框架,而ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。...

    scala编写的dubbo自动化部署工具

    Dubbo是阿里巴巴开源的高性能、轻量级的Java服务治理框架,主要应用于分布式系统的微服务架构。它提供了服务注册、服务发现、调用链路监控、负载均衡等功能。Dubbo服务可以被轻松地集成到各种环境中,包括Spring框架...

    dubbo多种小案例

    Spring Boot结合Dubbo可以实现文件的上传和下载服务,利用MultipartFile接口处理文件上传,同时提供下载接口,使客户端能够请求获取文件。 3. **MongoDB集成**:MongoDB是一个流行的NoSQL数据库,Spring Boot提供了...

Global site tag (gtag.js) - Google Analytics