先从业务场景分析,要完成数据的分析处理功能。根据数据的不同种类,先调用groovy或者python脚本等中的一种处理数据,处理完数据的后需要流程相同。

  要支持处理能力的动态扩展,也就是框架完成后,可以再增加新的处理能力,而不改变原有的代码。如要增加el处理数据的能力。

  这时ServiceLoader可以方便的完成需求。

  先看所需的模块。groovy,python模块是具体的处理模块。plat模块使用ServiceLoader调用groovy或者python模块,再完成后续处理。pon模块是一个业务测试模块

  

  先看plat模块中的接口类IService:

package com.service;

public interface IService {
String getService(); String handle();
}

  DataProcess类,ServiceLoader调用groovy或者python模块:

package com;

import com.service.IService;
import java.util.ServiceLoader; public class DataProcess {public IService getService(String name) {
IService properService = null;
ServiceLoader<IService> serviceLoader = ServiceLoader.load(IService.class);
for (IService service : serviceLoader) {
if (service.getService().equalsIgnoreCase(name)) {
properService= service;
}
}
return properService;
} }

  GroovyService,使用groovy处理数据的示例代码:

package com;

import com.service.IService;

public class GroovyService implements IService {

    public String getService() {
return "groovy";
} public String handle() {
return "groovy handle data";
} }

  groovy模块下的resources下,要有META-INF\services\com.service.IService文件,内容如下:

com.GroovyService

  

  再看业务测试模块pon下的测试类:

package com.pon;

import com.GroovyService;
import com.PythonService;
import com.DataProcess; public class TestProcess {
public static void main(String[] args) {
DataProcess process = new DataProcess();
GroovyService groovyService = (GroovyService) process.getService("groovy");
PythonService pythonservice = (PythonService) process.getService("python");
System.out.println(groovyService.handle());
System.out.println(pythonservice.handle());
}
}

  测试的结果为:

  需要增加el处理能力时,新增el模块,plat模块的处理不需要改变。

  ServiceLoader会classpath下的jar包,分析META-INF/services中放置提供者配置文件来标识服务提供者。看看pon模块的依赖。

 

  

  Hadoop FileSystem就是通过这个机制来根据不同文件的scheme来返回不同的FileSystem。

private static void loadFileSystems() {  

  synchronized(FileSystem.class){  

    if(!FILE_SYSTEMS_LOADED) {  

      ServiceLoader<FileSystem> serviceLoader = ServiceLoader.load(FileSystem.class); 

      for(FileSystem fs : serviceLoader) {  

        SERVICE_FILE_SYSTEMS.put(fs.getScheme(),fs.getClass());  

      } 

      FILE_SYSTEMS_LOADED= true; 

    } 

  } 

}

  对应的配置文件:

org.apache.hadoop.fs.LocalFileSystem 

org.apache.hadoop.fs.viewfs.ViewFileSystem 

org.apache.hadoop.fs.s3.S3FileSystem 

org.apache.hadoop.fs.s3native.NativeS3FileSystem 

org.apache.hadoop.fs.kfs.KosmosFileSystem 

org.apache.hadoop.fs.ftp.FTPFileSystem 

org.apache.hadoop.fs.HarFileSystem

  可以看到FileSystem会把所有的FileSystem的实现都以scheme和class来cache,之后就从这个cache中取相应的值。因此,以后可以通过ServiceLoader来实现一些类似的功能,而不用依赖像Spring这样的第三方框架。

  

   

最新文章

  1. python基础八
  2. JSON.stringify()和JOSN.parse()
  3. HDU 2853 (KM最大匹配)
  4. DES算法详解
  5. iOS数组排序
  6. centos6 自启动任务
  7. Unity3D脚本中文系列教程(十一)
  8. hdu 5441 Travel 离线带权并查集
  9. IOS实现UIButton图文混排、自定义按钮按下和正常状态下不同的背景颜色、根据文字长度自定义UIButton长度
  10. MySQL Full Join的实现
  11. POST和Get辨析
  12. iOS使用UIScrollView实现左右滑动UITableView和UICollectionView
  13. Java谜题——类谜题(二)
  14. Nodejs之编辑器ueditor
  15. forEach、map、filter、some、every五个数组方法
  16. HDU-1242-Rescu
  17. 利用Swagger2自动生成对外接口的文档
  18. css预编译语言 sass scss(变量$var, css嵌套规则,@import规则,@extend,@mixin)
  19. ansible小计
  20. ELK大流量日志分析系统搭建

热门文章

  1. 重写&amp;重载
  2. protobuf GetExtension
  3. SimpleEntity
  4. [转] VS2017 打包安装程序
  5. kafka 学习资料
  6. zookeeper 图形化的客户端工具:ZooInspector
  7. taro 学习资料
  8. vim使用技巧大全
  9. 在CentOS6.8系统上安装MySQL5.7(转)
  10. API - .addClass()