loadComponentFromURL падает и умирает, как сделать СЛР? - PullRequest
0 голосов
/ 19 ноября 2008

Ну, я тестирую свою программу на jython, которая делает несколько аккуратных файлов [".xls", ".doc", ".rtf", ".tif", ".tiff", ".pdf"] -> pdf ( промежуточный файл) -> TIF (окончательный вывод) преобразования с использованием Open Office. Мы переехали из MS Office из-за проблем с автоматизацией. Теперь кажется, что мы сбили много бутылок, связанных с ошибками пробок, когда осталась одна бутылка. ОО виснет через некоторое время.

Это происходит, когда вы видите эту строку '<<<<<<<<<<<<' в коде </p>

Как мне правильно обрабатывать остановленный процесс Open Office. Не могли бы вы предоставить полезные ссылки и дать мне хорошее предложение по выходу.
Также еще один вопрос.

Подводя итог:
* Как обработать остановленный экземпляр Open Office?
* Как сделать преобразование с помощью Java без головы, чтобы у меня не выскочил графический интерфейс, тратящий всю память впустую.
* также будут приветствоваться любые общие предложения по качеству кода, оптимизации и общим стандартам кодирования.


Traceback (последний внутри):
Файл "dcmail.py", строка 184, в?
Файл "dcmail.py", строка 174, в основном
Файл "C: \ DCMail \ digestemails.py", строка 126, в process_inbox
Файл "C: \ DCMail \ digestemails.py", строка 258, в _convert
Файл "C: \ DCMail \ digestemails.py", строка 284, в _choose_conversion_type
Файл "C: \ DCMail \ digestemails.py", строка 287, в _open_office_convert
Файл "C: \ DCMail \ digestemails.py", строка 299, в _load_attachment_to_convert
com.sun.star.lang.DisposedException: java.io.EOFException
на com.sun.star.lib.uno.bridges.java_remote.java_remote_bridge $ MessageDi spatcher.run (java_remote_bridge.java:176)

com.sun.star.lang.DisposedException: com.sun.star.lang.DisposedException: java.i o.EOFException

Просто, чтобы очистить это исключение, только когда я убиваю процесс open office. В противном случае программа просто ожидает завершения открытия офиса. Неопределенно


Код (с нефункциональными кодовыми метками)

[код]

#ghost script handles these file types  
GS_WHITELIST=[".pdf"]  
#Open Office handles these file types  
OO_WHITELIST=[".xls", ".doc", ".rtf", ".tif", ".tiff"]   
#whitelist is used to check against any unsupported files.  
WHITELIST=GS_WHITELIST + OO_WHITELIST   
def _get_service_manager(self):
    try:
        self._context=Bootstrap.bootstrap();
        self._xMultiCompFactory=self._context.getServiceManager()
        self._xcomponentloader=UnoRuntime.queryInterface(XComponentLoader, self._xMultiCompFactory.createInstanceWithContext("com.sun.star.frame.Desktop", self._context))
    except:
        raise OpenOfficeException("Exception Occurred with Open Office")

def _choose_conversion_type(self,fn):
    ext=os.path.splitext(fn)[1]
    if ext in GS_WHITELIST:
        self._ghostscript_convert_to_tiff(fn)
    elif ext in OO_WHITELIST:
        self._open_office_convert(fn)

def _open_office_convert(self,fn):
    self._load_attachment_to_convert(fn)
    self._save_as_pdf(fn)
    self._ghostscript_convert_to_tiff(fn)

def _load_attachment_to_convert(self, file):
    file=self._create_UNO_File_URL(file)
    properties=[]
    p=PropertyValue()
    p.Name="Hidden"
    p.Value=True
    properties.append(p)
    properties=tuple(properties) 
    self._doc=self._xcomponentloader.loadComponentFromURL(file, "_blank",0, properties) <<<<<<<<<<<<<<< here is line 299

def _create_UNO_File_URL(self, filepath):
    try:
        file=str("file:///" + filepath)
        file=file.replace("\\", "/")
    except MalformedURLException, e:
        raise e
    return file

def _save_as_pdf(self, docSource):
    dirName=os.path.dirname(docSource)
    baseName=os.path.basename(docSource)
    baseName, ext=os.path.splitext(baseName)
    dirTmpPdfConverted=os.path.join(dirName + DIR + PDF_TEMP_CONVERT_DIR)
    if not os.path.exists(dirTmpPdfConverted):
        os.makedirs(dirTmpPdfConverted)
    pdfDest=os.path.join(dirTmpPdfConverted + DIR + baseName + ".pdf")
    url_save=self._create_UNO_File_URL(pdfDest)
    properties=self._create_properties(ext)
    try:
        try:
            self._xstorable=UnoRuntime.queryInterface(XStorable, self._doc);
            self._xstorable.storeToURL(url_save, properties)
        except AttributeError,e:
                self.logger.info("pdf file already created (" + str(e) + ")")
                raise e
    finally:
        try:
            self._doc.dispose()
        except:
            raise

def _create_properties(self,ext):
    properties=[]
    p=PropertyValue()
    p.Name="Overwrite"
    p.Value=True
    properties.append(p)
    p=PropertyValue()
    p.Name="FilterName"
    if   ext==".doc":
        p.Value='writer_pdf_Export'
    elif ext==".rtf":
        p.Value='writer_pdf_Export'
    elif ext==".xls":
        p.Value='calc_pdf_Export'
    elif ext==".tif":
        p.Value='draw_pdf_Export'
    elif ext==".tiff":
        p.Value='draw_pdf_Export'
    properties.append(p)
    return tuple(properties)

def _ghostscript_convert_to_tiff(self, docSource):
    dest, source=self._get_dest_and_source_conversion_file(docSource)
    try:
        command = ' '.join([
            self._ghostscriptPath + 'gswin32c.exe',
           '-q',
           '-dNOPAUSE',
           '-dBATCH',
           '-r500',
           '-sDEVICE=tiffg4',
           '-sPAPERSIZE=a4',
           '-sOutputFile=%s %s' % (dest, source),
           ])
        self._execute_ghostscript(command)
        self.convertedTifDocList.append(dest)
    except OSError, e:
        self.logger.info(e)
        raise e
    except TypeError, (e):
        raise e
    except AttributeError, (e):
        raise e
    except:
        raise

[/ код]

Ответы [ 2 ]

1 голос
/ 19 ноября 2008

Непростое решение - иметь монитор для процесса OpenOffice. Если ваш монитор знает PID и имеет привилегии, он может использовать процессорное время каждые несколько секунд. Если OO зависает в остановленном состоянии (больше нет процессора), то монитор может его убить.

Самый простой способ справиться с этим - заставить «обертку», которая запускает задачу open office, наблюдать за ее работой и убивать ее, когда она зависает. В любом случае родительский процесс должен подождать, поэтому он может также контролировать.

Если OpenOffuce зависает в цикле, то определить его сложнее. Процессор обычно проходит через крышу, остается там, и приоритет падает до минимально возможного приоритета. Обрабатывается или зависает? Судный звонок. Вы должны позволить этому висеть так на некоторое время (выберите случайную длительность, например, 432 секунды (3 дюжины дюжины); вы всегда будете сами догадываться.)

1 голос
/ 19 ноября 2008

OpenOffice.org имеет параметр «-headless» для запуска без графического интерфейса. Я не уверен, что это на самом деле освобождает все ресурсы, которые будут потрачены на графический интерфейс. Вот как я запускаю свой автономный экземпляр на стороне сервера:

soffice -headless -accept="socket,port=1234;urp" -display :25

Я не могу сказать, что вызывает проблемы с остановкой вашего скрипта Python, но вы можете проверить PyODConverter и посмотреть, что этот скрипт делает по-другому, чтобы, возможно, перехватить ошибку, вызывающую ваши проблемы.

...