Почему мой призыв запустить службу 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 ответа:
После некоторого устранения неполадок, я, наконец, смог заставить это работать с несколькими незначительными изменениями в программировании (все заслуги 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();