sdk crash when a method called twice and too fast to creat a document

asked 2019-04-10 21:39:17 +0200

juliosmax gravatar image

Hi , mi running a webservice that replace text in a docx template and then convet it to pdf. Mi using ubuntu 18.04 and glassfish server for its deployment when i made a single request for the service of converting everything is ok , but when i made a double request too fast like a double clicking issue, i got this exception:

com.sun.star.lang.DisposedException at com.sun.star.lib.uno.environments.remote.JobQueue.removeJob(JobQueue.java:201) . . aused by: java.io.IOException: EOF reached - socket,host=localhost,port=8100,localHost=localhost,localPort=58494,peerHost=localhost,peerPort=8100 at com.sun.star.lib.uno.bridges.java_remote.XConnectionInputStream_Adapter.read(XConnectionInputStream_Adapter.java:50)

this is a portion of my code:

public Response getFilePdf(Integer idqueja) {       
    try {

                // Initialise
   String oooExeFolder = "/opt/libreoffice6.1/program";
   XComponentContext xContext = BootstrapSocketConnector.bootstrap(oooExeFolder);
//XComponentContext xContext = Bootstrap.bootstrap();

XMultiComponentFactory xMCF = xContext.getServiceManager();

Object oDesktop = xMCF.createInstanceWithContext(
     "com.sun.star.frame.Desktop", xContext);

XDesktop xDesktop = (XDesktop) UnoRuntime.queryInterface(
     XDesktop.class, oDesktop);

// Load the Document
String workingDir = "/home/somePath/";
String myTemplate = workingDir + "template.docx";

if (!new File(myTemplate).canRead()) {
    throw new RuntimeException("Cannotix load template:" + new File(myTemplate));
}

XComponentLoader xCompLoader = (XComponentLoader) UnoRuntime
    .queryInterface(com.sun.star.frame.XComponentLoader.class, xDesktop);

String sUrl = "file:///" + myTemplate;

PropertyValue[] propertyValues = new PropertyValue[0];

propertyValues = new PropertyValue[1];
propertyValues[0] = new PropertyValue();
propertyValues[0].Name = "Hidden";
propertyValues[0].Value = new Boolean(true);

XComponent xComp = xCompLoader.loadComponentFromURL(
    sUrl, "_blank", 0, propertyValues);


// Manipulate
XReplaceDescriptor xReplaceDescr = null;
XReplaceable xReplaceable = null;

XTextDocument xTextDocument = (XTextDocument) UnoRuntime
        .queryInterface(XTextDocument.class, xComp);

xReplaceable = (XReplaceable) UnoRuntime
        .queryInterface(XReplaceable.class,
                xTextDocument);

xReplaceDescr = (XReplaceDescriptor) xReplaceable
        .createReplaceDescriptor();


    xReplaceDescr.setSearchString("<version>");
xReplaceDescr.setReplaceString("1.x");
xReplaceable.replaceAll(xReplaceDescr);
// mail merge the date
xReplaceDescr.setSearchString("<number>");
xReplaceDescr.setReplaceString("12345677");
xReplaceable.replaceAll(xReplaceDescr);


    OOoOutputStream output= new OOoOutputStream();

// save as a PDF 
XStorable xStorable = (XStorable) UnoRuntime
        .queryInterface(XStorable.class, xComp);

propertyValues = new PropertyValue[2];
// Setting the flag for overwriting
propertyValues[0] = new PropertyValue();
    propertyValues[1] = new PropertyValue();

propertyValues[0].Name = "OutputStream";
propertyValues[0].Value = output;
// Setting the filter name

propertyValues[1].Name = "FilterName";
propertyValues[1].Value = "writer_pdf_Export";

// Appending the favoured extension to the origin document name
//String myResult = workingDir + "fileConverted.pdf";
xStorable.storeToURL("private:stream", propertyValues);


// shutdown
xDesktop.terminate();

     ByteArrayInputStream inStream = new ByteArrayInputStream(output.toByteArray());



              ResponseBuilder response = Response.ok((Object) inStream);
                        response.header("Content-Disposition", "attachment;filename=queja.pdf");
                        return response.build();   


    } catch (Exception e) {
        e.printStackTrace();
                    ResponseBuilder response = Response.serverError();
                    return response.build();
    }       
}

i build this guided by examples, i am a begginer in OO and LO , i saw the line of the exception was poiting to xDesktop.terminate(); , so i made an experiment and remove that statement , so now there is no raising of the exception , but as i mention i am a begginer so i am not sure what the xDesktop.terminate(); does and what is the consequences of removing it?

So this webservice method is planned to serve documents to a LOT of users, so if i got petition at the same time or too consecutive it will raise the exception unless i remove the xDesktop ... (more)

edit retag flag offensive close merge delete