Help
RSS
API
Feed
Maltego
Contact
Domain > 51iwowo.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2016-08-08
151.101.44.133
(
ClassC
)
2022-05-23
14.204.139.249
(
ClassC
)
2023-09-25
125.39.165.235
(
ClassC
)
2025-12-10
60.13.97.57
(
ClassC
)
Port 443
HTTP/1.1 200 OKLast-Modified: Sat, 05 Aug 2023 03:10:40 GMTEtag: 75b33375a37899635a797e1b4efd9e10Content-Type: text/htmlDate: Thu, 03 Jul 2025 13:16:46 GMTServer: tencent-cosx-cos-hash-crc64ecma: 11321041663722184286x-cos-request-id: Njg2NjgyYmRfODhkNjY3MDlfNTJlYV85YzkxYTQ3Content-Length: 68936Accept-Ranges: bytesX-NWS-LOG-UUID: 12484711297439949103Connection: keep-aliveX-Cache-Lookup: Cache Hit !DOCTYPE html>html langzh-CN>head>meta charsetUTF-8>meta nameviewport contentwidthdevice-width,initial-scale1,maximum-scale2>meta nametheme-color content#222>meta namegenerator contentHexo 5.3.0>link relapple-touch-icon sizes180x180 href/images/touxiang.jpeg>link relicon typeimage/png sizes32x32 href/images/touxiang_32x32.jpg>link relicon typeimage/png sizes16x16 href/images/touxiang_16x16.jpg>link relmask-icon href/images/touxiang.jpeg color#222>meta namegoogle-site-verification contentww7xFZKZ7SC4ZWz2DV_b4_-vVE8v5MQs6jdCR34hRJQ>meta namebaidu-site-verification contentS8FJ6bE0Nl>link relstylesheet href/css/main.css>link relstylesheet href/lib/font-awesome/css/font-awesome.min.css>script idhexo-configurations>var NexTwindow.NexT||{},CONFIG{hostname:www.51iwowo.com,root:/,scheme:Pisces,version:7.8.0,exturl:!1,sidebar:{position:left,display:always,padding:18,offset:12,onmobile:!1},copycode:{enable:!0,show_result:!0,style:null},back2top:{enable:!0,sidebar:!0,scrollpercent:!1},bookmark:{enable:!1,color:#222,save:auto},fancybox:!1,mediumzoom:!1,lazyload:!1,pangu:!1,comments:{style:tabs,active:gitalk,storage:!0,lazyload:!1,nav:null,activeClass:gitalk},algolia:{hits:{per_page:10},labels:{input_placeholder:Search for Posts,hits_empty:We didnt find any results for the search: ${query},hits_stats:${hits} results found in ${time} ms}},localsearch:{enable:!0,trigger:auto,top_n_per_article:1,unescape:!1,preload:!1},motion:{enable:!0,async:!1,transition:{post_block:fadeIn,post_header:slideDownIn,post_body:slideDownIn,coll_header:slideLeftIn,sidebar:slideUpIn}},path:search.xml}/script>meta namedescription content技术从点滴开始>meta propertyog:type contentwebsite>meta propertyog:title content技术沉淀-不积跬步,无以至千里>meta propertyog:url contenthttp://www.51iwowo.com/index.html>meta propertyog:site_name content技术沉淀-不积跬步,无以至千里>meta propertyog:description content技术从点滴开始>meta propertyog:locale contentzh_CN>meta propertyarticle:author content艺超(yi_chao_jiang)>meta nametwitter:card contentsummary>link relcanonical hrefhttp://www.51iwowo.com/>script idpage-configurations>CONFIG.page{sidebar:,isHome:!0,isPost:!1,lang:zh-CN}/script>title>技术沉淀-不积跬步,无以至千里/title>script>var _hmt_hmt||;!function(){var edocument.createElement(script);e.srchttps://hm.baidu.com/hm.js?9ddf90a46be4cd7969a3471ee654a99a;var tdocument.getElementsByTagName(script)0;t.parentNode.insertBefore(e,t)}()/script>noscript>style>.sidebar-inner,.use-motion .brand,.use-motion .collection-header,.use-motion .comments,.use-motion .menu-item,.use-motion .pagination,.use-motion .post-block,.use-motion .post-body,.use-motion .post-header{opacity:initial}.use-motion .site-subtitle,.use-motion .site-title{opacity:initial;top:initial}.use-motion .logo-line-before i{left:initial}.use-motion .logo-line-after i{right:initial}/style>/noscript>/head>body itemscope itemtypehttp://schema.org/WebPage>div classcontainer use-motion>div classheadband>/div>header classheader itemscope itemtypehttp://schema.org/WPHeader>div classheader-inner>div classsite-brand-container>div classsite-nav-toggle>div classtoggle aria-label切换导航栏>span classtoggle-line toggle-line-first>/span> span classtoggle-line toggle-line-middle>/span> span classtoggle-line toggle-line-last>/span>/div>/div>div classsite-meta>a href/ classbrand relstart>span classlogo-line-before>i>/i>/span>h1 classsite-title>技术沉淀-不积跬步,无以至千里/h1>span classlogo-line-after>i>/i>/span>/a>p classsite-subtitle itempropdescription>但行好事,莫问前程/p>/div>div classsite-nav-right>div classtoggle popup-trigger>i classfa fa-search fa-fw fa-lg>/i>/div>/div>/div>nav classsite-nav>ul idmenu classmenu>li classmenu-item menu-item-home>a href/ relsection>i classfa fa-fw fa-home>/i>首页/a>/li>li classmenu-item menu-item-tags>a href/tags/ relsection>i classfa fa-fw fa-tags>/i>标签span classbadge>32/span>/a>/li>li classmenu-item menu-item-categories>a href/categories/ relsection>i classfa fa-fw fa-th>/i>分类span classbadge>26/span>/a>/li>li classmenu-item menu-item-search>a rolebutton classpopup-trigger>i classfa fa-search fa-fw>/i>搜索/a>/li>/ul>/nav>div classsearch-pop-overlay>div classpopup search-popup>div classsearch-header>span classsearch-icon>i classfa fa-search>/i>/span>div classsearch-input-container>input autocompleteoff autocapitalizeoff placeholder搜索... spellcheckfalse typesearch classsearch-input>/div>span classpopup-btn-close>i classfa fa-times-circle>/i>/span>/div>div idsearch-result>div idno-result>i classfa fa-spinner fa-pulse fa-5x fa-fw>/i>/div>/div>/div>/div>/div>/header>a hrefhttps://github.com/wowojyc classgithub-corner titleFollow me on GitHub aria-labelFollow me on GitHub relnoopener target_blank>svg width80 height80 viewBox0 0 250 250 aria-hiddentrue>path dM0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z>/path>path dM128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2 fillcurrentColor styletransform-origin:130px 106px classocto-arm>/path>path dM115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z fillcurrentColor classocto-body>/path>/svg>/a>main classmain>div classmain-inner>div classcontent-wrap>div classcontent index posts-expand>article itemscope itemtypehttp://schema.org/Article classpost-block langzh-CN>link itempropmainEntityOfPage hrefhttp://www.51iwowo.com/springboot/%E4%B8%80%E7%A7%8DSpringBoot%E4%B8%8BScheduler%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E4%BC%98%E9%9B%85%E9%80%80%E5%87%BA%E6%96%B9%E6%A1%88/>span hidden itempropauthor itemscope itemtypehttp://schema.org/Person>meta itempropimage content/images/touxiang.jpeg>meta itempropname content艺超(yi_chao_jiang)>meta itempropdescription content技术从点滴开始>/span>span hidden itemproppublisher itemscope itemtypehttp://schema.org/Organization>meta itempropname content技术沉淀-不积跬步,无以至千里>/span>header classpost-header>h2 classpost-title itempropname headline>a href/springboot/%E4%B8%80%E7%A7%8DSpringBoot%E4%B8%8BScheduler%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E4%BC%98%E9%9B%85%E9%80%80%E5%87%BA%E6%96%B9%E6%A1%88/ classpost-title-link itempropurl>一种SpringBoot下Scheduler定时任务优雅退出方案/a>/h2>div classpost-meta>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-calendar-o>/i> /span>span classpost-meta-item-text>发表于/span> time title创建时间:2023-08-05 11:08:00 itempropdateCreated datePublished datetime2023-08-05T11:08:00+08:00>2023-08-05/time> /span>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-folder-o>/i> /span>span classpost-meta-item-text>分类于/span> span itempropabout itemscope itemtypehttp://schema.org/Thing>a href/categories/java/ itempropurl relindex>span itempropname>java/span>/a> /span>, span itempropabout itemscope itemtypehttp://schema.org/Thing>a href/categories/java/SpringBoot/ itempropurl relindex>span itempropname>SpringBoot/span>/a>/span>/span>br>span classpost-meta-item title本文字数>span classpost-meta-item-icon>i classfa fa-file-word-o>/i> /span>span classpost-meta-item-text>本文字数:/span> span>6.8k/span> /span>span classpost-meta-item title阅读时长>span classpost-meta-item-icon>i classfa fa-clock-o>/i> /span>span classpost-meta-item-text>阅读时长 ≈/span> span>6 分钟/span>/span>/div>/header>div classpost-body itemproparticleBody>h1 id背景>a href#背景 classheaderlink title背景>/a>背景/h1>p>近期业务中有一个定时任务发现每次服务部署时,偶发性的会触发问题,这里记录一下问题的跟进解决。/p>h1 id分析现象>a href#分析现象 classheaderlink title分析现象>/a>分析现象/h1>p>该定时任务每2分钟执行一次,完成数据的更新处理。同时服务部署了多个服务器节点,为保证每次只有一个服务器节点上的任务在跑,引入了基于Redis缓存的分布式锁。/p>div classpost-button>a classbtn href/springboot/%E4%B8%80%E7%A7%8DSpringBoot%E4%B8%8BScheduler%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E4%BC%98%E9%9B%85%E9%80%80%E5%87%BA%E6%96%B9%E6%A1%88/#more relcontents>阅读全文 »/a>/div>/div>div>/div>footer classpost-footer>div classpost-eof>/div>/footer>/article>article itemscope itemtypehttp://schema.org/Article classpost-block langzh-CN>link itempropmainEntityOfPage hrefhttp://www.51iwowo.com/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/%E8%AE%B0%E4%B8%80%E6%AC%A1Apache%20HTTP%20Client%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5/>span hidden itempropauthor itemscope itemtypehttp://schema.org/Person>meta itempropimage content/images/touxiang.jpeg>meta itempropname content艺超(yi_chao_jiang)>meta itempropdescription content技术从点滴开始>/span>span hidden itemproppublisher itemscope itemtypehttp://schema.org/Organization>meta itempropname content技术沉淀-不积跬步,无以至千里>/span>header classpost-header>h2 classpost-title itempropname headline>a href/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/%E8%AE%B0%E4%B8%80%E6%AC%A1Apache%20HTTP%20Client%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5/ classpost-title-link itempropurl>记一次Apache HTTP Client问题排查/a>/h2>div classpost-meta>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-calendar-o>/i> /span>span classpost-meta-item-text>发表于/span> time title创建时间:2023-08-05 08:35:00 itempropdateCreated datePublished datetime2023-08-05T08:35:00+08:00>2023-08-05/time> /span>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-folder-o>/i> /span>span classpost-meta-item-text>分类于/span> span itempropabout itemscope itemtypehttp://schema.org/Thing>a href/categories/java/ itempropurl relindex>span itempropname>java/span>/a>/span>/span>br>span classpost-meta-item title本文字数>span classpost-meta-item-icon>i classfa fa-file-word-o>/i> /span>span classpost-meta-item-text>本文字数:/span> span>6.7k/span> /span>span classpost-meta-item title阅读时长>span classpost-meta-item-icon>i classfa fa-clock-o>/i> /span>span classpost-meta-item-text>阅读时长 ≈/span> span>6 分钟/span>/span>/div>/header>div classpost-body itemproparticleBody>p>a nameik2yR>/a>/p>h1 id现象>a href#现象 classheaderlink title现象>/a>现象/h1>p>通过日志查看,存在两种异常情况。br>第一种:开始的时候HTTP请求会报超时异常。/p>blockquote>p>762663363 2023-07-21 06:04:25 executor-64 ERROR - com.xxl.CucmTool - CucmTool|sendRisPortSoap error,url:a target_blank relnoopener hrefhttps://10.65.0.173:8443/realtimeservice/services/RisPort>https://xxxxxx/realtimeservice/services/RisPort/a>br>org.apache.http.conn.HttpHostConnectException: Connect to xxx /xxx failed: 连接超时/p>/blockquote>p>第二种:突然没有新的HTTP请求日志了,现象就是HTTP请求后,一直卡主,等待响应。 a nameVvOQT>/a>/p>h1 idHTTP-Client代码>a href#HTTP-Client代码 classheaderlink titleHTTP Client代码>/a>HTTP Client代码/h1>p>先查看一下HTTP的请求代码br>HTTP Client设置/p>figure classhighlight java>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>span classline>10/span>br>span classline>11/span>br>span classline>12/span>br>span classline>13/span>br>span classline>14/span>br>span classline>15/span>br>span classline>16/span>br>span classline>17/span>br>span classline>18/span>br>/pre>/td>td classcode>pre>span classline>span classfunction>span classkeyword>private/span> span classkeyword>static/span> CloseableHttpClient span classtitle>getHttpClient/span>span classparams>()/span> /span>{/span>br>span classline> SSLContextBuilder builder span classkeyword>new/span> SSLContextBuilder();/span>br>span classline> CloseableHttpClient httpClient span classkeyword>null/span>;/span>br>span classline> span classkeyword>try/span> {/span>br>span classline> builder.loadTrustMaterial(span classkeyword>null/span>, span classkeyword>new/span> TrustStrategy() {/span>br>span classline> span classmeta>@Override/span>/span>br>span classline> span classfunction>span classkeyword>public/span> span classkeyword>boolean/span> span classtitle>isTrusted/span>span classparams>(X509Certificate chain, String authType)/span> span classkeyword>throws/span> CertificateException /span>{/span>br>span classline> span classkeyword>return/span> span classkeyword>true/span>;/span>br>span classline> }/span>br>span classline> });/span>br>span classline> SSLConnectionSocketFactory sslsf span classkeyword>new/span> SSLConnectionSocketFactory(builder.build(),/span>br>span classline> SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);/span>br>span classline> httpClient HttpClients.custom().setSSLSocketFactory(sslsf).build();/span>br>span classline> } span classkeyword>catch/span> (Exception e) {/span>br>span classline> log.error(span classstring>"getHttpClient error:{}"/span>, e.getMessage(), e);/span>br>span classline> }/span>br>span classline> span classkeyword>return/span> httpClient;/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>div classpost-button>a classbtn href/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/%E8%AE%B0%E4%B8%80%E6%AC%A1Apache%20HTTP%20Client%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5/#more relcontents>阅读全文 »/a>/div>/div>div>/div>footer classpost-footer>div classpost-eof>/div>/footer>/article>article itemscope itemtypehttp://schema.org/Article classpost-block langzh-CN>link itempropmainEntityOfPage hrefhttp://www.51iwowo.com/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/%E5%A4%A7%E6%84%8F%E4%BA%86%EF%BC%8C%E8%AF%AF%E7%94%A8%E4%BA%86MyBatis%E7%9A%84$%E7%AC%A6%E5%8F%B7/>span hidden itempropauthor itemscope itemtypehttp://schema.org/Person>meta itempropimage content/images/touxiang.jpeg>meta itempropname content艺超(yi_chao_jiang)>meta itempropdescription content技术从点滴开始>/span>span hidden itemproppublisher itemscope itemtypehttp://schema.org/Organization>meta itempropname content技术沉淀-不积跬步,无以至千里>/span>header classpost-header>h2 classpost-title itempropname headline>a href/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/%E5%A4%A7%E6%84%8F%E4%BA%86%EF%BC%8C%E8%AF%AF%E7%94%A8%E4%BA%86MyBatis%E7%9A%84$%E7%AC%A6%E5%8F%B7/ classpost-title-link itempropurl>大意了,误用了MyBatis的$符号/a>/h2>div classpost-meta>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-calendar-o>/i> /span>span classpost-meta-item-text>发表于/span> time title创建时间:2023-08-04 11:35:00 itempropdateCreated datePublished datetime2023-08-04T11:35:00+08:00>2023-08-04/time> /span>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-folder-o>/i> /span>span classpost-meta-item-text>分类于/span> span itempropabout itemscope itemtypehttp://schema.org/Thing>a href/categories/MyBatis/ itempropurl relindex>span itempropname>MyBatis/span>/a>/span>/span>br>span classpost-meta-item title本文字数>span classpost-meta-item-icon>i classfa fa-file-word-o>/i> /span>span classpost-meta-item-text>本文字数:/span> span>2.3k/span> /span>span classpost-meta-item title阅读时长>span classpost-meta-item-icon>i classfa fa-clock-o>/i> /span>span classpost-meta-item-text>阅读时长 ≈/span> span>2 分钟/span>/span>/div>/header>div classpost-body itemproparticleBody>h1 id复盘>a href#复盘 classheaderlink title复盘>/a>复盘/h1>p>近期有一个小业务需求,非常简单,本质就是增加几个过滤参数,可以透传给数据库就可以了。/p>p>代码使用MyBatis作为ORM框架/p>p>原始SQL如下/p>figure classhighlight plain>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>/pre>/td>td classcode>pre>span classline><select id="listDevices" resultType="DeviceDO">/span>br>span classline> select device_uuid as deviceUUID, client_type as clientType/span>br>span classline> from tb_device/span>br>span classline> order by gmt_modified desc/span>br>span classline></select>/span>br>/pre>/td>/tr>/table>/figure>p>上面没有过滤条件,本次改造是增加client_type的过滤,由于可能存在多个client_type,故需要使用MyBatis的foreach用法构造in条件。当时偷了个懒,直接从现有代码库里面copy了一份做了改动。/p>div classpost-button>a classbtn href/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/%E5%A4%A7%E6%84%8F%E4%BA%86%EF%BC%8C%E8%AF%AF%E7%94%A8%E4%BA%86MyBatis%E7%9A%84$%E7%AC%A6%E5%8F%B7/#more relcontents>阅读全文 »/a>/div>/div>div>/div>footer classpost-footer>div classpost-eof>/div>/footer>/article>article itemscope itemtypehttp://schema.org/Article classpost-block langzh-CN>link itempropmainEntityOfPage hrefhttp://www.51iwowo.com/java/%E6%B2%A1%E6%9C%89@RequestBody%E6%80%8E%E4%B9%88%E5%8A%9E%EF%BC%9F/>span hidden itempropauthor itemscope itemtypehttp://schema.org/Person>meta itempropimage content/images/touxiang.jpeg>meta itempropname content艺超(yi_chao_jiang)>meta itempropdescription content技术从点滴开始>/span>span hidden itemproppublisher itemscope itemtypehttp://schema.org/Organization>meta itempropname content技术沉淀-不积跬步,无以至千里>/span>header classpost-header>h2 classpost-title itempropname headline>a href/java/%E6%B2%A1%E6%9C%89@RequestBody%E6%80%8E%E4%B9%88%E5%8A%9E%EF%BC%9F/ classpost-title-link itempropurl>没有@RequestBody怎么办?试一下HttpServletRequest吧/a>/h2>div classpost-meta>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-calendar-o>/i> /span>span classpost-meta-item-text>发表于/span> time title创建时间:2023-03-25 21:35:00 itempropdateCreated datePublished datetime2023-03-25T21:35:00+08:00>2023-03-25/time> /span>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-folder-o>/i> /span>span classpost-meta-item-text>分类于/span> span itempropabout itemscope itemtypehttp://schema.org/Thing>a href/categories/java/ itempropurl relindex>span itempropname>java/span>/a>/span>/span>br>span classpost-meta-item title本文字数>span classpost-meta-item-icon>i classfa fa-file-word-o>/i> /span>span classpost-meta-item-text>本文字数:/span> span>1.9k/span> /span>span classpost-meta-item title阅读时长>span classpost-meta-item-icon>i classfa fa-clock-o>/i> /span>span classpost-meta-item-text>阅读时长 ≈/span> span>2 分钟/span>/span>/div>/header>div classpost-body itemproparticleBody>h1 id背景>a href#背景 classheaderlink title背景>/a>背景/h1>p>最近在对接第三方开放平台,需要按照标准提供一个事件推送接口,接口实现demo声明如下:/p>figure classhighlight java>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>/pre>/td>td classcode>pre>span classline>span classfunction>span classkeyword>public/span> Map<String, String> span classtitle>callBack/span>span classparams>(/span>/span>/span>br>span classline>span classfunction>span classparams>span classmeta>@RequestParam(value "msg_signature", required false)/span> String msg_signature,/span>/span>/span>br>span classline>span classfunction>span classparams>span classmeta>@RequestParam(value "timestamp", required false)/span> String timeStamp,/span>/span>/span>br>span classline>span classfunction>span classparams>span classmeta>@RequestParam(value "nonce", required false)/span> String nonce,/span>/span>/span>br>span classline>span classfunction>span classparams>span classmeta>@RequestBody(required false)/span> JSONObject json)/span> /span>{/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>p>从代码上看,如果项目是基于SpringBoot的,那么可以完全没有问题。但是本次对接的项目历史悠久,还没切换到SpringBoot框架,所以只能寻求解决方案。/p>h1 id解决>a href#解决 classheaderlink title解决>/a>解决/h1>p>对于注解@RequestBody实际解析的也是Http post请求中body的内容,那我们是否可以转而通过解析http body获取到请求内容呢? 答案是肯定的,方案奉上,来自万能的stackoverflowa target_blank relnoopener hrefhttps://stackoverflow.com/questions/8100634/get-the-post-request-body-from-httpservletrequest>https://stackoverflow.com/questions/8100634/get-the-post-request-body-from-httpservletrequest/a>,这里的核心就是HttpServletRequest,链接里面有几种解决方案可选择。/p>div classpost-button>a classbtn href/java/%E6%B2%A1%E6%9C%89@RequestBody%E6%80%8E%E4%B9%88%E5%8A%9E%EF%BC%9F/#more relcontents>阅读全文 »/a>/div>/div>div>/div>footer classpost-footer>div classpost-eof>/div>/footer>/article>article itemscope itemtypehttp://schema.org/Article classpost-block langzh-CN>link itempropmainEntityOfPage hrefhttp://www.51iwowo.com/java/%E6%80%BB%E7%BB%93%E4%B8%80%E4%BA%9B%E6%9C%80%E8%BF%91%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98/>span hidden itempropauthor itemscope itemtypehttp://schema.org/Person>meta itempropimage content/images/touxiang.jpeg>meta itempropname content艺超(yi_chao_jiang)>meta itempropdescription content技术从点滴开始>/span>span hidden itemproppublisher itemscope itemtypehttp://schema.org/Organization>meta itempropname content技术沉淀-不积跬步,无以至千里>/span>header classpost-header>h2 classpost-title itempropname headline>a href/java/%E6%80%BB%E7%BB%93%E4%B8%80%E4%BA%9B%E6%9C%80%E8%BF%91%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98/ classpost-title-link itempropurl>总结一些最近遇到的问题/a>/h2>div classpost-meta>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-calendar-o>/i> /span>span classpost-meta-item-text>发表于/span> time title创建时间:2023-03-25 15:35:00 itempropdateCreated datePublished datetime2023-03-25T15:35:00+08:00>2023-03-25/time> /span>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-folder-o>/i> /span>span classpost-meta-item-text>分类于/span> span itempropabout itemscope itemtypehttp://schema.org/Thing>a href/categories/java/ itempropurl relindex>span itempropname>java/span>/a>/span>/span>br>span classpost-meta-item title本文字数>span classpost-meta-item-icon>i classfa fa-file-word-o>/i> /span>span classpost-meta-item-text>本文字数:/span> span>7.1k/span> /span>span classpost-meta-item title阅读时长>span classpost-meta-item-icon>i classfa fa-clock-o>/i> /span>span classpost-meta-item-text>阅读时长 ≈/span> span>6 分钟/span>/span>/div>/header>div classpost-body itemproparticleBody>h1 id概述>a href#概述 classheaderlink title概述>/a>概述/h1>p>最近开发中遇到了几个典型问题,总结记录一下。/p>h1 id问题1-线程池参数不正确引发的定时任务执行时间超长问题>a href#问题1-线程池参数不正确引发的定时任务执行时间超长问题 classheaderlink title问题1. 线程池参数不正确引发的定时任务执行时间超长问题>/a>问题1. 线程池参数不正确引发的定时任务执行时间超长问题/h1>p>先看一下线程池的定义/p>figure classhighlight java>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>/pre>/td>td classcode>pre>span classline>span classcomment>// 初始化线程池/span>/span>br>span classline>BlockingQueue<Runnable> queue span classkeyword>new/span> LinkedBlockingQueue<>(span classnumber>2000/span>);/span>br>span classline>ThreadFactory threadFactory span classkeyword>new/span> CustomThreadFactory(span classstring>"statusService"/span>);/span>br>span classline>RejectedExecutionHandler handler span classkeyword>new/span> ThreadPoolExecutor.CallerRunsPolicy();/span>br>span classline>executor span classkeyword>new/span> ThreadPoolExecutor(span classnumber>50/span>, span classnumber>50/span>, span classnumber>30L/span>, TimeUnit.SECONDS, queue, threadFactory, handler);/span>br>/pre>/td>/tr>/table>/figure>p>有几个关键信息/p>ul>li>核心线程数和最大线程数都为50/li>li>队列长度为2000/li>li>拒绝策略为CallerRunsPolicy/li>/ul>p>线程池的拒绝策略,通常是在线程池已经饱和,没有办法继续执行新任务的时候触发。在我们的例子中,线程数为50,队列长度为2000,那么当第2051个任务提交的时候,就会触发拒绝策略。 JUC中共有四种默认的拒绝策略供选择。/p>div classpost-button>a classbtn href/java/%E6%80%BB%E7%BB%93%E4%B8%80%E4%BA%9B%E6%9C%80%E8%BF%91%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98/#more relcontents>阅读全文 »/a>/div>/div>div>/div>footer classpost-footer>div classpost-eof>/div>/footer>/article>article itemscope itemtypehttp://schema.org/Article classpost-block langzh-CN>link itempropmainEntityOfPage hrefhttp://www.51iwowo.com/java/%E7%BA%BF%E4%B8%8A%E4%BB%A3%E7%A0%81%E4%B8%8D%E7%AC%A6%E5%90%88%E9%A2%84%E6%9C%9F%EF%BC%9F%E5%8F%8D%E7%BC%96%E8%AF%91%E9%AA%8C%E8%AF%81%E4%B8%80%E4%B8%8B/>span hidden itempropauthor itemscope itemtypehttp://schema.org/Person>meta itempropimage content/images/touxiang.jpeg>meta itempropname content艺超(yi_chao_jiang)>meta itempropdescription content技术从点滴开始>/span>span hidden itemproppublisher itemscope itemtypehttp://schema.org/Organization>meta itempropname content技术沉淀-不积跬步,无以至千里>/span>header classpost-header>h2 classpost-title itempropname headline>a href/java/%E7%BA%BF%E4%B8%8A%E4%BB%A3%E7%A0%81%E4%B8%8D%E7%AC%A6%E5%90%88%E9%A2%84%E6%9C%9F%EF%BC%9F%E5%8F%8D%E7%BC%96%E8%AF%91%E9%AA%8C%E8%AF%81%E4%B8%80%E4%B8%8B/ classpost-title-link itempropurl>线上代码不符合预期?反编译验证一下/a>/h2>div classpost-meta>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-calendar-o>/i> /span>span classpost-meta-item-text>发表于/span> time title创建时间:2023-03-24 21:35:00 itempropdateCreated datePublished datetime2023-03-24T21:35:00+08:00>2023-03-24/time> /span>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-folder-o>/i> /span>span classpost-meta-item-text>分类于/span> span itempropabout itemscope itemtypehttp://schema.org/Thing>a href/categories/java/ itempropurl relindex>span itempropname>java/span>/a>/span>/span>br>span classpost-meta-item title本文字数>span classpost-meta-item-icon>i classfa fa-file-word-o>/i> /span>span classpost-meta-item-text>本文字数:/span> span>840/span> /span>span classpost-meta-item title阅读时长>span classpost-meta-item-icon>i classfa fa-clock-o>/i> /span>span classpost-meta-item-text>阅读时长 ≈/span> span>1 分钟/span>/span>/div>/header>div classpost-body itemproparticleBody>h1 id背景>a href#背景 classheaderlink title背景>/a>背景/h1>p>本周上线发布了一个小功能,功能很小,就是增加了一个if判断,可以简单理解为下面的情况。/p>figure classhighlight java>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>/pre>/td>td classcode>pre>span classline>span classkeyword>private/span> span classkeyword>static/span> span classkeyword>final/span> String PREFIX span classstring>"xxx"/span>;/span>br>span classline>/span>br>span classline>span classfunction>span classkeyword>private/span> span classkeyword>boolean/span> span classtitle>valid/span>span classparams>(String input)/span> /span>{/span>br>span classline> span classcomment>// 原有逻辑不变/span>/span>br>span classline> span classkeyword>if/span> (input.startsWith(span classstring>"xxx"/span>)) {/span>br>span classline> span classkeyword>return/span> span classkeyword>false/span>;/span>br>span classline> }/span>br>span classline> span classkeyword>return/span> span classkeyword>true/span>;/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>p>这段代码相当简单,但是线上运行时,偶尔会发现返回不符合预期。/p>h1 id排查>a href#排查 classheaderlink title排查>/a>排查/h1>p>阶段1:根据日志获取到对应的实际数据,通过main函数方式运行,发现符合预期,代码本身没有问题。br>阶段2:分析不符合预期发生的时间,该代码位于一个定时scheduler job中,任务每2分钟执行一次,但是发生问题的时间点并非连续,应用部署在4台机器上,怀疑和某台机器有关系。br>阶段3:查看当天上线操作流程,应用原有3台机器,当天正常部署发布了最新代码。部署以后,为提升应用处理性能,做了一个机器扩容,增加到4台机器,所以当天增加的这台机器可能就是问题所在,有可能代码不是最新的。br>阶段4:验证猜测。br>step1. 登录机器,获取到部署的jar包,解压后获取到对应的class文件。/p>figure classhighlight java>table>tr>td classgutter>pre>span classline>1/span>br>/pre>/td>td classcode>pre>span classline>unzip xxx.jar/span>br>/pre>/td>/tr>/table>/figure>p>step2.反编译class文件。br>如果可以下载文件到本地,那么可以利用图形化的工具jad-gui方式,或者直接拖入intellij IDEA。br>如果在linux机器上,可以借助jad命令,该程序需要安装。br>当然,还有java自带的命令javap,也可以用于反编译,关于javap命令参考:/p>p>通过示例代码,可以运行下面的命令,查看当前class文件中是否有对应的private static final String PREFIX变量声明。/p>figure classhighlight java>table>tr>td classgutter>pre>span classline>1/span>br>/pre>/td>td classcode>pre>span classline>javap -span classkeyword>private/span> xxx.class/span>br>/pre>/td>/tr>/table>/figure>p>阶段5: 重新部署解决,怀疑该问题还是由于部署和扩容同时进行,可能导致扩容的时候还是部署的旧代码导致的。/p>/div>div>/div>footer classpost-footer>div classpost-eof>/div>/footer>/article>article itemscope itemtypehttp://schema.org/Article classpost-block langzh-CN>link itempropmainEntityOfPage hrefhttp://www.51iwowo.com/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/%E4%B8%80%E6%AC%A1%E7%BD%91%E7%BB%9C%E8%BF%9E%E9%80%9A%E6%80%A7%E9%97%AE%E9%A2%98%E8%AF%8A%E6%96%AD/>span hidden itempropauthor itemscope itemtypehttp://schema.org/Person>meta itempropimage content/images/touxiang.jpeg>meta itempropname content艺超(yi_chao_jiang)>meta itempropdescription content技术从点滴开始>/span>span hidden itemproppublisher itemscope itemtypehttp://schema.org/Organization>meta itempropname content技术沉淀-不积跬步,无以至千里>/span>header classpost-header>h2 classpost-title itempropname headline>a href/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/%E4%B8%80%E6%AC%A1%E7%BD%91%E7%BB%9C%E8%BF%9E%E9%80%9A%E6%80%A7%E9%97%AE%E9%A2%98%E8%AF%8A%E6%96%AD/ classpost-title-link itempropurl>一次网络连通性问题诊断/a>/h2>div classpost-meta>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-calendar-o>/i> /span>span classpost-meta-item-text>发表于/span> time title创建时间:2022-07-02 15:32:00 itempropdateCreated datePublished datetime2022-07-02T15:32:00+08:00>2022-07-02/time> /span>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-folder-o>/i> /span>span classpost-meta-item-text>分类于/span> span itempropabout itemscope itemtypehttp://schema.org/Thing>a href/categories/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/ itempropurl relindex>span itempropname>网络协议/span>/a>/span>/span>br>span classpost-meta-item title本文字数>span classpost-meta-item-icon>i classfa fa-file-word-o>/i> /span>span classpost-meta-item-text>本文字数:/span> span>5.2k/span> /span>span classpost-meta-item title阅读时长>span classpost-meta-item-icon>i classfa fa-clock-o>/i> /span>span classpost-meta-item-text>阅读时长 ≈/span> span>5 分钟/span>/span>/div>/header>div classpost-body itemproparticleBody>h1 id背景>a href#背景 classheaderlink title背景>/a>背景/h1>p>业务存在一个监控系统,需要监控一些设备的网络是否正常。不过最近发现经常会发生断网误报情况,所以深入探究一下问题原因。/p>h1 id排查过程>a href#排查过程 classheaderlink title排查过程>/a>排查过程/h1>h2 id阶段一:一直困扰在Ping的请求是否通的误区>a href#阶段一:一直困扰在Ping的请求是否通的误区 classheaderlink title阶段一:一直困扰在Ping的请求是否通的误区>/a>阶段一:一直困扰在Ping的请求是否通的误区/h2>p>开始的时候,粗略看了一下源代码,再加上平时一直使用Ping作为网络探测的首要方式,所以一直认为只有Ping通,才认为网络是通的。/p>figure classhighlight java>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>/pre>/td>td classcode>pre>span classline>span classkeyword>if/span> (!PingUtil.ping(ip)) {/span>br>span classline> span classkeyword>return/span> DISCONNECT;/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>p>但是事实并非如此,发现有一些主机,从监控主机ping依然是不通的,但是监控平台显示网络状态是正常的。/p>div classpost-button>a classbtn href/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/%E4%B8%80%E6%AC%A1%E7%BD%91%E7%BB%9C%E8%BF%9E%E9%80%9A%E6%80%A7%E9%97%AE%E9%A2%98%E8%AF%8A%E6%96%AD/#more relcontents>阅读全文 »/a>/div>/div>div>/div>footer classpost-footer>div classpost-eof>/div>/footer>/article>article itemscope itemtypehttp://schema.org/Article classpost-block langzh-CN>link itempropmainEntityOfPage hrefhttp://www.51iwowo.com/%E4%BB%A3%E7%A0%81/%E4%BB%A3%E7%A0%81%E6%95%B4%E6%B4%81%E4%B9%8B%E9%81%93/>span hidden itempropauthor itemscope itemtypehttp://schema.org/Person>meta itempropimage content/images/touxiang.jpeg>meta itempropname content艺超(yi_chao_jiang)>meta itempropdescription content技术从点滴开始>/span>span hidden itemproppublisher itemscope itemtypehttp://schema.org/Organization>meta itempropname content技术沉淀-不积跬步,无以至千里>/span>header classpost-header>h2 classpost-title itempropname headline>a href/%E4%BB%A3%E7%A0%81/%E4%BB%A3%E7%A0%81%E6%95%B4%E6%B4%81%E4%B9%8B%E9%81%93/ classpost-title-link itempropurl>《代码整洁之道-程序员的职业素养》读书笔记/a>/h2>div classpost-meta>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-calendar-o>/i> /span>span classpost-meta-item-text>发表于/span> time title创建时间:2022-07-02 15:32:00 itempropdateCreated datePublished datetime2022-07-02T15:32:00+08:00>2022-07-02/time> /span>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-folder-o>/i> /span>span classpost-meta-item-text>分类于/span> span itempropabout itemscope itemtypehttp://schema.org/Thing>a href/categories/%E4%BB%A3%E7%A0%81%E4%BA%BA%E7%94%9F/ itempropurl relindex>span itempropname>代码人生/span>/a>/span>/span>br>span classpost-meta-item title本文字数>span classpost-meta-item-icon>i classfa fa-file-word-o>/i> /span>span classpost-meta-item-text>本文字数:/span> span>12k/span> /span>span classpost-meta-item title阅读时长>span classpost-meta-item-icon>i classfa fa-clock-o>/i> /span>span classpost-meta-item-text>阅读时长 ≈/span> span>11 分钟/span>/span>/div>/header>div classpost-body itemproparticleBody>p>本书是Bob大叔的著作,关于本书Bob大叔这样描述/p>blockquote>p>请你把这本书看成我的错误大全,它记录了我干过的所有蠢事;也请你把这本书当成一份指引,靠它绕开我曾经走过的弯路/p>/blockquote>p>这本书主要阐述软件开发者的专业精神,书中包含很多实操性的建议,并对以下问题尝试解答/p>ul>li>什么是软件专业人士/li>li>软件专业人士如何行事/li>li>软件专业人士如何处理冲突,应对紧急的工期,如何和不讲道理的管理人员打交道?/li>li>软件专业人士何时应该说”不”,怎么说?/li>li>软件专业人士如何应对压力?/li>/ul>div classpost-button>a classbtn href/%E4%BB%A3%E7%A0%81/%E4%BB%A3%E7%A0%81%E6%95%B4%E6%B4%81%E4%B9%8B%E9%81%93/#more relcontents>阅读全文 »/a>/div>/div>div>/div>footer classpost-footer>div classpost-eof>/div>/footer>/article>article itemscope itemtypehttp://schema.org/Article classpost-block langzh-CN>link itempropmainEntityOfPage hrefhttp://www.51iwowo.com/springboot/SpringBoot%20ShutdownHook%20Demo/>span hidden itempropauthor itemscope itemtypehttp://schema.org/Person>meta itempropimage content/images/touxiang.jpeg>meta itempropname content艺超(yi_chao_jiang)>meta itempropdescription content技术从点滴开始>/span>span hidden itemproppublisher itemscope itemtypehttp://schema.org/Organization>meta itempropname content技术沉淀-不积跬步,无以至千里>/span>header classpost-header>h2 classpost-title itempropname headline>a href/springboot/SpringBoot%20ShutdownHook%20Demo/ classpost-title-link itempropurl>spring-boot shutdownHookdemo/a>/h2>div classpost-meta>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-calendar-o>/i> /span>span classpost-meta-item-text>发表于/span> time title创建时间:2022-05-18 07:12:00 itempropdateCreated datePublished datetime2022-05-18T07:12:00+08:00>2022-05-18/time> /span>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-folder-o>/i> /span>span classpost-meta-item-text>分类于/span> span itempropabout itemscope itemtypehttp://schema.org/Thing>a href/categories/springboot/ itempropurl relindex>span itempropname>springboot/span>/a>/span>/span>br>span classpost-meta-item title本文字数>span classpost-meta-item-icon>i classfa fa-file-word-o>/i> /span>span classpost-meta-item-text>本文字数:/span> span>5.7k/span> /span>span classpost-meta-item title阅读时长>span classpost-meta-item-icon>i classfa fa-clock-o>/i> /span>span classpost-meta-item-text>阅读时长 ≈/span> span>5 分钟/span>/span>/div>/header>div classpost-body itemproparticleBody>p>在应用中,经常希望在JVM关闭时做一些清理的动作,本文陈述几种常用的实现方式。/p>h5 id1、JVM自带的shutdownHook>a href#1、JVM自带的shutdownHook classheaderlink title1、JVM自带的shutdownHook>/a>1、JVM自带的shutdownHook/h5>figure classhighlight java>table>tr>td classgutter>pre>span classline>1/span>br>/pre>/td>td classcode>pre>span classline>Runtime.getRuntime().addShutdownHook(span classkeyword>new/span> Thread(() -> log.info(span classstring>"shutdown hook, jvm demo"/span>)));/span>br>/pre>/td>/tr>/table>/figure>p>特点: jvm自带,使用方便,多个钩子间是并行执行的。/p>h5 id2、监听Spring的ContextClosedEvent>a href#2、监听Spring的ContextClosedEvent classheaderlink title2、监听Spring的ContextClosedEvent>/a>2、监听Spring的ContextClosedEvent/h5>p>关于ContextClosedEvent等事件描述,可以参照以下示例(内容来自Spring官网)/p>table>thead>tr>th>Sr.No/th>th>Spring Built-in Events/th>th>Description/th>/tr>/thead>tbody>tr>td>1/td>td>ContextRefreshedEvent/td>td>This event is published when the em>ApplicationContext/em> is either initialized or refreshed. This can also be raised using the refresh() method on the em>ConfigurableApplicationContext/em> interface./td>/tr>tr>td>2/td>td>ContextStartedEvent/td>td>This event is published when the em>ApplicationContext/em> is started using the start() method on the em>ConfigurableApplicationContext/em> interface. You can poll your database or you can restart any stopped application after receiving this event./td>/tr>tr>td>3/td>td>ContextStoppedEvent/td>td>This event is published when the em>ApplicationContext/em> is stopped using the stop() method on the em>ConfigurableApplicationContext/em> interface. You can do required housekeep work after receiving this event./td>/tr>tr>td>4/td>td>ContextClosedEvent/td>td>This event is published when the em>ApplicationContext/em> is closed using the close() method on the em>ConfigurableApplicationContext/em> interface. A closed context reaches its end of life; it cannot be refreshed or restarted./td>/tr>tr>td>5/td>td>RequestHandledEvent/td>td>This is a web-specific event telling all beans that an HTTP request has been serviced./td>/tr>/tbody>/table>p>实现ApplicationListener接口,监听ContextClosedEvent/p>figure classhighlight java>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>/pre>/td>td classcode>pre>span classline>span classmeta>@Component/span>/span>br>span classline>span classmeta>@Slf4j/span>/span>br>span classline>span classkeyword>public/span> span classclass>span classkeyword>class/span> span classtitle>ShutdownHookDemo/span> span classkeyword>implements/span> span classtitle>ApplicationListener/span><span classtitle>ContextClosedEvent/span>> /span>{/span>br>span classline> span classmeta>@Override/span>/span>br>span classline> span classfunction>span classkeyword>public/span> span classkeyword>void/span> span classtitle>onApplicationEvent/span>span classparams>(ContextClosedEvent event)/span> /span>{/span>br>span classline> log.info(span classstring>"shutdown hook, ContextClosedEvent"/span>);/span>br>span classline> }/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>h5 id3、实现DisposableBean接口>a href#3、实现DisposableBean接口 classheaderlink title3、实现DisposableBean接口>/a>3、实现DisposableBean接口/h5>p>对于DisposableBean接口/p>figure classhighlight java>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>span classline>10/span>br>span classline>11/span>br>/pre>/td>td classcode>pre>span classline>span classkeyword>package/span> org.springframework.beans.factory/span>br>span classline>span classkeyword>public/span> span classclass>span classkeyword>interface/span> span classtitle>DisposableBean/span> /span>{/span>br>span classline>/span>br>span classline> span classcomment>/**/span>/span>br>span classline>span classcomment> * Invoked by the containing {span classdoctag>@code/span> BeanFactory} on destruction of a bean./span>/span>br>span classline>span classcomment> * span classdoctag>@throws/span> Exception in case of shutdown errors. Exceptions will get logged/span>/span>br>span classline>span classcomment> * but not rethrown to allow other beans to release their resources as well./span>/span>br>span classline>span classcomment> *//span>/span>br>span classline> span classfunction>span classkeyword>void/span> span classtitle>destroy/span>span classparams>()/span> span classkeyword>throws/span> Exception/span>;/span>br>span classline>/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>p>接口描述中这样写到/p>blockquote>p>Interface to be implemented by beans that want to release resources on destruction. A BeanFactory will invoke the destroy method on individual destruction of a scoped beanbr>对于那些希望在Bean销毁时需要执行资源释放的Bean,可以实现该接口。br>对每个单独的Bean,BeanFactory会负责调用destory方法。/p>/blockquote>figure classhighlight java>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>/pre>/td>td classcode>pre>span classline>span classmeta>@Component/span>/span>br>span classline>span classmeta>@Slf4j/span>/span>br>span classline>span classkeyword>public/span> span classclass>span classkeyword>class/span> span classtitle>ShutdownHookDemo/span> span classkeyword>implements/span> span classtitle>DisposableBean/span> /span>{/span>br>span classline> span classmeta>@Override/span>/span>br>span classline> span classfunction>span classkeyword>public/span> span classkeyword>void/span> span classtitle>destroy/span>span classparams>()/span> span classkeyword>throws/span> Exception /span>{/span>br>span classline> log.info(span classstring>"shutdown hook, disposable bean"/span>);/span>br>span classline> }/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>h5 id4、使用注解-PreDestory>a href#4、使用注解-PreDestory classheaderlink title4、使用注解@PreDestory>/a>4、使用注解@PreDestory/h5>p>PreDestory注解位于包:**package **javax.annotation,对于PreDestory注解的描述/p>blockquote>p>The PreDestroy annotation is used on methods as a callback notification to signal that the instance is in the process of being removed by the container. The method annotated with PreDestroy is typically used to release resources that it has been holding.br>该注解的用途也是用于释放一些Bean持有的资源,当Bean的实例被容器移除时,会触发。/p>/blockquote>p>不过对于该注解的使用,是有一些限制条件的,在注解的注释中也有描述/p>ul>li>The method MUST NOT have any parameters except in the case of interceptors in which case it takes an InvocationContext object as defined by the Interceptors specification.(除了在interceptor情况下可以接收InvocationContext参数外,方法声明必须是无参的)/li>li>The method defined on an interceptor class MUST HAVE one of the following signatures:(如果作为Interceptors,必须使用以下两种方法签名)ul>li>voidmethod>(InvocationContext)/method>/li>li>Objectmethod>(InvocationContext) throws Exception/method>/li>/ul>/li>li>The method defined on a non-interceptor class MUST HAVE the following signature:(如果不是作为Intercpetor,必须使用下面的方法签名)ul>li>voidmethod>()/method>/li>/ul>/li>li>The method on which PreDestroy is applied MAY be public, protected, package private or private. (方法访问权限可以是public/protected/private)/li>li>The method MUST NOT be static.(方法能声明为static)/li>li>The method MAY be final.(方法可以声明为final)/li>/ul>p>示例代码/p>figure classhighlight java>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>/pre>/td>td classcode>pre>span classline>span classmeta>@Component/span>/span>br>span classline>span classmeta>@Slf4j/span>/span>br>span classline>span classkeyword>public/span> span classclass>span classkeyword>class/span> span classtitle>ShutdownHookDemo/span> /span>{/span>br>span classline> span classmeta>@PreDestroy/span>/span>br>span classline> span classfunction>span classkeyword>public/span> span classkeyword>void/span> span classtitle>preDestroy/span>span classparams>()/span> /span>{/span>br>span classline> log.info(span classstring>"shutdown hook, pre destroy"/span>);/span>br>span classline> }/span>br>span classline>/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>p>对于@PreDestory会存在一个不生效的情况,对于Scope为prototype的bean,Spring不会调用@PreDestory标记的方法,以下是官方的一些解答(stackoverflowa target_blank relnoopener hrefhttps://stackoverflow.com/questions/16373276/predestroy-method-of-a-spring-singleton-bean-not-called>https://stackoverflow.com/questions/16373276/predestroy-method-of-a-spring-singleton-bean-not-called/a>)。/p>blockquote>p>In contrast to the other scopes, strong>Spring does not manage the complete lifecycle of a prototype bean/strong>: the container instantiates, configures, and otherwise assembles a prototype object, and hands it to the client, with no further record of that prototype instance.(Spring并未对Prototype类型Bean的全生命周期进行管理)br>Thus, although initialization lifecycle callback methods are called on all objects regardless of scope, in the case of prototypes, configured destruction lifecycle callbacks are not called. strong>The client code must clean up prototype-scoped objects and release expensive resources that the prototype bean(s) are holding/strong>.(对于Prototype类型的Bean必须由使用方自己负责清理资源)br>To get the Spring container to release resources held by prototype-scoped beans, strong>try using a custom bean post-processor, which holds a reference to beans that need to be cleaned up/strong>(客户端可以借助BeanPostProcessor实现自助清理工作)/p>/blockquote>h5 id5、整体Demo示例和运行日志>a href#5、整体Demo示例和运行日志 classheaderlink title5、整体Demo示例和运行日志>/a>5、整体Demo示例和运行日志/h5>figure classhighlight java>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>span classline>6/span>br>span classline>7/span>br>span classline>8/span>br>span classline>9/span>br>span classline>10/span>br>span classline>11/span>br>span classline>12/span>br>span classline>13/span>br>span classline>14/span>br>span classline>15/span>br>span classline>16/span>br>span classline>17/span>br>span classline>18/span>br>span classline>19/span>br>span classline>20/span>br>span classline>21/span>br>span classline>22/span>br>span classline>23/span>br>span classline>24/span>br>/pre>/td>td classcode>pre>span classline>span classmeta>@Component/span>/span>br>span classline>span classmeta>@Slf4j/span>/span>br>span classline>span classkeyword>public/span> span classclass>span classkeyword>class/span> span classtitle>ShutdownHookDemo/span> span classkeyword>implements/span> span classtitle>DisposableBean/span>, span classtitle>ApplicationListener/span><span classtitle>ContextClosedEvent/span>> /span>{/span>br>span classline>/span>br>span classline> span classmeta>@Override/span>/span>br>span classline> span classfunction>span classkeyword>public/span> span classkeyword>void/span> span classtitle>destroy/span>span classparams>()/span> span classkeyword>throws/span> Exception /span>{/span>br>span classline> log.info(span classstring>"shutdown hook, disposable bean"/span>);/span>br>span classline> }/span>br>span classline>/span>br>span classline> span classmeta>@Override/span>/span>br>span classline> span classfunction>span classkeyword>public/span> span classkeyword>void/span> span classtitle>onApplicationEvent/span>span classparams>(ContextClosedEvent event)/span> /span>{/span>br>span classline> log.info(span classstring>"shutdown hook, ContextClosedEvent"/span>);/span>br>span classline> }/span>br>span classline>/span>br>span classline> span classmeta>@PostConstruct/span>/span>br>span classline> span classfunction>span classkeyword>public/span> span classkeyword>void/span> span classtitle>init/span>span classparams>()/span> /span>{/span>br>span classline> Runtime.getRuntime().addShutdownHook(span classkeyword>new/span> Thread(() -> log.info(span classstring>"shutdown hook, jvm runtime hook"/span>)));/span>br>span classline> }/span>br>span classline>/span>br>span classline> span classmeta>@PreDestroy/span>/span>br>span classline> span classfunction>span classkeyword>public/span> span classkeyword>void/span> span classtitle>preDestroy/span>span classparams>()/span> /span>{/span>br>span classline> log.info(span classstring>"shutdown hook, pre destroy"/span>);/span>br>span classline> }/span>br>span classline>}/span>br>/pre>/td>/tr>/table>/figure>figure classhighlight>table>tr>td classgutter>pre>span classline>1/span>br>span classline>2/span>br>span classline>3/span>br>span classline>4/span>br>span classline>5/span>br>/pre>/td>td classcode>pre>span classline>2022-05-18 10:13:04.673 INFO 94365 --- Thread-6 c.y.s.b.s.demo.ShutdownHookDemo : shutdown hook, jvm runtime hook/span>br>span classline>2022-05-18 10:13:04.675 INFO 94365 --- TaskExecutor-24 c.y.s.b.s.demo.ShutdownHookDemo : shutdown hook, ContextClosedEvent/span>br>span classline>2022-05-18 10:13:04.709 INFO 94365 --- extShutdownHook c.y.s.b.s.demo.ShutdownHookDemo : shutdown hook, pre destroy/span>br>span classline>2022-05-18 10:13:04.709 INFO 94365 --- extShutdownHook c.y.s.b.s.demo.ShutdownHookDemo : shutdown hook, disposable bean/span>br>span classline>Process finished with exit code 143 (interrupted by signal 15: SIGTERM)/span>br>/pre>/td>/tr>/table>/figure>p>特别强调,针对这种hook,如果是kill -9 这种强制杀死进程,是不会触发的,所以对于此类应用应使用kill -15 温柔的关闭应用程序。(kill -9 和kill -15的区别)a target_blank relnoopener hrefhttps://blog.csdn.net/chuixue24/article/details/107689316>https://blog.csdn.net/chuixue24/article/details/107689316/a>/p>/div>div>/div>footer classpost-footer>div classpost-eof>/div>/footer>/article>article itemscope itemtypehttp://schema.org/Article classpost-block langzh-CN>link itempropmainEntityOfPage hrefhttp://www.51iwowo.com/middleware/Nginx%20502%20Bad%20Gateway/>span hidden itempropauthor itemscope itemtypehttp://schema.org/Person>meta itempropimage content/images/touxiang.jpeg>meta itempropname content艺超(yi_chao_jiang)>meta itempropdescription content技术从点滴开始>/span>span hidden itemproppublisher itemscope itemtypehttp://schema.org/Organization>meta itempropname content技术沉淀-不积跬步,无以至千里>/span>header classpost-header>h2 classpost-title itempropname headline>a href/middleware/Nginx%20502%20Bad%20Gateway/ classpost-title-link itempropurl>一次Nginx 502问题解决/a>/h2>div classpost-meta>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-calendar-o>/i> /span>span classpost-meta-item-text>发表于/span> time title创建时间:2022-03-05 15:35:00 itempropdateCreated datePublished datetime2022-03-05T15:35:00+08:00>2022-03-05/time> /span>span classpost-meta-item>span classpost-meta-item-icon>i classfa fa-folder-o>/i> /span>span classpost-meta-item-text>分类于/span> span itempropabout itemscope itemtypehttp://schema.org/Thing>a href/categories/Nginx/ itempropurl relindex>span itempropname>Nginx/span>/a> /span>, span itempropabout itemscope itemtypehttp://schema.org/Thing>a href/categories/Nginx/SpringBoot/ itempropurl relindex>span itempropname>SpringBoot/span>/a>/span>/span>br>span classpost-meta-item title本文字数>span classpost-meta-item-icon>i classfa fa-file-word-o>/i> /span>span classpost-meta-item-text>本文字数:/span> span>2.5k/span> /span>span classpost-meta-item title阅读时长>span classpost-meta-item-icon>i classfa fa-clock-o>/i> /span>span classpost-meta-item-text>阅读时长 ≈/span> span>2 分钟/span>/span>/div>/header>div classpost-body itemproparticleBody>h5 id问题背景>a href#问题背景 classheaderlink title问题背景>/a>问题背景/h5>p>线上某个web应用页面,偶发性的报502 Bad Gateway异常。线上环境是Nginx反向代理和SpringBoot的后端服务组合。针对这个问题,记录一下解决过程。/p>div classpost-button>a classbtn href/middleware/Nginx%20502%20Bad%20Gateway/#more relcontents>阅读全文 »/a>/div>/div>div>/div>footer classpost-footer>div classpost-eof>/div>/footer>/article>nav classpagination>span classpage-number current>1/span>a classpage-number href/page/2/>2/a>span classspace>…/span>a classpage-number href/page/6/>6/a>a classextend next relnext href/page/2/>i classfa fa-angle-right aria-label下一页>/i>/a>/nav>/div>script>window.addEventListener(tabs:register,()>{let{activeClass:e}CONFIG.comments;if(CONFIG.comments.storage&&(elocalStorage.getItem(comments_active)||e),e){let tdocument.querySelector(`ahref#comment-${e}`);t&&t.click()}}),CONFIG.comments.storage&&window.addEventListener(tabs:click,t>{t.target.matches(.tabs-comment .tab-content .tab-pane)&&(tt.target.classList1,localStorage.setItem(comments_active,t))})/script>/div>div classtoggle sidebar-toggle>span classtoggle-line toggle-line-first>/span> span classtoggle-line toggle-line-middle>/span> span classtoggle-line toggle-line-last>/span>/div>aside classsidebar>div classsidebar-inner>ul classsidebar-nav motion-element>li classsidebar-nav-toc>文章目录/li>li classsidebar-nav-overview>站点概览/li>/ul>div classpost-toc-wrap sidebar-panel>/div>div classsite-overview-wrap sidebar-panel>div classsite-author motion-element itempropauthor itemscope itemtypehttp://schema.org/Person>img classsite-author-image itempropimage alt艺超(yi_chao_jiang) src/images/touxiang.jpeg>p classsite-author-name itempropname>艺超(yi_chao_jiang)/p>div classsite-description itempropdescription>技术从点滴开始/div>/div>div classsite-state-wrap motion-element>nav classsite-state>div classsite-state-item site-state-posts>a href/archives>span classsite-state-item-count>51/span> span classsite-state-item-name>日志/span>/a>/div>div classsite-state-item site-state-categories>a href/categories/>span classsite-state-item-count>26/span> span classsite-state-item-name>分类/span>/a>/div>div classsite-state-item site-state-tags>a href/tags/>span classsite-state-item-count>32/span> span classsite-state-item-name>标签/span>/a>/div>/nav>/div>div classlinks-of-author motion-element>span classlinks-of-author-item>a hrefhttps://github.com/wowojyc titleGitHub → https://github.com/wowojyc relnoopener target_blank>i classfa fa-fw fa-github>/i>GitHub/a> /span>span classlinks-of-author-item>a hrefmailto:jiangyichao1221@gmail.com titleE-Mail → mailto:jiangyichao1221@gmail.com relnoopener target_blank>i classfa fa-fw fa-envelope>/i>E-Mail/a> /span>span classlinks-of-author-item>a href/images/my-wechat.jpeg title微信 → /images/my-wechat.jpeg>i classfa fa-fw fa-comments>/i>微信/a> /span>span classlinks-of-author-item>a href/images/dingding.png title钉钉 → /images/dingding.png>i classfa fa-fw fa-comments>/i>钉钉/a>/span>/div>/div>div classback-to-top motion-element>i classfa fa-arrow-up>/i> span>0%/span>/div>/div>/aside>div idsidebar-dimmer>/div>/div>/main>footer classfooter>div classfooter-inner>div classbeian>a hrefhttp://beian.miit.gov.cn/ relnoopener target_blank>京ICP备2021005848号-1/a>/div>div classcopyright>© span itempropcopyrightYear>2023/span> span classwith-love>i classfa fa-user>/i> /span>span classauthor itempropcopyrightHolder>艺超(yi_chao_jiang)/span> span classpost-meta-divider>|/span> span classpost-meta-item-icon>i classfa fa-area-chart>/i> /span>span classpost-meta-item-text>站点总字数:/span> span title站点总字数>176k/span> span classpost-meta-divider>|/span> span classpost-meta-item-icon>i classfa fa-coffee>/i> /span>span classpost-meta-item-text>站点阅读时长 ≈/span> span title站点阅读时长>2:40/span>/div>div classpowered-by>由 a hrefhttps://hexo.io/ classtheme-link relnoopener target_blank>Hexo/a> & a hrefhttps://pisces.theme-next.org/ classtheme-link relnoopener target_blank>NexT.Pisces/a> 强力驱动/div>div classbusuanzi-count>script async srchttps://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js>/script>span classpost-meta-item idbusuanzi_container_site_uv styledisplay:none>span classpost-meta-item-icon>i classfa fa-user>/i> /span>span classsite-uv title总访客量>span idbusuanzi_value_site_uv>/span> /span>/span>span classpost-meta-divider>|/span> span classpost-meta-item idbusuanzi_container_site_pv styledisplay:none>span classpost-meta-item-icon>i classfa fa-eye>/i> /span>span classsite-pv title总访问量>span idbusuanzi_value_site_pv>/span>/span>/span>/div>/div>/footer>/div>script src/lib/anime.min.js>/script>script src/lib/velocity/velocity.min.js>/script>script src/lib/velocity/velocity.ui.min.js>/script>script src/js/utils.js>/script>script src/js/motion.js>/script>script src/js/schemes/pisces.js>/script>script src/js/next-boot.js>/script>script>!function(){var tdocument.createElement(script),ewindow.location.protocol.split(:)0;t.srchttpse?https://zz.bdstatic.com/linksubmit/push.js:http://push.zhanzhang.baidu.com/push.js,(edocument.getElementsByTagName(script)0).parentNode.insertBefore(t,e)}()/script>script src/js/local-search.js>/script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]