loadComponentFromURL umfällt und stirbt, Howto CPR tun?
-
08-07-2019 - |
Frage
Nun testen ich meine jython Programm, das einige nette [ ".xls", ".doc", ".rtf", ".tif", ".tiff", ".pdf" -Dateien] tut -> pdf ( Zwischendatei) -> tif (endgültige Ausgabe) Umwandlung Open Office verwenden. Wir zogen von MS Office entfernt aufgrund der Probleme, die wir mit der Automatisierung hatte. Nun scheint es, wir haben viele Flaschen umgeworfen Zusammenhang Stopper zeigen Fehler mit einer Flasche verbleibt. OO hängt nach einer Weile.
Es passiert, wenn Sie diese Zeile sehen ‚<<<<<<<<<<<<‘ im Code
Was ist der richtige Weg für mich ins Stocken geraten Open Office Prozess zu behandeln. könnten Sie bitte Links, und geben Sie mir einen guten Vorschlag auf dem Weg heraus schaffen.
Auch eine weitere Frage.
Fazit:
* Wie ein ins Stocken geraten Open Office Instanz behandeln?
* Wie Umwandlung mit Java kopflos zu machen, so dass ich nicht eine GUI die ganze Zeit verschwenden Speicher Aufspringen.
* Auch keine allgemeinen Vorschläge zur Code-Qualität, Optimierungen und allgemeinen Codierungsstandards geschätzt werden.
Traceback (innermost last):
Die Datei "dcmail.py", Linie 184, in?
File "dcmail.py", Zeile 174, in dem Haupt
Datei "C: \ DCMAIL \ digestemails.py", Linie 126, in process_inbox
Die Datei "C: \ DCMAIL \ digestemails.py", Linie 258, in _convert
Datei "C: \ DCMAIL \ digestemails.py", Linie 284, in _choose_conversion_type
Die Datei "C: \ DCMAIL \ digestemails.py", Linie 287, in _open_office_convert
Die Datei "C: \ DCMAIL \ digestemails.py", Linie 299, in _load_attachment_to_convert
com.sun.star.lang.DisposedException: java.io.EOFException
bei 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
Nur diese Ausnahme nur zu klären wirft, wenn ich den offenen Office-Prozess zu töten. Ansonsten wartet das Programm nur für Open Office zu vervollständigen. Auf unbestimmte Zeit
Der Kodex (mit nicht funktionalen Code-Tags)
[code]
#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]
Lösung
Die eklige Lösung ist einen Monitor für den Openoffice-Prozess. Wenn Ihr Monitor die PID und hat Privilegien kennt, kann er die CPU-Zeit alle paar Sekunden gewöhnen. Wenn OO in einem Zustand zum Stillstand gekommen (nicht mehr CPU) hängt, dann kann der Monitor sie tötet.
Der einfachste Weg, dies zu umgehen ist es, den „Wrapper“ haben, die sie von der offenen Büro Aufgabe Brennen anschauen, während es läuft und töten, wenn es hängt. Der Elternprozess hat sowieso Wartezeit zu tun, so kann es auch überwachen.
Wenn OpenOffuce in einer Schleife hängt, dann ist es schwieriger zu erkennen. CPU in die Regel geht durch das Dach, bleibt dort, und die Priorität sinkt auf die niedrigsten mögliche Priorität. Die Verarbeitung oder aufgehängt? Gewissensentscheidung. Sie müssen es, wie dies für „eine Weile“ hängen lassen (eine zufällige Dauer, 432 Sekunden (3 Dutzende Dutzende) zum Beispiel wählen, Sie immer zweiter Mutmaßung sein werden selbst.)
Andere Tipps
OpenOffice.org hat einen "-headless" Parameter es ohne GUI zu laufen. Ich bin nicht sicher, ob dies tatsächlich alle Ressourcen freigibt, die auf GUI ausgegeben würde. Hier ist, wie ich meine serverseitige kopflos Instanz ausgeführt:
soffice -headless -accept="socket,port=1234;urp" -display :25
Ich kann nicht sagen, was für Ihren Python-Skript, die ein Abwürgen Probleme verursacht, aber möchten Sie vielleicht zu prüfen,