loadComponentFromURL cade e muore, come fare la RCP?
-
08-07-2019 - |
Domanda
Beh, sto testando il mio programma jython, che fa un po 'di [" .xls " ;, " .doc " ;, " .rtf quot ;, " .tif " ;, " .tiff " ;, " .pdf " file] - > pdf (file intermediario) - > conversione tif (output finale) tramite Open Office. Ci siamo allontanati da MS Office a causa dei problemi con l'automazione. Ora sembra che abbiamo buttato giù molte bottiglie per mostrare errori di tappo con una bottiglia rimasta. OO si blocca dopo un po '.
Succede dove vedi questa linea '< < < < < < < < ; lt &; lt &; lt &; <' nel codice
Qual è il modo corretto per me di gestire un processo Open Office bloccato. potresti per favore fornire link utili e darmi un buon suggerimento sulla via d'uscita.
Anche un'altra domanda.
Riepilogo:
* Come gestire un'istanza di Open Office bloccata?
* Come effettuare la conversione con java senza testa, quindi non ho una GUI che appare continuamente sprecando memoria.
* saranno apprezzati anche eventuali suggerimenti generali sulla qualità del codice, ottimizzazioni e standard generali di codifica.
Traceback (ultimo dentro):
File & Quot; dcmail.py & Quot ;, riga 184, in?
File & Quot; dcmail.py & Quot ;, riga 174, nella pagina principale
File & Quot; C: \ DCMail \ digestemails.py & Quot ;, riga 126, in process_inbox
File & Quot; C: \ DCMail \ digestemails.py & Quot ;, riga 258, in _convert
File & Quot; C: \ DCMail \ digestemails.py & Quot ;, riga 284, in _choose_conversion_type
File & Quot; C: \ DCMail \ digestemails.py & Quot ;, riga 287, in _open_office_convert
File & Quot; C: \ DCMail \ digestemails.py & Quot ;, riga 299, in _load_attachment_to_convert
com.sun.star.lang.DisposedException: java.io.EOFException
at 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
Solo per chiarire questa eccezione viene generata solo quando uccido il processo di ufficio aperto. In caso contrario, il programma attende solo il completamento dell'ufficio aperto. Indefinitamente
Il codice (con tag di codice non funzionali)
[codice]
#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
[/ code]
Soluzione
La soluzione icky è quella di avere un monitor per il processo OpenOffice. Se il tuo monitor conosce il PID e ha i privilegi, può ottenere il tempo della CPU usato ogni pochi secondi. Se OO si blocca in uno stato di stallo (non più CPU), il monitor può ucciderlo.
Il modo più semplice per gestirlo è avere il " wrapper " che si sta scatenando dall'ufficio aperto guardalo mentre è in esecuzione e uccidilo quando si blocca. Il processo genitore deve comunque attendere, quindi può anche monitorare.
Se OpenOffuce si blocca in un ciclo, è più difficile individuare. La CPU di solito passa attraverso il tetto, rimane lì e la priorità scende alla priorità più bassa possibile. Elaborazione o sospensione? Chiamata di giudizio. Devi lasciarlo sospeso così per & Quot; un po '& Quot; (scegli una durata casuale, ad esempio 432 secondi (3 dozzine di dozzine); indovinerai sempre te stesso.)
Altri suggerimenti
OpenOffice.org ha un " -headless " parametro per eseguirlo senza una GUI. Non sono sicuro che questo in realtà libera tutte le risorse che verrebbero spese sulla GUI. Ecco come eseguo la mia istanza senza testa sul lato server:
soffice -headless -accept="socket,port=1234;urp" -display :25
Non so cosa sta causando i problemi di stallo del tuo script Python, ma potresti voler dare un'occhiata a PyODConverter , e vedi cosa fa questo script in modo diverso per rilevare l'errore che causa il tuo problema.