kkFileView报错no office manager available

发布于:2025-02-20 ⋅ 阅读:(35) ⋅ 点赞:(0)

背景和结论

部署环境:虚机Linux系统
发生问题的版本:4.1.0-SNAPSHOT
现象:有的docx文件可以预览,有的不可以。不可以的就怎么打开都不可以(不管你是躺着,站着,坐着,睡着,趴着都不行,哈哈)
先说结论:更换libreoffice版本,切到libreoffice7.1


报错内容

贴出主要的报错内容步骤:

> no office manager available
> trying to forcibly terminate process: 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1'
> handleException /api/onlinePreview java.util.concurrent.TimeoutException
> disconnected: 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1'
> connection lost unexpectedly; attempting restart
> process forcibly terminated with code 137
> process exited with code 137
> starting process with acceptString 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1' and profileDir '/tmp/.jodconverter_socket_host-127.0.0.1_port-2001'
> started process; pid = 57864
> office process died with exit code 81; restarting it
> starting process with acceptString 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1' and profileDir '/tmp/.jodconverter_socket_host-127.0.0.1_port-2001'
> started process; pid = 57871
> connected: 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1'
> trying to forcibly terminate process: 'socket,host=127.0.0.1,port=2002,tcpNoDelay=1' (pid 50337)
> task did not complete within timeout

具体报错代码如下:(二次开发后,部分代码的行数可能会变,可以忽略行号对不上的问题)

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.artofsolving.jodconverter.office.OfficeException: no office manager available
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:497)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:584)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:791)
	at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1626)
	at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:228)
	at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
	at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
	at cn.keking.web.filter.AttributeSetFilter.doFilter(AttributeSetFilter.java:25)
	at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
	at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
	at cn.keking.web.filter.BaseUrlFilter.doFilter(BaseUrlFilter.java:57)
	at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
	at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
	at cn.keking.web.filter.TrustDirFilter.doFilter(TrustDirFilter.java:50)
	at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
	at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
	at cn.keking.web.filter.TrustHostFilter.doFilter(TrustHostFilter.java:45)
	at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
	at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
	at cn.keking.web.filter.ChinesePathFilter.doFilter(ChinesePathFilter.java:21)
	at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
	at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
	at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
	at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
	at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
	at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
	at com.iqiyi.idp.cat.core.servlet.CatServletFilter.doFilter(CatServletFilter.java:62)
	at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
	at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:548)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:602)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1435)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1350)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
	at org.eclipse.jetty.server.Server.handle(Server.java:516)
	at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:388)
	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:633)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:380)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:273)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
	at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129)
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:375)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:773)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:905)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.artofsolving.jodconverter.office.OfficeException: no office manager available
	at org.artofsolving.jodconverter.office.ProcessPoolOfficeManager.execute(ProcessPoolOfficeManager.java:70)
	at org.artofsolving.jodconverter.OfficeDocumentConverter.convert(OfficeDocumentConverter.java:72)
	at org.artofsolving.jodconverter.OfficeDocumentConverter.convert(OfficeDocumentConverter.java:63)
	at cn.keking.service.OfficeToPdfService.converterFile(OfficeToPdfService.java:34)
	at cn.keking.service.OfficeToPdfService.office2pdf(OfficeToPdfService.java:54)
	at cn.keking.service.OfficeToPdfService.openOfficeToPDF(OfficeToPdfService.java:24)
	at cn.keking.service.impl.OfficeFilePreviewImpl.filePreviewHandle(OfficeFilePreviewImpl.java:68)
	at cn.keking.web.controller.OnlinePreviewController.onlinePreview(OnlinePreviewController.java:88)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	... 74 common frames omitted
2025-02-14 18:57:47,033 INFO  [AsyncResolver-bootstrap-executor-0] [ConfigClusterResolver:getClusterEndpoints:43] [traceId:]: Resolving eureka endpoints via configuration
2025-02-14 18:58:20,716 INFO  [cat-heartbeat-task] [TomcatInfoCollector:getProperties:56] [traceId:]: tomcat collect : {}
2025-02-14 18:58:21,657 INFO  [OfficeProcessThread-0] [OfficeProcess:forciblyTerminate:204] [traceId:]: trying to forcibly terminate process: 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1' (pid 50316)
2025-02-14 18:58:21,659 WARN  [qtp1027006452-26] [HttpChannel:handleException:673] [traceId:]: handleException /api/onlinePreview java.util.concurrent.TimeoutException
2025-02-14 18:58:21,681 INFO  [MessageDispatcher] [OfficeConnection:disposing:52] [traceId:]: disconnected: 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1'
2025-02-14 18:58:21,681 WARN  [MessageDispatcher] [PooledOfficeManager:disconnected:45] [traceId:]: connection lost unexpectedly; attempting restart
2025-02-14 18:58:21,917 INFO  [OfficeProcessThread-0] [ManagedOfficeProcess:doTerminateProcess:166] [traceId:]: process forcibly terminated with code 137
2025-02-14 18:58:21,918 INFO  [OfficeProcessThread-0] [ManagedOfficeProcess:doEnsureProcessExited:156] [traceId:]: process exited with code 137
2025-02-14 18:58:21,958 INFO  [OfficeProcessThread-0] [OfficeProcess:start:86] [traceId:]: starting process with acceptString 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1' and profileDir '/tmp/.jodconverter_socket_host-127.0.0.1_port-2001'
2025-02-14 18:58:21,971 INFO  [OfficeProcessThread-0] [OfficeProcess:start:93] [traceId:]: started process; pid = 57864
2025-02-14 18:58:22,479 WARN  [OfficeProcessThread-0] [ManagedOfficeProcess:attempt:126] [traceId:]: office process died with exit code 81; restarting it
2025-02-14 18:58:22,498 INFO  [OfficeProcessThread-0] [OfficeProcess:start:86] [traceId:]: starting process with acceptString 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1' and profileDir '/tmp/.jodconverter_socket_host-127.0.0.1_port-2001'
2025-02-14 18:58:22,519 INFO  [OfficeProcessThread-0] [OfficeProcess:start:93] [traceId:]: started process; pid = 57871
2025-02-14 18:58:23,546 INFO  [OfficeProcessThread-0] [OfficeConnection:connect:88] [traceId:]: connected: 'socket,host=127.0.0.1,port=2001,tcpNoDelay=1'
2025-02-14 18:59:20,739 INFO  [cat-heartbeat-task] [TomcatInfoCollector:getProperties:56] [traceId:]: tomcat collect : {}
2025-02-14 19:00:15,260 INFO  [OfficeProcessThread-1] [OfficeProcess:forciblyTerminate:204] [traceId:]: trying to forcibly terminate process: 'socket,host=127.0.0.1,port=2002,tcpNoDelay=1' (pid 50337)
2025-02-14 19:00:15,274 INFO  [MessageDispatcher] [OfficeConnection:disposing:52] [traceId:]: disconnected: 'socket,host=127.0.0.1,port=2002,tcpNoDelay=1'
2025-02-14 19:00:15,275 WARN  [MessageDispatcher] [PooledOfficeManager:disconnected:45] [traceId:]: connection lost unexpectedly; attempting restart
2025-02-14 19:00:15,513 INFO  [OfficeProcessThread-1] [ManagedOfficeProcess:doTerminateProcess:166] [traceId:]: process forcibly terminated with code 137
2025-02-14 19:00:15,514 INFO  [OfficeProcessThread-1] [ManagedOfficeProcess:doEnsureProcessExited:156] [traceId:]: process exited with code 137
2025-02-14 19:00:15,549 INFO  [OfficeProcessThread-1] [OfficeProcess:start:86] [traceId:]: starting process with acceptString 'socket,host=127.0.0.1,port=2002,tcpNoDelay=1' and profileDir '/tmp/.jodconverter_socket_host-127.0.0.1_port-2002'
2025-02-14 19:00:15,572 INFO  [OfficeProcessThread-1] [OfficeProcess:start:93] [traceId:]: started process; pid = 60720
2025-02-14 19:00:16,078 WARN  [OfficeProcessThread-1] [ManagedOfficeProcess:attempt:126] [traceId:]: office process died with exit code 81; restarting it
2025-02-14 19:00:16,098 INFO  [OfficeProcessThread-1] [OfficeProcess:start:86] [traceId:]: starting process with acceptString 'socket,host=127.0.0.1,port=2002,tcpNoDelay=1' and profileDir '/tmp/.jodconverter_socket_host-127.0.0.1_port-2002'
2025-02-14 19:00:16,123 INFO  [OfficeProcessThread-1] [OfficeProcess:start:93] [traceId:]: started process; pid = 60786
2025-02-14 19:00:17,401 INFO  [OfficeProcessThread-1] [OfficeConnection:connect:88] [traceId:]: connected: 'socket,host=127.0.0.1,port=2002,tcpNoDelay=1'
2025-02-14 19:00:20,762 INFO  [cat-heartbeat-task] [TomcatInfoCollector:getProperties:56] [traceId:]: tomcat collect : {}
2025-02-14 19:00:25,260 INFO  [Thread-19] [FileConvertQueueTask$ConvertTask:run:78] [traceId:]: 处理预览转换任务异常,url:http://xxxx
org.artofsolving.jodconverter.office.OfficeException: task did not complete within timeout
	at org.artofsolving.jodconverter.office.PooledOfficeManager.execute(PooledOfficeManager.java:83)
	at org.artofsolving.jodconverter.office.ProcessPoolOfficeManager.execute(ProcessPoolOfficeManager.java:72)
	at org.artofsolving.jodconverter.OfficeDocumentConverter.convert(OfficeDocumentConverter.java:72)
	at org.artofsolving.jodconverter.OfficeDocumentConverter.convert(OfficeDocumentConverter.java:63)
	at cn.keking.service.OfficeToPdfService.converterFile(OfficeToPdfService.java:34)
	at cn.keking.service.OfficeToPdfService.office2pdf(OfficeToPdfService.java:54)
	at cn.keking.service.OfficeToPdfService.openOfficeToPDF(OfficeToPdfService.java:24)
	at cn.keking.service.impl.OfficeFilePreviewImpl.filePreviewHandle(OfficeFilePreviewImpl.java:68)
	at cn.keking.service.FileConvertQueueTask$ConvertTask.run(FileConvertQueueTask.java:66)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.concurrent.TimeoutException: null
	at java.util.concurrent.FutureTask.get(FutureTask.java:205)
	at org.artofsolving.jodconverter.office.PooledOfficeManager.execute(PooledOfficeManager.java:80)
	... 9 common frames omitted

思路分析和解决

一通操作下来,通过更换libreoffice版本成功了。所以猜测是高版本不兼容问题

分析

经查,我的虚机上有多个libreoffice版本(如下所示),路径是/opt
在这里插入图片描述
代码中有启动的顺序,根据findOfficeHome中从上至下的顺序选择libreoffice版本。所以在有问题的代码中,启用的是libreoffice7.5版本,可以通过打印日志确认读的是7.5版本。很多地方都可以打印,我打印的是图下这处:org.artofsolving.jodconverter.office.OfficeUtils#findOfficeHome
在这里插入图片描述
打印的日志如下:
在这里插入图片描述

解决

切到7.1版本。(其他版本也许可以,我没试,有兴趣的话也可以试一下。因为我后期要切到4.4.0版本,这里保证能正常使用即可)
把7.5至7.3的选项删除,重新部署即可(如下所示)
在这里插入图片描述