-
使用RxJava把你的异步调用同步化
每周的定期博客。 本周个人认为的亮点之一是在测试中使用RxJava,把异步调用同步化。让代码变得“清晰”了许多。 如果你使用基于异步的编程方式的话,肯定会碰到一个如何测试的问题。最简单的比如说 AsyncResult<String> foo = asyncService.foo(); 或者基于回调方式的异步代码 asyncSerivce.foo(asyncResult -> { // do stuff }); 前一种还好,后一种在多个异步调用时很容易碰到callback hell的问题。 A.foo(a -> { a.bar(b -> { b.baz(c -> { }); }); }); 比如说上面这种嵌套比较深的代码。一种解决方法是类似JavaScript的Promise的链式调用。 A.foo() .andThen(a -> a.bar()) .andThen(b -> b.baz()) 但是链式调用的一个问题是,在方法调用之间是非简单类型的依赖关系时,你需要一些中间类,而且调用顺序有所变化时,中间类也必须随之改变。比如说上述代码中bar依赖A,baz依赖A与B时 A.foo() .andThen(a -> a.bar().success(b -> (a, b)) .andThen((a, b) -> a.baz(b)) 相比之前的写法会显得繁琐。对此,你可以改用JavaScript的async/await,完全把代码改成同步风格,免去些中间类的需要。 async/await是协程的一种实现,但是Java没有协程,该怎么办?方法很简单,利用类似Future的get把代码同步化就可以了。特别是在测试代码中,异步代码转开成同步代码并没有太大问题。相反的,同步风格的测试代码更好理解。 于是在测试代码中可以这么做 把回调式代码转为Observable事件源 使用Observable的blockGet,blockAwait转换为同步代码 Observable<A>…
-
commons-httpclient 3.x如何按照host单独配置连接数和超时参数
以下内容是个人工作中对commons-httpclient分析的小结。 jakarta commons-httpclient是常用的HTTP Client实现,基于HTTP的协议比如SOAP的一些实现比如XFire也有使用commons-httpclient。作为一个常用的类库,学习如何正确和高效地使用是非常有必要的。 首先,按照官方网站的建议:为了提高性能,建议使用单个httpclient实例。(个人认为开启多个Http Client就像开启多个浏览器实例一样……) 第二,并发情况下使用MultiThreadedHttpConnectionManager,这条不难理解。 接下来是参数配置。官方网站提供的配置文档 中提供了很多参数,这里给出连接数和超时配置(大部分都是配置在HttpConnectionManager级别的:
-
service, manager and dao
酝酿这篇文章其实有一段时间了,只是最近晚上回家之后没啥动力(颓废?),于是只能在某个休息日的早上写了。 首先说明一下service、manager和dao指的是java web中常见的分层,我要讲的是自己在这种分层设计上的进一步理解,基于从学java开始到现在工作两年左右的经验。 简略地概括下现阶段我对分层的职责的认识:
-
returnvalue & xwrapper
introduction 背景是WebService,具体实现是XFire。由于某种原因XFire的Fault无法使用,导致只能使用返回值表示成功与错误的情况。举例如下: // return type class IntWrapper { boolean success; String message; int value; } // client IntWrapper wrapper; if(wrapper == null) throw new NullPointException(“wrapper is null”); if(!wrapper.success) throw new Exception(wrapper.message); return wrapper.value; 实际实现时,发现服务有很多方法,每个方法有各自的返回类型,有部分重复。其次是服务端每个方法都必须try catch,把错误转化为返回值。第三是客户端代码也有重复,每次都要检查是否为null和是否成功。 为了减少重复代码,提供如下方案: