盘点上市公司董事长的另类故事:失联刑拘被夺权
1月15日上午,盘点由宁德市委文明办主办的宁德市欢喜美好迎新春宏扬文明好家风文明家庭主题宣扬活动在仕林东湖小区的小广场上举办,盘点来自书法家协会的陈裕植正在为居民书写春联、送福字。
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之间的振动。
假如运用一个共用栅极电阻,公司故事在不引起振动的情况下,电流波形将愈加匹配,由于两个栅极一起处于相同的电位。
为每个IGBT供给一个栅极电阻可下降并联器材之间产生振动的或许性,董事但一起也会添加器材的注册和关断时刻及特性曲线的差异性。刑拘来历:54攻城狮大电流SiIGBT和小电流SiCMOSFET两者并联构成的混合器材完成了功率器材功能和本钱的折衷。
当Si/SiC混合器材的负载电流较大时,被夺负载电流由SiCMOSFET与IGBT并联导通一起承当,Si/SiC混合器材内部负载电流分配关系由二者的导通电阻决议。SiCMOSFET器材参加更多的注册和更少的关断,盘点使得全体开关损耗较只要SiIGBT器材更优。
可是由于SiCMOSFET参加部分关断,上市失联比较独自的SiIGBT全体提升了关断速度,减小了关断损耗。SiCMOSFET由于开关速度快,公司故事且在注册进程没有漂移区电导调制,会先于SiIGBT的注册使得混合器材的注册速度挨近SiCMOSFET,取得更小的注册损耗