新浦京81707con > 软件下载 > Retrofit2日志拦截器,Boot中面向切面编程统一处理

原标题:Retrofit2日志拦截器,Boot中面向切面编程统一处理

浏览次数:159 时间:2020-03-16

展示样式如下,复制内容的时候使用鼠标中键实行选中打字与印刷内容:code,央浼格局,url,央求头,央浼体,重回json

对计算机驾驭的都会分晓模拟信号量的机能,当大家多少个线程要访谈同多少个财富的时候,往往会设置一个信号量,当连续信号量大于0的时候,新的线程能够去操作这些财富,操作时非复信号量-1,操作完后非复信号量 1,当随机信号量等于0的时候,必得等待,所以通过决定能量信号量,大家得以决定能够同期展开的并发数。

在互联网央求的支付中,日常会凌驾三种情景,一种是小编在一个分界面必要同临时间伸手二种数码,比方列表数据、广告数据等,全体呼吁到后再一并刷新分界面。另一种是自己的倡议必需满意一定顺序,比方必得先央求个人消息,然后依据个人音信乞求相关内容。那个供给对于举不胜举的操作是能够做到现身调控和注重操作的,不过对于互连网须求这种供给时刻的倡议来讲,效果往往与预期的不一致样,那时就须要用确定性信号量来做叁个说了算。

AOP为Aspect Oriented Programming的缩写,意为:面向切面编制程序,通过预编写翻译形式和平运动行期动态代理完结程序作用的联合爱抚的一种手艺。AOP是Spring框架中的一个要害内容,它通过对既有程序定义贰个切入点,然后在其前后切入差别的实行内容,比如大面积的有:开拓数据库连接/关闭数据库连接、展开职业/关闭专门的学业、记录日志等。基于AOP不会损坏原本程序逻辑,因而它能够很好的对事情逻辑的相继部分开展隔绝,进而使得业务逻辑各部分之间的耦合度收缩,进步程序的可重用性,同一时间加强了费用的频率。

图片 1image.png

GCD信号量

时域信号量是三个卡尺头,在创设的时候会有多少个伊始值,那几个开首值往往代表作者要调节的还要操作的并发数。在操作中,对时域信号量会有三种操作:非数字信号文告与等待。确定性信号公告时,实信号量会 1,等待时,借使实信号量大于0,则会将时域信号量-1,不然,会等待直届时限信号量大于0。哪一天会超越零呢?往往是在事前有个别操作甘休后,大家发出时域信号通告,让随机信号量 1。

说罢概念,我们来探视GCD中的多少个功率信号量操作:

  • dispatch_semaphore_create:创造一个数字信号量(semaphore)
  • dispatch_semaphore_signal:数字信号文告,即让能量信号量 1
  • dispatch_semaphore_wait:等待,直到数字信号量大于0时,就可以操作,同一时候将非数字信号量-1

在选取的时候,往往会创立叁个模拟信号量,然后实行四个操作,每便操作都拭目以俟时域信号量大于0再操作,同期非信号昂-1,操作完后将时限信号量 1,形似上边这些进程:

dispatch_semaphore_t sema = dispatch_semaphore_create(5);
for (100次循环操作) {
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 操作
        dispatch_semaphore_signal(sema);
    });
}

地点代码表示本身要操作玖拾八回,但是控制允许同临时间现身的操作最八唯有5次,当并发量到达5后,时限信号量就减小到0了,此时wait操作会起效率,DISPATCH_TIME_FOREVE本田UR-V表示团体首领久等待,一向等届期域信号量大于0,也正是有操作完结了,将非数字信号量 1了,这时才得以了结等待,实行操作,而且将实信号量-1,这样新的职分又要等待。

上边主要讲四个内容,三个是如何在Spring Boot中引进Aop功用,二是何等运用Aop做切面去联合管理Web须求的日志。

class LoggerInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain?): Response { val orgRequest = chain!!.request() val response = chain.proceed(orgRequest) val body = orgRequest.body() val sb = StringBuilder() if (orgRequest.method() == "POST" && body is FormBody) { val body1 = body for (i in 0 until body1.size { sb.append(body1.encodedName   "="   body1.encodedValue } sb.delete(sb.length - 1, sb.length) //打印post请求的信息 Logger.t(AppConfigs.LOGGER_NET_TAG).d("code="   response.code()   "|method="   orgRequest.method()   "|url="   orgRequest.url()   "n"   "headers:"   orgRequest.headers().toMultimap()   "n"   "post请求体:{"   sb.toString } else { //打印get请求的信息 Logger.t(AppConfigs.LOGGER_NET_TAG).d("code="   response.code()   "|method="   orgRequest.method()   "|url="   orgRequest.url()   "n"   "headers:"   orgRequest.headers().toMultimap } //返回json val responseBody = response.body() val contentLength = responseBody!!.contentLength() val source = responseBody.source() source.request(java.lang.Long.MAX_VALUE) val buffer = source.buffer() var charset = UTF8 val contentType = responseBody.contentType() if (contentType != null) { try { charset = contentType.charset } catch (e: UnsupportedCharsetException) { return response } } if (contentLength != 0L) { //打印返回json //json日志使用鼠标中键进行选中 Logger.t(AppConfigs.LOGGER_NET_TAG).json(buffer.clone().readString } return response }}

多少个乞请甘休后联合操作

若果大家三个页面须求相同的时候开展多个乞求,他们中间倒是不供给各类关系,可是必要等他们都倡议实现了再实行分界面刷新或许其余什么操作。

本条须要大家平常能够用GCD的group和notify来做到:

    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //请求1
        NSLog(@"Request_1");
    });
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //请求2
        NSLog(@"Request_2");
    });
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //请求3
        NSLog(@"Request_3");
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        //界面刷新
        NSLog(@"任务均完成,刷新界面");
    });

notify的职能正是在group中的别的操作全体成就后,再操作本人的内容,所以大家会看出地方八个内容都打印出来后,才打印分界面刷新的原委。

但是当将方面四个操作改成真正的互连网操作后,那一个大约的做法会变得不算,为啥吧?因为互连网央求需求时间,而线程的奉行并不会等待央求实现后才真的算作完结,而是只担负将央浼发出去,线程就感觉本人的职分算实现了,当三个央求都发送出去,就能够施行notify中的内容,但央浼结果重临的小运是不必然的,也就招致分界面都刷新了,央求才回来,那便是不行的。

要排除这么些标题,我们将在采用下面说的实信号量来操作了。

在每一个央浼开端以前,我们成立一个非随机信号量,发轫为0,在倡议操作之后,大家设二个dispatch_semaphore_wait,在号召到结果之后,再将功率信号量 1,也便是dispatch_semaphore_signal。这样做的目标是确认保障在伸手结果尚未回到从前,一贯让线程等待在那,那样二个线程的职务向来在守候,就不会当成完结,notify的开始和结果也就不会推行了,直到每种央浼的结果都回来了,线程职务技巧够截至,那时notify也技术够实施。伪代码如下:

dispatch_semaphore_t sema = dispatch_semaphore_create(0);
[网络请求:{
        成功:dispatch_semaphore_signal(sema);
        失败:dispatch_semaphore_signal(sema);
}];
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);

粮草先行有备无患粮草先行专业

因为急需对web央求做切面来记录日志,所以先引进web模块,并创设二个简易的hello央求的拍卖。

  • pom.xml中引入web模块
<!--Web应用-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • 兑现叁个大约请求处理:通过传播name参数,重临“hello xxx”的作用。
package com.pingkeke.rdf.controller;

import org.springframework.web.bind.annotation.*;

/**
 * 实现一个简单请求处理:通过传入name参数,返回“hello xxx”的功能.
 */

@RestController
public class HelloController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    @ResponseBody
    public String hello(@RequestParam String name) {
        return "Hello "   name;
    }
}

下边,大家得以对地点的/hello须求,实行切面日志记录。

本文由新浦京81707con发布于软件下载,转载请注明出处:Retrofit2日志拦截器,Boot中面向切面编程统一处理

关键词: 新浦京81707con 拦截器 日志 我依然爱iOS 我依然爱

上一篇:新京葡娱乐场官网:IPC之AIDL看这一篇还不够

下一篇:没有了