场景:重启tomcat服务后,预览系统启动不了
输出日志:启动office组件失败,请检查office组件是否可用
报错:org.artofsolving.jodconverter.office.OfficeException: failed to start and connect
一开始认定原因: 1、杀死进程杀死不成功和启动软件进程互相冲突boolean killOffice = killProcess();
if (killOffice) {
logger.warn("检测到有正在运行的office进程,已自动结束该进程");
}
try {
DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration();
configuration.setOfficeHome(officeHome);
configuration.setPortNumber(8100);
// 设置任务执行超时为25分钟
configuration.setTaskExecutionTimeout(1000 * 60 * 25L);
// 设置任务队列超时为24小时
configuration.setTaskQueueTimeout(1000 * 60 * 60 * 24L);
configuration.setMaxTasksPerProcess(1000);
officeManager = configuration.buildOfficeManager();
officeManager.start();
} catch (Exception e) {
logger.error("启动office组件失败,请检查office组件是否可用");
throw e;
}
//杀死进程核心代码
String[] cmd ={"cmd","/c","taskkill /im soffice.bin /f"};
Process process= Runtime.getRuntime().exec(cmd);
//输出为1,可见杀死进程失败
logger.warn("killProcess:process"+process.waitFor());
2、后面发现不是这原因:
因为通过不断地重启发现,其实杀不死也能够让soffice被使用,它会沿用存在的soffice,去执行。
3、回到原点:为什么会启动office组件失败,请检查office组件是否可用?
再次寻找原因在不断重启过程中,我发现了项目运行和tomcat的startup.bat启动,是没有任何问题的。
有问题的情况只有:tomcat服务自启动去启动LibreOffice的时候
①当LibreOffice已启动,去启动是没有问题!
②而但LibreOffice未启动,去启动则会报错!
所以tomcat的startup.bat启动和服务自启动的区别是什么?| 启动方式 | 优点 | 缺点 |
|---|---|---|
| 系统服务启动 | 系统开机自启动 | windows系统下导出的线程信息内容不全面 |
| startup.bat启动 | 开机后必须再次双击startup.bat启动,关闭命令窗口服务即停止 | 导出的线程信息比较全面 |
而最关键的问题:为什么系统服务启动,会导出线程信息内容不全?
因为通过satrtup.bat启动用户为当前登录账户,而通过服务启动的tomcat用户为system用户,导出线程信息时,jstack命令需要添加 -F ,不加会提示:
insufficient memory or insufficient privilege to attach
结论:tomcat的startup.bat启动和服务自启动,它们的启动用户不同!所以导致了服务启动的用户对于C:Program FilesLibreOffice权限不够,最终启动不起来!
解决方式:方式一:进行C:Program FilesLibreOffice文件夹的移动,移动到不需要权限就能操作的目录下
方式二:将C:Program FilesLibreOffice放到项目的资源目录下一起打包,一起运行。缺点导致打包后包会大一些,不过不用再安装LibreOffice,移动LibreOffice。



