Java项目间通过文件调用方法工具(frequest)

以下内容是frequest这个项目的README.md文件的内容。

Maven Central
Maven Central
Javadocs
Javadocs
Hex.pm
Hex.pm

一.简介

这是一个用JAVA编写的,可以通过文件进行方法调用请求传输的工具。

项目gitgub地址:https://github.com/BrightLoong/frequest

二.背景

之前在项目中遇到一下的需求,如图所示: 甲处要访问部署在乙处的服务serverB(因为数据库在乙处),不过因为一些限制原因导致甲乙两地的网络不通。但是甲乙两地之间有一个文件传输的系统仅仅可以进行文件的传输交换。

基于以上的条件,考虑在甲地也搭建一个同样的服务serverA(A和B相同,并都加入对请求的处理),。但是过滤它对service层的调用,将方法调用放入文件中(也就是请求文件中),然后将文件发送到乙地对应目录(文件发送的功能并不由这两个系统负责)。serverB将解析文件的请求,调用对应方法,并将结果也存到文件中发送到甲的服务器serveA处,实现请求的响应。

这里把拦截本地方法调用,生请求文件,等待远端返回结果和远端响应文件请求并将结果生成问文件的功能抽取出来,并对这部分功能进行了提炼重构,修改了一些问题,形成了工具frquest(file-request)。

项目背景
项目背景

三.具体思路

实现思路
实现思路

甲:本地服务,需要点去远端服务乙

乙:远端服务,可自己访问自己,亦可以接收甲的请求

  • 甲处发起请求,调用了方法,使用aspectj对方法调用进行拦截
  • 对拦截到的方法进行解析,记录下调用方法名,参数,类,接口等信息,并将信息放入传输bean生成json字符串,写入到文件
  • 把生成的请求文件发送到指定目录,并等待远端返回结果
  • ......
  • 乙远端扫描到请求文件,开始远端方法调用
  • 对文件进行解析,反过来转为json字符串,再转为传输Bean,从中获取方法名,参数等信息,进行一定的处理。使用反射(invok)调用方法,把得到的结果放入传输Bean中,转为json字符串放入结果文件,发送到指定目录
  • ......
  • 甲检测到结果文件,转为json字符串,再转为传输Bean,获取结果信息。

四. 使用

可在java项目中使用。

1. 引用

  • 使用maven的方式引用

    <dependency>
      <groupId>io.github.brightloong</groupId>
      <artifactId>frequest</artifactId>
      <version>1.0</version>
    </dependency>
    

注:如果是java项目需要继承aspectj环境,如果是集成了spring的web项目需要开启aspectj支持

2. 配置发送接收文件的目录

请求端的发送目录是指拦截请求生成的请求文件,接收目录是指发送请求后等待接收的结果文件的目录。

远端的发送目录是值生成的结果文件的发送目录,接收目录是指扫描请求端的请求文件的目录。

项目中使用了xml配置的方式,格式如下。

注:本工具不负责文件的传输,所以如果想用该工具在本机做测试,可以把远端和请求端的send-path和receive-path交替配置

<?xml version="1.0" encoding="UTF-8"?>
<configs>
    <config>
        <send-path>d:\send</send-path>
        <receive-path>d:\receive</receive-path>
    </config>
    <!--远端可以配置多个config,可能会有多个请求端需要同一个远端响应,请求端配置多个也默认只取第一个-->
    <config>
        <send-path>d:\send</send-path>
        <receive-path>d:\receive</receive-path>
    </config>
</configs>

3. 请求端(被拦截端)配置

  • 同样首先需要配置收发文件目录(也就是上面说的xml)

  • 如果是简单的java项目可使用下面的方式启动。

    • 继承ServiceProxyInterceptor并且实现serviceAroundImpl()方法
    • 在实现方法类调用父类的serviceAround()
    • 标注上@Around注解
    • 在Around里面加入切入点,PointConstants.POINT_SERVICE是在工具中定义的一个切入点,也就是对具有自定义注解 @ServiceProxy的方法进行拦截,也可以定义自己的切入点。
    • 启动frequest功能,如下mian()方法中前两行代码所示。
    • 如下,如果要对say()方法进行拦截,则加上 @ServiceProxy注解(前提是你使用了定义的切入点PointConstants.POINT_SERVICE,并且要保证请求端和远端拥有相同的方法,包括方法所在的类和包)
    @Aspect
    public class Test extends ServiceProxyInterceptor{
        @Override
        @Around(PointConstants.POINT_SERVICE)
        public Object serviceAroundImpl(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
            return super.serviceAround(proceedingJoinPoint);
        }
    
        @ServiceProxy
        public String say(String msg) {
            System.out.println(msg);
            return msg;
        }
    
        public static void main(String[] args) {
           //setIsRemote(false),设置为请求端,并设置xml的目录。
            NormalConfig.getInstance().setXmlConfigPath("com/test/xml/config.xml").setIsRemote(false);
           //开启frequest功能
            StartEngine.start();
            Test test = new Test();
            System.out.println(test.say("hello"));
        }
    }
    

4. 远端(相应文件请求端)配置

  • 同样首先需要配置收发文件目录(也就是上面说的xml)

  • 如果是简单的java项目可使用下面的方式启动。如果是web项目,同样也是调用mian()方法中的两行代码,保证其能在合适的地方进行调用,启动功能。

    public class Start {
        public static void main(String[] args) {
              //setIsRemote(true),设置为远端,并设置xml的目录。
            NormalConfig.getInstance().setIsRemote(true).setXmlConfigPath("com/test/xml/config.xml");
           //开启frequest功能
            StartEngine.start();
        }
    }
    

5. 其他配置

下面的配置具有默认值,所以不进行配置也是可以的。

  • sleepTime:休眠时间,单位ms,扫描文件变动的间隔时间和等待远端返回结果的每次等待时间,默认是100ms。
  • waitCount:请求端等待远端返回结果的次数,每次间隔时间为sleepTime,所以总共等待时间为waitCount*sleepTime(ms)。默认等待次数是300次
//设置休眠时间sleepTime,设置等待结果次数300次
 NormalConfig.getInstance().setSleepTime(100).setWaitCount(300);

五. LICENSE

遵循Apache License 2.0

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,169评论 11 349
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 我是从喜马拉雅听蒋勋讲红楼的时候开始认识蒋勋的。 他的声音温和,有一点沙哑,从另一个截然不同的角度来解读红楼里的人...
    喵姐看看阅读 2,100评论 1 8
  • 01 刘珍珍谈了场一天的恋爱。 真的只持续了一天,不到24小时。我本来昨天就想说的,但怕你们说我狗。既然已经歌颂完...
    熊与花的故事阅读 739评论 0 2