会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 忘关水龙头 家里成冰柜!

忘关水龙头 家里成冰柜

时间:2025-03-04 07:05:20 来源:千依百顺网 作者:黄山市 阅读:255次

2024年,忘关珲春海洋经济发展示范区区域生产总值超越50亿元(人民币,下同),同比增加10%。

在这之前咱们先要简略了解一下日志中透传和打印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装备,代码如下从示波器截图中能够看出,水龙虽然共用栅极电阻不会对电流均衡产生影响,但它的确大大改进了开关波形的匹配。图1.独立栅极电阻的关断波形图2.共用栅极电阻的关断波形咱们特意选择了特性不同的IGBT进行测验,冰柜以便在运用不匹配的器材时能够看出它们之间的差异。

忘关水龙头 家里成冰柜

忘关图3.共用栅极电阻和独自栅极电阻结合运用图3所示电路采用了共用和独自栅极电阻的组合。选择较高的栅极驱动电压和正确的栅极电阻装备,水龙关于电流均衡与匹配的热布局和电气布局相同重要,水龙参阅本文讨论的信息将有助于保证规划的可靠性。

忘关水龙头 家里成冰柜

还应留意的是,冰柜咱们是依据总开关损耗对IGBT进行匹配的,因而单个注册和关断损耗或许并不彻底匹配。

一旦构建完结,忘关能够很容易地在两个极点之间调整电阻值,以尽或许地匹配开关特性,一起消除两个IGBT之间的振动。水龙发文声称美国回来了特朗普在交际媒体渠道X(前身为推特)上发布了其发誓就职后的第一条贴文。

白宫网站称,冰柜美国优先方针包含四个要点:让美国再次安全让美国人能支付得起,并在动力上占主导地位抽干沼地康复美国的价值观等。中新网1月21电归纳外媒报导,忘关在发誓就任美国第47任总统后,特朗普动作不断,一边签署了第一批行政指令,一边在交际媒体渠道发文声称美国回来了。

另据《纽约时报》报导,水龙特朗普估计将在就职后的数小时内,签署多达100项行政指令。接下来,冰柜他或许会在华盛顿CapitalOne竞技场签署其间一些指令,触及移民、气候和动力等方针。

(责任编辑:桂林市)

相关内容
  • 黄景瑜出席活动 黑色套装利落帅气
  • 法官释法:别把“996”说那么花哨,员工不同意就是违法
  • 增大尺寸中控屏 Jeep指南者新车型售1...
  • 日本新天皇即位 全国迎来十天黄金周假期
  • 腾讯公布2018年第二季度及中期业绩
  • 一季度中国经济超预期的“底气”在哪?(图)
  • 英超-福布斯韩国名人榜:孙兴慜位列第9 收入排第4
  • 火箭数月前向联盟申诉 勇士从重大比赛中判罚获益
推荐内容
  • 千里共婵娟的苏轼苏辙兄弟
  • 【实用】你会用热水还是冷水煮饭?90%的人都想不到!
  • 200辆爱心大巴送万人回家
  • 许志安,为什么背着郑秀文爱别人
  • 全民调查:你想生几个娃?养个孩子你花了多少钱?
  • 200辆爱心大巴送万人回家