Почему мой призыв запустить службу OpenOffice работает в разработке, а не на сервере?


У меня есть приложение ColdFusion, которое считывает список файлов из каталога, а затем преобразует каждый документ MSOffice в PDF с помощью библиотеки JODConverter и OpenOffice.org 3.4.1.

Я написал Это приложение и настроил свой компьютер для разработки в соответствии с инструкциями в двух статьях здесь:

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

Единственная разница в том, что я установил необходимые банки снаружи cf_root.

<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>
Это приложение отлично работает на моей машине разработки, но как только я перемещаю его на один из моих веб-серверов, оно там не работает.

Dev PC Setup:

 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 просто исчезает из Диспетчера задач.

Есть идеи, в чем может быть проблема?

2 4

2 ответа:

После некоторого устранения неполадок, я, наконец, смог заставить это работать с несколькими незначительными изменениями в программировании (все заслуги cfSearching - я нашел ответ на свою проблему в комментариях на http://cfsearching.blogspot.com/search/label/JODConverter).

Исходный код, настроивший и запустивший экземпляр 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();

Это может быть так же просто, как OpenOffice, который необходимо переустановить на сервере, где он находится на вашей машине разработки.