文档章节

CentOs7.5安装FFmpeg

SEOwhywhy
 SEOwhywhy
发布于 07/10 11:58
字数 959
阅读 28
收藏 0

  2019-04-21 11:16:32 [http-nio-4081-exec-2] WARN  com.google.common.cache.LocalCache - Exception thrown during refresh
  
  com.google.common.cache.CacheLoader$InvalidCacheLoadException: CacheLoader returned null for key BKCIYear0.
  
  at com.google.common.cache.LocalCache$Segment.getAndRecordStats(LocalCache.java:2350)
  
  at com.google.common.cache.LocalCache$Segment$1.run(LocalCache.java:2331)
  
  at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:457)
  
  at com.google.common.util.concurrent.ExecutionList.executeListener(ExecutionList.java:156)
  
  at com.google.common.util.concurrent.ExecutionList.add(ExecutionList.java:101)
  
  at com.google.common.util.concurrent.AbstractFuture.addListener(AbstractFuture.java:170)
  
  at com.google.common.cache.LocalCache$Segment.loadAsync(LocalCache.java:2326)
  
  at com.google.common.cache.LocalCache$Segment.refresh(LocalCache.java:2389)
  
  at com.google.common.cache.LocalCache$Segment.scheduleRefresh(LocalCache.java:2367)
  
  at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2187)
  
  at com.google.common.cache.LocalCache.get(LocalCache.java:3937)
  
  at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3941)
  
  at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4824)
  
  at com.kcidea.sushibase.Service.Cache.GoogleLocalCache.getCacheByName(GoogleLocalCache.java:42)
  
  google的这个开发工具里面的缓存是个轻量化的缓存,类似一个HashMap的实现,google在里面加了很多同步异步的操作。使用起来简单,不用额外搭建redis服务,故项目中使用了这个缓存。
  
  有一天生产环境直接假死了,赶紧上服务器排查,发现日志里面有大量的报WARN错误,只要触发cache的get就会报警告,由于cache的触发频率超高,导致了日志磁盘爆满,一天好几个G的日志里面全是WARN的错误。但是在开发环境下根本不触发这个错误,怎么调试都没有进这段代码里面。先暂时停用了缓存,然后开始排查。
  
  二、问题排查
  
  1. 根据报错的堆栈,一点一点往上找,直到找到这一行的时候发现了一些端倪,他想找一个newValue
  
  at com.google.common.cache.LocalCache$Segment.refresh(LocalCache.java:2389)
  
  2. 继续顺着这条线往里面找,直到找到这段代码,为什么要找newValue呢,map需要刷新了,过期了,或者主动触发刷新值了。
  
  if (map.refreshes()
  
  && (now - entry.getWriteTime() > map.refreshNanos)
  
  && !entry.getValueReference().isLoading()) {
  
  V newValue = refresh(key, hash, loader, true);
  
  if (newValue != null) {
  
  return newValue;
  
  }
  
  }
  
  3. 然后就可以解释问题为什么只在生产环境出现,而开发环境不出现了,因为是触发了过期时间,我们设置的过期时间是30分钟,所以开发环境很少调试超过30分钟的,每次都是重新运行,所以根本触发不到这个超时的地方。
  
  4. 然后接着调试,发现会走到我们一开始初始化cache的代码那边
  
  /**
  
  * 缓存队列变量
  
  */
  
  static LoadingCache<String, Object> cache = CacheBuilder.newBuilder()
  
  // 给定时间内没有被读/写访问,则回收。
  
  .refreshAfterWrite(CACHE_OUT_TIME, TimeUnit.MINUTES)
  
  // 缓存过期时间和redis缓存时长一样
  
  .expireAfterAccess(CACHE_OUT_TIME, TimeUnit.MINUTES)
  
  // 设置缓存个数
  
  .maximumSize(50000).
  
  build(new CacheLoader<String, Object>() {
  
  @Override
  
  public Object load(String key) throws Exception {
  
  //找不到就返回null (1)
  
  return null;
  
  }
  
  http://www.wanxinyulept.com/chaoyue/
  
  注意上面的代码,(1)的位置,找不到就返回null,在网上找的代码里面这里通常写的是return null或者return doThingsTheHardWay(key)之类的,但是没有详细的doThingsTheHardWay描述,所以我这里写了个null。
  
  所以根本的问题就是这里返回null导致的错误了。
  
  三、解决方案
  
  找到了问题原因,解决方案就相对来说容易的很多了
  
  1. 修改(1)处的代码,将return null修改成return new NullObject()
  
  static LoadingCache<String, Object> cache = CacheBuilder.newBuilder()
  
  // 给定时间内没有被读/写访问,则回收。
  
  .refreshAfterWrite(CACHE_OUT_TIME, TimeUnit.MINUTES)
  
  // 缓存过期时间和redis缓存时长一样
  
  .expireAfterAccess(CACHE_OUT_TIME, TimeUnit.MINUTES)
  
  // 设置缓存个数
  
  .maximumSize(50000).
  
  build(new CacheLoader<String,http://www.zzhehong.com/chaoyue/ Object>() {
  
  @Override
  
  public Object load(String key) throws Exception {
  
  //尝试将这里改成new NullObject,外面进行判断
  
  return new NullObject(www.dfyldl.com);
  
  }
  
  });
  
  2. 定义一个空白的类就叫NullObject
  
  /**
  
  * ClassName   NullObject
  
  * Author      shenjing
  
  * Date        2019/7/10
  
  * Version     1.0
  
  **/
  
  public class NullObject {
  
  }
  
  3. 在通用的getCacheByName的方法中进行判断,取到的对象是不是NullObject类型的,如果是,则返回null给外层,进行重新加载。
  
  private static <www.yuechaoyule.com> T getCacheByName(String name) {
  
  T ret = null;
  
  try {
  
  if (cache.asMap().containsKey(name)) {
  
  ret = (T) cache.get(name);
  
  if (ret.getClass(www.chaoyueylgw.com).equals(NullObject.class)) {
  
  //缓存已过期,返回null
  
  return null;
  
  }
  
  log.debug("缓存读取[{www.yuechaoyule.com}]成功", name);
  
  }
  
  } catch (Exception ex) {
  
  log.debug("缓存[{}]读取失败:{www.yfzc7.com}", name, ex.getMessage());
  
  }
  
  return ret;
  
  }

© 著作权归作者所有

SEOwhywhy
粉丝 8
博文 152
码字总数 335019
作品 0
私信 提问
php 安装ffmpeg-php

下载ffmepg源码包和ffmpeg-php包,如下: #wget http://www.ffmpeg.org/releases/ffmpeg-export-snapshot.tar.bz2 #wget http://downloads.sourceforge.net/project/ffmpeg-php/ffmpeg-php/0......

Thebreezecomes
2018/06/28
0
0
最新FFmpeg音视频核心技术精讲与实战(完整版)

第1章 课程导学与准备工作 全民娱乐时代,需要音视频等多媒体产品层出不穷,但会处理音视频数据的工程师却极度匮乏,进入音视频开发领域正当时,这门课程就是为这样的你而生。来吧!加入我们...

L272339
01/06
0
0
2018FFmpeg音视频核心技术精讲与实战(已完结)目前最新

第1章 课程导学与准备工作 全民娱乐时代,需要音视频等多媒体产品层出不穷,但会处理音视频数据的工程师却极度匮乏,进入音视频开发领域正当时,这门课程就是为这样的你而生。来吧!加入我们...

聂友华
2018/12/18
0
0
FFmpeg音视频核心技术精讲与实战(最新分享)

第1章 课程导学与准备工作 全民娱乐时代,需要音视频等多媒体产品层出不穷,但会处理音视频数据的工程师却极度匮乏,进入音视频开发领域正当时,这门课程就是为这样的你而生。来吧!加入我们...

qq_38704763
2018/12/06
0
0
最新FFmpeg音视频核心技术精讲与实战分享

第1章 课程导学与准备工作 全民娱乐时代,需要音视频等多媒体产品层出不穷,但会处理音视频数据的工程师却极度匮乏,进入音视频开发领域正当时,这门课程就是为这样的你而生。来吧!加入我们...

weixin_43746183
2018/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
58分钟前
17
0
java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
今天
8
0
太全了|万字详解Docker架构原理、功能及使用

一、简介 1、了解Docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpa...

Java技术剑
今天
21
0
Wifiphisher —— 非常非常非常流氓的 WIFI 网络钓鱼框架

编者注:这是一个非常流氓的 WIFI 网络钓鱼工具,甚至可能是非法的工具(取决于你的使用场景)。在没有事先获得许可的情况下使用 Wifiphisher 攻击基础网络设施将被视为非法活动。使用时请遵...

红薯
今天
87
1
MongoDB 4 on CentOS 7安装指南

本教程为CentOS x86_64 7.x操作系统下,MongoDB Community x86_64 4.2(GA)安装指南。 安装方式一:yum repo在线安装 [此方式较为简单,官方推荐] Step1:新建MongDB社区版Yum镜像源。 # vim ...

王焱君
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部