Runtime.addShutdownHook()方法理解

本文详细介绍了Java中Runtime.addShutdownHook()方法的作用及使用方式,并解释了JVM何时会执行shutdown过程以及如何通过调用halt方法来中止该过程。此外还探讨了JVM在遇到特定情况时直接abort退出的机制。
 
     Runtime.addShutdownHook()方法可以注册一个hook在JVM执行shutdown的过程中,方法的参数只要是一个初始化过但是没有执行的Thread实例就可以。(注意,Java中的Thread都是执行过了就不值钱的哦)

     说到addShutdownHook这个方法就要说一下JVM运行环境是在什么情况下shutdown或者abort的。文档上是这样写的,当最后一个非精灵进程退出或者收到了一个用户中断信号、用户登出、系统shutdown、Runtime的exit方法被调用时JVM会启动shutdown的过程,在这个过程开始后,他会并行启动所有登记的shutdown hook(注意是并行启动,这就需要线程安全和防止死锁)。当shutdown过程启动后,只有通过调用halt方法才能中止shutdown的过程并退出JVM。
那什么时候JVM会abort退出那?首先说明一下,abort退出时JVM就是停止运行但并不一定进行shutdown。这只有JVM在遇到SIGKILL信号或者windows中止进程的信号、本地方法发生类似于访问非法地址一类的内部错误时会出现。这种情况下并不能保证shutdown hook是否被执行
我使用的是elasticsearch-rest-high-level-client的6.3.2版本,我的集群服务器也是6.3.2版本,现在我想解决"org.apache.http.contenttoolongException:entity content is too long[156009266] for the configred buffer limit[104857600]"这个问题,我需要怎么实现我的代码?以下是我的配置和使用方法:@Slf4j @Configuration public class ElasticSearchConfig { @Value("${es.cluster.address}") private String esNodesAddress; /** * 连接超时时间,单位毫秒,默认5秒 */ @Value("${es.connectionTimeout:5000}") private Integer connectTimeOut; /** * socket超时时间,单位毫秒,默认10分钟 */ @Value("${es.socketTimeOut:600000}") private Integer socketTimeOut; /** * http超时时间单位毫秒,默认10分钟 */ @Value("${es.httpTimeOut:600000}") private Integer httpTimeOut; @Bean public RestHighLevelClient esRestClient() { Assert.notNull(esNodesAddress, "es nodes can not empty."); String[] nodes = esNodesAddress.split(EsConstants.COMMA); HttpHost[] httpHosts = new HttpHost[nodes.length]; for (int i=0; i<nodes.length; i++) { String[] ipPort = nodes[i].split(EsConstants.SEMICOLON); httpHosts[i] = new HttpHost(ipPort[0], Integer.parseInt(ipPort[1]), EsConstants.HTTP); } RestClientBuilder builder = RestClient.builder(httpHosts) .setMaxRetryTimeoutMillis(this.httpTimeOut) .setRequestConfigCallback(requestConfigBuilder -> requestConfigBuilder .setConnectTimeout(this.connectTimeOut) .setSocketTimeout(this.socketTimeOut)); RestHighLevelClient client = new RestHighLevelClient(builder); // 虚拟机关闭后,关闭客户端 Runtime.getRuntime().addShutdownHook(new Thread(() -> { try { client.close(); } catch (IOException e) { log.error(e.getMessage()); } })); return client; } } @Slf4j @Service public class EsServiceImpl implements EsService, EsConstants, InitializingBean { @Autowired private RestHighLevelClient client; @Autowired private ESProperties esProperties; @Override public SearchResponse search(SearchRequest searchRequest) { try { return client.search(searchRequest); } catch (IOException e) { log.error("search error", e); } return null; }}
最新发布
10-15
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值