当前位置: 当前位置:首页 > 关正杰 > 2021 CCF全国高功用核算学术年会 正文

2021 CCF全国高功用核算学术年会

2025-03-05 00:23:37 来源:使心作幸网 作者:汕头市 点击:302次

1月20日,国高功用北京商报记者了解到,国高功用近期,嘉峪关市公安局成功破获全省首例以自残方法施行稳妥诈骗系列案子,捕获违法嫌疑人3名,触及全国10家稳妥公司,诈骗数额263.5万元。

2024年,核算珲春海洋经济发展示范区区域生产总值超越50亿元(人民币,下同),同比增加10%。记者14日从珲春市官方了解到,学术本年,当地将发动珲春口岸才智化项目,建造珲春南站配套铁路专用线,以进步海洋班列、邮政专列等货运通道运输能力

2021 CCF全国高功用核算学术年会

活动由该区区委宣传部、国高功用区直机关党工委、国高功用区委老干部局、区机关事务管理服务中心、区文联主办,区晚年诗书画研究会、区书法家协会、区硬笔书法协会、区拍摄家协会承办,旨在宏扬中华优异传统文化,营建机关文艺气氛,凝集机关干部精神力量。1月20日,核算长春市绿园区机关干部墨香迎新春丹青谱篇章笔会沟通暨新春送福活动发动。20余位书法家和机关干部齐聚一堂、学术创造沟通,一起书写春联、福字,传递新春夸姣祝愿。

2021 CCF全国高功用核算学术年会

在调和欢喜的气氛中,国高功用书法家展纸挥毫,国高功用以灵敏的笔法、真诚的情感,将对新年的神往与祝愿融入到一副副精美的对联、一个个夸姣的福字中,表达诚挚的新春问好缅因、核算英短、核算布偶、暹罗,北京三里屯的一家大型宠物店里,几十只抢手种类猫被分置在宠物柜里对外展现,柜门上标示着猫的种类、性别、年纪等信息。

2021 CCF全国高功用核算学术年会

除了传统的一口价买断,学术用户还能够领养价+每月日子费的方法具有自己的小猫。

因而,国高功用当宠物工业以领养之名,国高功用行商业之实,不只严峻背离了领养的实质,将本来的公益领养歪曲成获取经济利益的东西,也让那些真实致力于动物维护的安排和个人的尽力,在大众眼中变得模糊不清。布景开发排查体系问题用得最多的手法便是检查体系日志,核算信赖不少人都值过班当过小秘吧:核算给下接口和收支参吧,费事看看日志里的有没有反常信息啊等等,可是在并发大时运用日志定位问题仍是比较费事,因为很多的其他用户/其他线程的日志也一同输出穿行其间导致很难筛选出指定恳求的悉数相关日志,以及下流线程/服务对应的日志,乃至一些特别场景的收支参只打印了一些比如gis坐标、四级地址等没有单据信息的日志,使得日志定位起来十分不方便场景剖析自己地点组担任的体系首要是web运用,其间涉及到的恳求办法首要有:springmvc的servlet的http场景、jsf场景、MQ场景、resteasy场景、clover场景、easyjob场景,每一种场景都需求不同的办法进行logTraceId的透传,接下来逐一探析上述各个场景的透传计划。

在这之前咱们先要简略了解一下日志中透传和打印logTraceId的办法,学术一般咱们运用MDC进行logTraceId的透传与打印,学术可是根据MDC内部运用的是ThreadLocal所以只要本线程才有用,子线程服务的MDC里的值会丢掉,所以这儿咱们要么是在一切涉及到父子线程的当地以编码侵入式自行完结值的传递,要么便是经过覆写MDCAdapter:经过阿里的TransmittableThreadLocal来处理父子线程传递问题,而本文选用的是比较粗糙地以编码侵入式来处理此问题。Slf4jpublicclassServiceExporterTraceIdServletextendsServiceExporterServlet{Overridepublicvoidservice(ServletRequestreq,ServletResponseres)throwsServletException,IOException{try{StringtraceId=MDC.get(traceId);if(StringUtils.isBlank(traceId)){MDC.put(traceId,TraceUtils.getTraceId());}}catch(Exceptione){log.error(clover恳求servlet履行反常,e);}try{super.service(req,res);}catch(Throwablee){log.error(clover恳求servlet履行反常,e);throwe;}finally{try{MDC.clear();}catch(RuntimeExceptionex){log.error(clover恳求servlet履行反常,ex);}}}}2.新建一个笼统类承继AbstractScheduleTaskProcess,国高功用在类中以编码办法进行父子线程的透传(可优化:国高功用经过覆写MDCAdapter:经过阿里的TransmittableThreadLocal来处理父子线程传递问题),一切使命均改为承继此类,要害代码如下try{traceId=MDC.get(LogConstants.MDC_LOG_TRACE_ID_KEY);if(StringUtils.isBlank(traceId)){log.warn(clover自定义log盯梢拦截器预警,mdc没有traceId);}}catch(RuntimeExceptione){log.error(clover自定义log盯梢拦截器履行反常,e);}finalStringlogTraceId=traceId;while(iterator.hasNext()){finalListlist=(List)iterator.next();this.executor.submit(newCallable(){publicObjectcall()throwsException{try{if(StringUtils.isNotBlank(logTraceId)){MDC.put(LogConstants.MDC_LOG_TRACE_ID_KEY,logTraceId);}}catch(RuntimeExceptione){log.error(clover自定义log盯梢拦截器履行反常,e);}Objectvar1;try{if(BaseTcTaskProcessWorker.logger.isInfoEnabled()){BaseTcTaskProcessWorker.logger.info(正在履行使命[+this.getClass().getName()+],条数:+list.size()+...);}BaseTcTaskProcessWorker.this.executeTasks(list);if(BaseTcTaskProcessWorker.logger.isInfoEnabled()){BaseTcTaskProcessWorker.logger.info(履行使命[+this.getClass().getName()+],条数:+list.size()+成功!);}var1=null;}catch(Exceptionvar5){BaseTcTaskProcessWorker.logger.error(var5.getMessage(),var5);throwvar5;}finally{try{MDC.clear();}catch(RuntimeExceptionex){log.error(clover自定义log盯梢拦截器履行反常,ex);}latch.countDown();}returnvar1;}});}easyjob场景easyjob的大体机制是在项目发动的时分经过扫描完结接口Scheduler的类进行上报注册,一同发动一个acceptor(获取使命的线程池),而acceptor拉取到使命后会将父使命放进一个叫executor的线程池,子使命范进一个叫slowExecutor的线程池,咱们能够新建一个抽奖类完结接口ScheduleFlowTask,复用clover场景硬编码办法进行父子线程logTraceId的透传处理(可优化:经过覆写MDCAdapter:经过阿里的TransmittableThreadLocal来处理父子线程传递问题),示例代码如下Slf4jpublicabstractclassAbstractEasyjobOnlyScheduleProcessimplementsScheduleFlowTask{/***EASYJOB渠道UMP监控key前缀*/privatestaticfinalStringEASYJOB_UMP_KEY_RREFIX=trans.easyjob.dotask.;/***EASYJOB单个使命处理分布式锁前缀*/privatestaticfinalStringEASYJOB_SINGLE_TASK_LOCK_PREFIX=basic_easyjob_single_task_lock_prefix_;/***环境标识-开关装备进行环境阻隔*/Value(${spring.profiles.active})privateStringactiveEnv;Value(${task.scene.mark})privateStringsceneMark=TaskSceneMarkEnum.PRODUCTION.getDesc();/***easyJob维度线程池变量*/privateThreadPoolExecutoreasyJobExecutor;/***easyJob维度服务器个数-分片个数*/privatevolatileinteasyJobLastThreadCount=0;/***easyjob多线程称号*/privatestaticfinalStringEASYJOB_THREAD_NAME=dts.easyJobs;/***子类的泛型参数类型*/privateClassargumentType;/***无参结构*/publicAbstractEasyjobOnlyScheduleProcess(){//设置子类泛型参数类型argumentType=this.getArgumentType();}AutowiredprivateRedisHelperredisHelper;/***非task表扫描待处理的使命数据*paramtaskServerParam*paramcurServer*return*/protectedabstractListloadTasks(TaskServerParamtaskServerParam,intcurServer);/***事务处理笼统办法-单个*paramtask*/protectedabstractvoiddoSingleTask(Ttask);/***事务处理笼统办法-批量*paramtasks*/protectedabstractvoiddoBatchTasks(Listtasks);/***组装ump监控key*paramprefix*paramtaskNameKey*return*/privateStringgetUmpKey(Stringprefix,StringtaskNameKey){StringBufferumpKeyBuf=newStringBuffer();umpKeyBuf.append(prefix).append(taskNameKey);returnumpKeyBuf.toString();}/***easyjob渠道异步使命回调办法*paramscheduleContext*return*throwsException*/OverridepublicTaskResultdoTask(ScheduleContextscheduleContext)throwsException{StringrequestNo=TraceUtils.getTraceId();try{StringtraceId=MDC.get(LogConstants.MDC_LOG_TRACE_ID_KEY);if(StringUtils.isBlank(traceId)){MDC.put(LogConstants.MDC_LOG_TRACE_ID_KEY,requestNo);}}catch(Exceptione){log.error(easyjob履行反常,e);}EasyJobTaskServerParamtaskServerParam=null;CallerInfocallerinfo=null;try{//条件转化taskServerParam=EasyJobCoreUtil.transTaskServerParam(scheduleContext);StringtaskNameKey=getTaskNameKey();StringumpKey=getUmpKey(EASYJOB_UMP_KEY_RREFIX,taskNameKey);callerinfo=Profiler.registerInfo(umpKey,Constants.TRANS_BASIC,false,true);//多服务器,而且非子使命,本次不履行,提交子使命if(taskServerParam.getServerCount()>1&&!taskServerParam.isSubTask()){submitSubTask(scheduleContext,taskServerParam,requestNo);returnTaskResult.success();}if(log.isInfoEnabled()){log.info(恳求编号[{}],开端获取使命,使命ID[{}],使命称号[{}],履行参数[{}],requestNo,taskServerParam.getTaskId(),taskServerParam.getTaskName(),JSON.toJSONString(taskServerParam));}TaskServerParamcloverTaskServerParam=EasyJobCoreUtil.transferCloverTaskServerParam(taskServerParam);Listtasks=this.selectTasks(cloverTaskServerParam,taskServerParam.getCurServer());if(log.isInfoEnabled()){log.info(恳求编号[{}],获取使命ID[{}],使命称号[{}]共{}条,requestNo,taskServerParam.getTaskId(),taskServerParam.getTaskName(),tasks==null?0:tasks.size());}if(CollectionUtils.isNotEmpty(tasks)){if(log.isInfoEnabled()){log.info(恳求编号[{}],开端履行使命,使命ID[{}],使命称号[{}],requestNo,taskServerParam.getTaskId(),taskServerParam.getTaskName());}this.easyJobExecuteTasksInner(taskServerParam,tasks,requestNo);if(log.isInfoEnabled()){log.info(恳求编号[{}],履行使命,使命ID[{}],使命称号[{}],履行数量[{}]完结....,requestNo,taskServerParam.getTaskId(),taskServerParam.getTaskName(),tasks.size());}}returnTaskResult.success();}catch(Exceptione){Profiler.functionError(callerinfo);if(log.isInfoEnabled()){log.error(恳求编号[{}],使命履行失利,使命ID[{}],使命称号[{}],requestNo,taskServerParam==null?:taskServerParam.getTaskId(),taskServerParam==null?:taskServerParam.getTaskName(),e);}returnTaskResult.fail(e.getMessage());}finally{try{MDC.clear();}catch(RuntimeExceptionex){log.error(easyjob履行反常,ex);}Profiler.registerInfoEnd(callerinfo);}}/***多分片提交子使命*paramscheduleContext调度使命上下文参数*paramtaskServerParam调度使命参数*paramrequestNo调度使命参数*returnvoid*/privatevoidsubmitSubTask(ScheduleContextscheduleContext,EasyJobTaskServerParamtaskServerParam,StringrequestNo)throwsIOException{log.info(恳求编号[{}],履行使命,使命ID[{}],使命称号[{}],子使命个数[{}],开端提交子使命,requestNo,taskServerParam.getTaskId(),taskServerParam.getTaskName(),taskServerParam.getServerCount());StringjobClass=scheduleContext.getTaskGetResponse().getJobClass();if(StringUtils.isBlank(jobClass)){thrownewRuntimeException(jobClassgeterror);}for(inti=0;ithis.easyJobLastThreadCount){this.easyJobExecutor.setMaximumPoolSize(threadCount);this.easyJobExecutor.setCorePoolSize(threadCount);this.easyJobLastThreadCount=threadCount;}elseif(threadCounto2.getOrder()){return1;}elseif(o1.getOrder()==o2.getOrder()){return0;}else{return-1;}}});}returnvalueEntries;}protectedListselectTasks(TaskServerParamtaskServerParam,intcurServer){returnthis.loadTasks(taskServerParam,curServer);}/***获取select时的使命创立开端时刻*paramserverArg*return*/protectedDategetCreateTimeFrom(StringserverArg){returnnull;}/***是否以批量办法处理使命*return*/protectedbooleanisDoBatchTasks(){returnfalse;}}实战成果上述所述均为透传ID场景的原理和示例代码,实战作用如下图:调用jsf超时,跨体系检查日志进行排查,得知为慢sql引起上述大部分场景现已抽出一个通用jar包,具体运用教程见我的另一篇文章:分布式日志追寻ID运用教程审阅修改黄宇。

springmvc的servlet的http场景这个场景信赖咱们都现已烂熟到骨子里了,核算首要思路是经过拦截器的办法进行logTraceId的透传,核算新建一个类完结HandlerInterceptorpreHandle:在事务处理器处理恳求之前被调用,这儿完结logTraceId的设置与透传postHandle:在事务处理器处理恳求履行完结后,生成视图之前履行,这儿空完结就好afterCompletion:在DispatcherServlet彻底处理完恳求后被调用,这儿用于铲除MDC的logTraceIdSlf4jpublicclassTraceInterceptorimplementsHandlerInterceptor{OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecto)throwsException{try{StringtraceId=MDC.get(LogConstants.MDC_LOG_TRACE_ID_KEY);if(StringUtils.isBlank(traceId)){MDC.put(LogConstants.MDC_LOG_TRACE_ID_KEY,TraceUtils.getTraceId());}}catch(RuntimeExceptione){log.error(mvc自定义log盯梢拦截器履行反常,e);}returntrue;}OverridepublicvoidpostHandle(javax.servlet.http.HttpServletRequesthttpServletRequest,javax.servlet.http.HttpServletResponsehttpServletResponse,Objecto,ModelAndViewmodelAndView)throwsException{}OverridepublicvoidafterCompletion(javax.servlet.http.HttpServletRequesthttpServletRequest,javax.servlet.http.HttpServletResponsehttpServletResponse,Objecto,Exceptione)throwsException{try{MDC.clear();}catch(RuntimeExceptionex){log.error(mvc自定义log盯梢拦截器履行反常,ex);}}}jsf场景信赖咱们关于jsf并不生疏,而jsf也支撑自定义filter,根据jsf过滤器的运转办法,能够经过装备大局过滤器(承继AbstractFilter)的办法进行logTraceId的透传,需求留意的是jsf是在线程池中履行的所以一定要信赖音讯体中的logTraceIdjsf顾客过滤器:首要从上下文环境中获取logTraceId并进行透传,完结代码如下Slf4jpublicclassTraceIdGlobalJsfFilterextendsAbstractFilter{OverridepublicResponseMessageinvoke(RequestMessagerequestMessage){//设置traceIdsetAndGetTraceId(requestMessage);try{returnthis.getNext().invoke(requestMessage);}finally{}}/***设置并回来traceId*paramrequestMessage*return*/privatevoidsetAndGetTraceId(RequestMessagerequestMessage){try{StringlogTraceId=MDC.get(LogConstants.MDC_LOG_TRACE_ID_KEY);ObjectlogTraceIdObj=requestMessage.getInvocationBody().getAttachment(LogConstants.JSF_LOG_TRACE_ID_KEY);if(StringUtils.isBlank(logTraceId)&&logTraceIdObj==null){//假如filter和MDC都没有获取到则阐明有遗失,打印日志if(log.isDebugEnabled()){log.debug(jsf顾客自定义log盯梢拦截器预警,filter和MDC都没有traceId,jsf信息:{},JSON.toJSONString(requestMessage));}}elseif(StringUtils.isBlank(logTraceId)&&logTraceIdObj!=null){//假如MDC没有,filter有,打印日志if(log.isDebugEnabled()){log.debug(jsf顾客自定义log盯梢拦截器预警,MDC没有filter有traceId,jsf信息:{},JSON.toJSONString(requestMessage));}}elseif(StringUtils.isNotBlank(logTraceId)&&logTraceIdObj==null){//假如MDC有,filter没有,阐明是源头现已有了,可是jsf是第一次调,透传requestMessage.getInvocationBody().addAttachment(LogConstants.JSF_LOG_TRACE_ID_KEY,logTraceId);}elseif(StringUtils.isNotBlank(logTraceId)&&logTraceIdObj!=null){//MDC和fitler都有,可是并不持平,则存在问题打印日志if(log.isDebugEnabled()){log.debug(jsf顾客自定义log盯梢拦截器预警,MDC和filter都有traceId,jsf信息:{},JSON.toJSONString(requestMessage));}}}catch(RuntimeExceptione){log.error(jsf顾客自定义log盯梢拦截器履行反常,e);}}}jsf提供者过滤器:经过拿到顾客在音讯体中透传的logTraceId来完结,完结代码如下Slf4jpublicclassTraceIdGlobalJsfProducerFilterextendsAbstractFilter{OverridepublicResponseMessageinvoke(RequestMessagerequestMessage){//设置traceIdbooleanisNeedClearMdc=transferTraceId(requestMessage);try{returnthis.getNext().invoke(requestMessage);}finally{if(isNeedClearMdc){clear();}}}/***设置并回来traceId*paramrequestMessage*return*/privatebooleantransferTraceId(RequestMessagerequestMessage){booleanisNeedClearMdc=false;try{StringlogTraceId=MDC.get(LogConstants.MDC_LOG_TRACE_ID_KEY);ObjectlogTraceIdObj=requestMessage.getInvocationBody().getAttachment(LogConstants.JSF_LOG_TRACE_ID_KEY);if(StringUtils.isBlank(logTraceId)&&logTraceIdObj==null){//假如filter和MDC都没有获取到,阐明存在遗失场景或是提供给外部体系调用的接口,打印日志进行调查StringtraceId=TraceUtils.getTraceId();MDC.put(LogConstants.MDC_LOG_TRACE_ID_KEY,traceId);requestMessage.getInvocationBody().addAttachment(LogConstants.JSF_LOG_TRACE_ID_KEY,traceId);if(log.isDebugEnabled()){log.debug(jsf生产者自定义log盯梢拦截器预警,filter和MDC都没有traceId,jsf信息:{},JSON.toJSONString(requestMessage));}isNeedClearMdc=true;}elseif(StringUtils.isBlank(logTraceId)&&logTraceIdObj!=null){//假如MDC没有,filter有,阐明是被调用方,需求透传下去MDC.put(LogConstants.MDC_LOG_TRACE_ID_KEY,logTraceIdObj.toString());isNeedClearMdc=true;}elseif(StringUtils.isNotBlank(logTraceId)&&logTraceIdObj==null){//假如MDC有,filter没有,存在问题,打印日志if(log.isDebugEnabled()){log.debug(jsf生产者自定义log盯梢拦截器预警,MDC有filter没有traceId,jsf信息:{},JSON.toJSONString(requestMessage));}isNeedClearMdc=true;}elseif(StringUtils.isNotBlank(logTraceId)&&logTraceIdObj!=null&&!logTraceId.equals(logTraceIdObj.toString())){//MDC和fitler都有,可是并不持平,则信赖filter透传成果TraceUtils.resetTraceId(logTraceIdObj.toString());if(log.isDebugEnabled()){log.debug(jsf生产者自定义log盯梢拦截器预警,MDC和fitler都有traceId,可是并不持平,jsf信息:{},JSON.toJSONString(requestMessage));}}returnisNeedClearMdc;}catch(RuntimeExceptione){log.error(jsf生产者自定义log盯梢拦截器履行反常,e);returnfalse;}}/***铲除MDC*/privatevoidclear(){try{MDC.clear();}catch(RuntimeExceptione){log.error(jsf生产者自定义log盯梢拦截器履行反常,e);}}}MQ场景提到MQ信赖咱们关于此就更不生疏了,此种场景首要经过在提供者发送音讯时拿到上下文中的logTraceId,将其以扩展信息的办法设置进音讯体中进行透传,而顾客则从音讯体中进行获取生产者:新建一个笼统类承继MessageProducer,覆写父类中的两个send办法(批量发送、单条发送),send办法中首要调用笼统加工音讯体的办法(logTraceId特点赋值)和日志打印,在子类中进行发送前对音讯体的加工处理,具体代码如下Slf4jpublicabstractclassBaseTraceIdProducerextendsMessageProducer{privatestaticfinalStringSEPARATOR_COMMA=,;publicBaseTraceIdProducer(){}publicBaseTraceIdProducer(TransportManagertransportManager){super(transportManager);}/***获取音讯体-单个*parammessageContext*return*/protectedabstractMessagegetMessage(MessageContextmessageContext);/**获取音讯体-批量**parammessageContext*return*/protectedabstractListgetMessages(MessageContextmessageContext);/***填充音讯体上下文信息*parammessage*parammessageContext*/protectedvoidfillContext(Messagemessage,MessageContextmessageContext){if(message==null){return;}if(StringUtils.isBlank(messageContext.getLogTraceId())){StringlogTraceId=message.getAttribute(LogConstants.JMQ2_LOG_TRACE_ID_KEY);messageContext.setLogTraceId(logTraceId);}if(StringUtils.isBlank(messageContext.getTopic())){Stringtopic=message.getTopic();messageContext.setTopic(topic);}StringbusinessId=message.getBusinessId();messageContext.getBusinessIdBuf().append(SEPARATOR_COMMA).append(businessId);}/***traceId嵌入音讯体中*parammessage*/protectedvoidgenerateTraceIdIntoMessage(Messagemessage){if(message==null){return;}try{StringlogTraceId=MDC.get(LogConstants.MDC_LOG_TRACE_ID_KEY);if(StringUtils.isBlank(logTraceId)){logTraceId=TraceUtils.getTraceId();MDC.put(LogConstants.MDC_LOG_TRACE_ID_KEY,logTraceId);}message.setAttribute(LogConstants.JMQ2_LOG_TRACE_ID_KEY,logTraceId);}catch(RuntimeExceptione){log.error(jmq2自定义log盯梢拦截器履行反常,e);}}/***批量发送音讯-无回调*parammessages*paramtimeout*throwsJMQException*/publicvoidsend(Listmessages,inttimeout)throwsJMQException{MessageContextmessageContext=newMessageContext();messageContext.setMessages(messages);ListmessageList=this.getMessages(messageContext);//打印日志,便利排查问题printLog(messageContext);super.send(messageList,timeout);}/***单个发送音讯*parammessage*paramtransaction*param*return*throwsJMQException*/publicTsend(Messagemessage,LocalTransactiontransaction)throwsJMQException{MessageContextmessageContext=newMessageContext();messageContext.setMessage(message);Messagemsg=this.getMessage(messageContext);//打印日志,便利排查问题printLog(messageContext);returnsuper.send(msg,transaction);}/***批量发送音讯-有回调*parammessages*paramtimeout*paramcallback*throwsJMQException*/publicvoidsend(Listmessages,inttimeout,AsyncSendCallbackcallback)throwsJMQException{MessageContextmessageContext=newMessageContext();messageContext.setMessages(messages);ListmessageList=this.getMessages(messageContext);//打印日志,便利排查问题printLog(messageContext);super.send(messageList,timeout,callback);}/***打印日志,便利排查问题*parammessageContext*/privatevoidprintLog(MessageContextmessageContext){if(messageContext==null){return;}if(log.isInfoEnabled()){log.info(MQ发送:traceId:{},topic:{},businessIds:[{}],messageContext.getLogTraceId(),messageContext.getTopic(),messageContext.getBusinessIdBuf()==null?:messageContext.getBusinessIdBuf().toString());}}}Slf4jpublicclassTraceIdEnvMessageProducerextendsBaseTraceIdProducer{privatestaticfinalStringUAT_TRUE=String.valueOf(true);privatebooleanuat=false;publicTraceIdEnvMessageProducer(){}publicTraceIdEnvMessageProducer(TransportManagertransportManager){super(transportManager);}/***环境变量打标-单个音讯体*parammessage*/privatevoidconvertUatMessage(Messagemessage){if(message!=null){message.setAttribute(SplitMessage.JMQ_SPLIT_KEY_IS_UAT,UAT_TRUE);}}/***音讯转化-批量音讯体*parammessageContext*return*/privateListconvertMessages(MessageContextmessageContext){Listmessages=messageContext.getMessages();if(!CollectionUtils.isEmpty(messages)){IteratormessageIterator=messages.iterator();while(messageIterator.hasNext()){Messagemessage=(Message)messageIterator.next();if(this.isUat()){this.convertUatMessage(message);}super.generateTraceIdIntoMessage(message);super.fillContext(message,messageContext);}}returnmessageContext.getMessages();}/***音讯转化-单个音讯体*parammessageContext*return*/privateMessageconvertMessage(MessageContextmessageContext){Messagemessage=messageContext.getMessage();if(this.isUat()){this.convertUatMessage(message);}super.generateTraceIdIntoMessage(message);super.fillContext(message,messageContext);returnmessage;}protectedMessagegetMessage(MessageContextmessageContext){if(log.isDebugEnabled()){log.debug(currentenvironmentisUAT:{},this.isUat());}returnthis.convertMessage(messageContext);}protectedListgetMessages(MessageContextmessageContext){if(log.isDebugEnabled()){log.debug(currentenvironmentisUAT:{},this.isUat());}returnthis.convertMessages(messageContext);}publicvoidsetUat(booleanuat){this.uat=uat;}booleanisUat(){returnthis.uat;}}顾客:新建一个笼统类承继MessageListener,覆写父类中的onMessage办法,首要进行设置日志traceId和消费完结后的traceId整理等,而在子类中进行一些自定义处理,具体代码如下Slf4jpublicabstractclassBaseTraceIdMessageListenerimplementsMessageListener{publicBaseTraceIdMessageListener(){}publicabstractvoidonMessageList(Listmessages)throwsException;OverridepublicfinalvoidonMessage(Listmessages)throwsException{try{if(CollectionUtils.isEmpty(messages)){return;}//设置日志traceIdsetLogTraceId(messages);this.onMessageList(messages);//消费完后铲除traceIdclear();}catch(Exceptione){throwe;}finally{MDC.clear();}}/***设置日志traceId*parammessages*/privatevoidsetLogTraceId(Listmessages){try{Messagemessage=messages.get(0);StringlogTraceId=message.getAttribute(LogConstants.JMQ2_LOG_TRACE_ID_KEY);if(StringUtils.isBlank(logTraceId)){logTraceId=TraceUtils.getTraceId();}MDC.put(LogConstants.MDC_LOG_TRACE_ID_KEY,logTraceId);}catch(RuntimeExceptione){log.error(jmq2自定义log盯梢拦截器履行反常,e);}}/***铲除traceId*/privatevoidclear(){try{MDC.clear();}catch(RuntimeExceptione){log.error(jmq2自定义log盯梢拦截器履行反常,e);}}}Slf4jpublicabstractclassTraceIdEnvMessageListenerextendsBaseTraceIdMessageListener{privateStringuat;publicTraceIdEnvMessageListener(){}publicabstractvoidonMessages(Listvar1)throwsException;OverridepublicvoidonMessageList(Listmessages)throwsException{Iteratoriterator;Messagemessage;if(this.getUat()!=null&&Boolean.valueOf(this.getUat())){iterator=messages.iterator();while(true){while(iterator.hasNext()){message=(Message)iterator.next();if(message!=null&&Boolean.valueOf(message.getAttribute(SplitMessage.JMQ_SPLIT_KEY_IS_UAT))){this.onMessages(Arrays.asList(message));}else{log.debug(Ignoremessage:[BusinessId:{},Text:{}],message.getBusinessId(),message.getText());}}return;}}elseif(this.getUat()!=null&&!Boolean.valueOf(this.getUat())){iterator=messages.iterator();while(true){while(iterator.hasNext()){message=(Message)iterator.next();if(message!=null&&!Boolean.valueOf(message.getAttribute(SplitMessage.JMQ_SPLIT_KEY_IS_UAT))){this.onMessages(Arrays.asList(message));}else{log.debug(Ignoremessage:[BusinessId:{},Text:{}],message.getBusinessId(),message.getText());}}return;}}else{this.onMessages(messages);}}publicvoidsetUat(Stringuat){if(!true.equals(uat)&&!false.equals(uat)){thrownewIllegalArgumentException(uat特点值只能为true或false.);}else{this.uat=uat;}}publicStringgetUat(){returnthis.uat;}}resteasy场景此场景类似于spinrg-mvc场景,也是http恳求,需求经过拦截器在音讯头中进行logTraceId的透传,首要有客户端拦截器,服务端:预处理拦截器、后置拦截器,代码如下ClientInterceptorProviderSlf4jpublicclassResteasyClientInterceptorimplementsClientExecutionInterceptor{OverridepublicClientResponseexecute(ClientExecutionContextclientExecutionContext)throwsException{try{StringlogTraceId=MDC.get(LogConstants.MDC_LOG_TRACE_ID_KEY);ClientRequestrequest=clientExecutionContext.getRequest();StringheaderTraceId=request.getHeaders().getFirst(LogConstants.HEADER_LOG_TRACE_ID_KEY);if(StringUtils.isBlank(logTraceId)&&StringUtils.isBlank(headerTraceId)){//假如filter和MDC都没有获取到则阐明是调用源头StringtraceId=TraceUtils.getTraceId();TraceUtils.resetTraceId(traceId);request.header(LogConstants.HEADER_LOG_TRACE_ID_KEY,traceId);}elseif(StringUtils.isBlank(headerTraceId)){//假如MDC有可是filter没有则需求传递request.header(LogConstants.HEADER_LOG_TRACE_ID_KEY,logTraceId);}}catch(RuntimeExceptione){log.error(resteasy客户端log盯梢拦截器履行反常,e);}returnclientExecutionContext.proceed();}}Slf4jProviderServerInterceptorpublicclassRestEasyPreInterceptorimplementsPreProcessInterceptor{OverridepublicServerResponsepreProcess(HttpRequestrequest,ResourceMethodresourceMethod)throwsFailure,WebApplicationException{try{MultivaluedMaprequestHeaders=request.getHttpHeaders().getRequestHeaders();StringheaderTraceId=requestHeaders.getFirst(LogConstants.HEADER_LOG_TRACE_ID_KEY);if(StringUtils.isNotBlank(headerTraceId)){//假如filter则透传TraceUtils.resetTraceId(headerTraceId);}}catch(RuntimeExceptione){log.error(resteasy服务端log盯梢前置拦截器履行反常,e);}returnnull;}}Slf4jProviderServerInterceptorpublicclassResteasyPostInterceptorimplementsPostProcessInterceptor{OverridepublicvoidpostProcess(ServerResponseserverResponse){try{MDC.clear();}catch(RuntimeExceptione){log.error(resteasy服务端log盯梢后置拦截器履行反常,e);}}}clover场景clover的大体机制首要是在项目发动的时分扫描到带有注解HessianWebService的类进行服务注册并保持心跳检测,而clover端则经过servlet恳求办法进行使命的回调,一同承继AbstractScheduleTaskProcess办法的使命是以线程池的办法进行事务的处理根据上述原理咱们需求处理两个问题:1.新建一个类承继ServiceExporterServlet,并在web.xml装备中进行servlet装备,代码如下从示波器截图中能够看出,学术虽然共用栅极电阻不会对电流均衡产生影响,但它的确大大改进了开关波形的匹配。

作者:东丽区
------分隔线----------------------------
头条新闻
图片新闻
新闻排行榜