为啥我的启动 OpenOffice 服务的调用在开发中有效,但在服务器上无效?

Posted

技术标签:

【中文标题】为啥我的启动 OpenOffice 服务的调用在开发中有效,但在服务器上无效?【英文标题】:Why does my call to start OpenOffice service work in development but not on server?为什么我的启动 OpenOffice 服务的调用在开发中有效,但在服务器上无效? 【发布时间】:2013-07-05 19:27:35 【问题描述】:

我有一个 ColdFusion 应用程序,它从目录中读取文件列表,然后使用 JODConverter 库和 OpenOffice.org 3.4.1 将列表中的每个 MSOffice 文档转换为 PDF。

我根据这里两篇文章中的说明编写了这个应用程序并设置了我的开发电脑:

http://cfsearching.blogspot.com/search/label/JODConverter

唯一的区别是我在cf_root之外安装了必要的JAR。

<cffunction name="convertNonPDFFiles" returntype="Void" output="false">
    <cfscript>
        //  CONSTANTs
        var _NON_PDF_PATH = APPLICATION.PDFSource & "\NonPDFs";
        var _PDF_PATH = APPLICATION.PDFSource & "\PDFs";
        var _VALID_FILE_EXTENSIONS = "doc,docx,ppt,pptx";

        //  Set defaults for private variables
        var _qNonPDFDir = QueryNew("");
        var _fileName = "";
        var _documentId = 0;
        var _sourceFilePath = "";
        var _destinationFilePath = "";
        var _fileExtension = "";
        var _isConversionSuccessful = true;
        var _tempSourceFilePath = "";
        var _tempImageFilePath = "";

        //  Initialize Open Office Conversion Manager
        var _openOfficeManager =
            CreateObject(
                "java",
                "org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration"
                ).setOfficeHome(
                    APPLICATION.OpenOfficeProgramPath // Location of the OpenOffice.org 3.4.1 application directory on the server
                    ).setTaskExecutionTimeout(60000).buildOfficeManager();

        _openOfficeManager.start();
    </cfscript>

    <!--- Retrieve a list of file names in the directory of unprocessed
        non-PDF files --->
    <cfdirectory
        action="list"
        directory="#_NON_PDF_PATH#"
        name="_qNonPDFDir"
        type="file"
        listinfo="name"
        sort="datelastmodified DESC" />

    <cfoutput query="_qNonPDFDir">
        <cfscript>
            _fileName = _qNonPDFDir.name;
            _fileExtension =
                REQUEST.UDFLib.File.getFileExtension(_fileName);
            _sourceFilePath = _NON_PDF_PATH & "\" & _fileName;

            //  File is a valid format for conversion
            if  (ListFindNoCase(_VALID_FILE_EXTENSIONS, _fileExtension)) 
                _documentId =
                    REQUEST.UDFLib.File.getFileNameWithoutExtension(
                        _fileName
                        );
                _destinationFilePath =
                        _PDF_PATH
                    &   "\"
                    &   REQUEST.UDFLib.File.getFileNameWithoutExtension(
                            _fileName
                            )
                    &   ".pdf";
                _isConversionSuccessful = true;
                _tempSourceFilePath =
                        APPLICATION.TempDir
                    &   "\"
                    &   _documentId
                    &   "." & _fileExtension;

                /*
                    Create of the copy of the original file in the temp
                    directory
                */
                FileCopy(
                    APPLICATION.of_aprimo_root & "\" & _documentId & ".dat",
                    _tempSourceFilePath
                    );

                //  Attempt to convert the file to PDF
                try 
                    // See convertFile() method below
                    convertFile(
                        openOfficeManager = _openOfficeManager,
                        inputFilePath = _tempSourceFilePath,
                        outputFilePath = _destinationFilePath
                        );
                
                catch (any e) 
                    _isConversionSuccessful = false;
                

                if  (_isConversionSuccessful)
                    FileMove(
                        _sourceFilePath,
                        _NON_PDF_PATH & "\Processed\"
                        );
                else
                    FileMove(
                        _sourceFilePath,
                        _NON_PDF_PATH & "\NonFunctioning\"
                        );
            
            //  File is not a valid format for conversion
            else 
                FileDelete(_sourceFilePath);
            
        </cfscript>
    </cfoutput>

    <cfscript>
        _openOfficeManager.stop();

        return;
    </cfscript>
</cffunction>

<cfscript>
    function convertFile(openOfficeManager, inputFilePath, outputFilePath) 
        CreateObject(
            "java",
            "org.artofsolving.jodconverter.OfficeDocumentConverter"
            ).init(ARGUMENTS.OpenOfficeManager).convert(
                CreateObject(
                    "java",
                    "java.io.File"
                    ).init(ARGUMENTS.inputFilePath),
                CreateObject(
                    "java",
                    "java.io.File"
                    ).init(ARGUMENTS.outputFilePath)
                );

        return;
    
</cfscript>

这个应用程序在我的开发机器上运行良好,但是一旦我将它移到我的一个网络服务器上,它就不能在那里运行。

开发电脑设置:

 OS: Windows 7 Professional SP1
 IIS: 7
 ColdFusion: 8.0.1

服务器设置:

 OS: Windows 2003 R2 Standard Edition SP2
 IIS: 6.0
 ColdFusion: 8.0.1

当我尝试在服务器上运行应用程序时 - 直接在浏览器中或通过计划任务,它不会引发异常。它似乎只是运行到 60 分钟后超时。在任务管理器中,我可以看到 soffice.bin 在应用程序启动时开始运行,但几秒钟后,soffice.bin 就从任务管理器中消失了。

任何想法可能是什么问题?

【问题讨论】:

您是否检查过以确保APPLICATION.OpenOfficeProgramPath 在两种环境中都相同? @Lance,是的,我有,这是一个在两种环境中设置不同的配置设置。我已经确认 OpenOfficeManager 对象已正确实例化,但是当它调用 start() 时,它永远不会回来...... 好像连接有问题。日志文件说什么?此外,jodconverter 是否可以在该机器上工作 - 例如从命令行? 【参考方案1】:

经过一些故障排除后,我终于能够通过对编程进行一些小的更改来使其工作(所有功劳归功于 cfSearching - 我在 http://cfsearching.blogspot.com/search/label/JODConverter 的 cmets 中找到了我的问题的答案)。

配置并启动 OpenOfficeManager 实例的原始代码:

            CreateObject(
                "java",
                "org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration"
                ).setOfficeHome(
                    APPLICATION.OpenOfficeProgramPath
                    ).setTaskExecutionTimeout(60000).buildOfficeManager();

更新(固定)以添加 setConnectionProtocol() 和 setPortNumber():

            CreateObject(
                "java",
                "org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration"
                ).setOfficeHome(
                    APPLICATION.OpenOfficeProgramPath
                    ).setConnectionProtocol(
                        CreateObject(
                            "java",
                            "org.artofsolving.jodconverter.office.OfficeConnectionProtocol"
                            ).SOCKET
                        ).setPortNumber(
                            8100
                            ).setTaskExecutionTimeout(
                                60000
                                ).buildOfficeManager();

【讨论】:

【参考方案2】:

这可能就像需要在服务器上重新安装 OpenOffice 一样简单,就像它在您的开发机器上一样。

【讨论】:

安装看起来不错。我实际上将它安装在另外两台配置类似的服务器上(一个 QA 和 UAT 服务器)并重新启动了所有三个服务器,而生产框是唯一一个导致问题的服务器。

以上是关于为啥我的启动 OpenOffice 服务的调用在开发中有效,但在服务器上无效?的主要内容,如果未能解决你的问题,请参考以下文章

怎么用在java中开启openoffice服务??

为啥挂起的意图在从服务的通知中调用时不会启动活动

openoffice在linux下无法启动服务

我应该在 debian 上与 openoffice 一起使用啥虚拟 X 服务器?

Linux下OpenOffice的安装与启动

Linux进程