Rendimiento web service API de alfresco

cancel
Showing results for 
Search instead for 
Did you mean: 
lrincono
Member II

Rendimiento web service API de alfresco

Hola a todos,

Tengo una duda. Estamos empleando el webservice-client de alfresco para insertar documentos en el gestor. El problema radica en que, cuando inicialmente alfresco está vacío, la inserción se realiza de forma más o menos rápida. Sin embargo conforme van siendo dados de alta los documentos, se ralentiza el tiempo de subida de los documentos, llegando a costar 15 segundos dar de alta un documento. ¿Alguien sabe a que se puede deber? ¿Alguien conoce alguna forma de optimizar estas inserciones?
5 Replies
pablo_zapico
Member II

Re: Rendimiento web service API de alfresco

Buenas, yo estoy haciendo cargas masivas con alfresco y me funciona bien. Subo los ficheros por webdav y despues cargo los metadatos con web service, el ultimo paso que realizo es mover los contenidos a un espacio definitivo mediante un webscript. De tal manera que cuando subo los ficheros los subo a un espacio temporal de alfresco. Una carga de casi dos mil ficheros debe rondarme una hora y pico.

Quizas tienes que revisar como tienes el cliente al servicio web implementado.
lrincono
Member II

Re: Rendimiento web service API de alfresco

Gracias por la respuesta. Yo no necesito hacer cargar masivas, simplemente voy dando de alta un documento cada vez. No sé si tiene que ver con la estructura de carpetas en la que estoy insertando. A veces exiten, pero otras veces tengo que crearlas y no sé si esas operaciones llevan tiempo.
pablo_zapico
Member II

Re: Rendimiento web service API de alfresco

Tanto como para tardar 15 segundos? creo que no… No se como haces la comprobacion de si existe el espacio o quizas algun problema de memoria. Puede influir el entorno de trabajo. Haces primero la carga de los metadatos y despues del byte[] o lo haces en el mismo paso?. Cuanto pesan los ficheros?
lrincono
Member II

Re: Rendimiento web service API de alfresco

Tengo una función que se encarga de dar de alta el documento de la siguiente manera:


public boolean guardarDocumentoGestorDocumental(byte[] contenido) throws Exception {
      
      String spaceRaizPruebas = "Pruebas";
      boolean result=true;
      
      System.out.println("Inicio guardarDocumentoGD");
      
      // asignamos un nombre al documento
      /*int cont = Contador.getContador();
      String nameFile = String.valueOf(cont);
      String nombreFicheroCompleto = nameFile+"."+extension;*/
      String nombreFicheroCompleto = nombreArchivo+"."+extension;
      
      // creamos carpetas separados con el mismo nombre de documento
      
      int contador = Contador.getContador();
      String nameCarpeta = String.valueOf(contador);
      String carpetaPrueba = carpeta+nameCarpeta;

      try {
         WebServiceFactory.setEndpointAddress(urlGestor);
         WebServiceFactory.setTimeoutMilliseconds(TIMEOUT);
         // Start the session
         AuthenticationUtils.startSession(userGestor, passwordGestor);
         
         // Create a reference to the parent where we want to create content
         Store storeRef = new Store(Constants.WORKSPACE_STORE, "SpacesStore");
         System.out.println("Obtengo la raiz del repositorio.");
         
         ParentReference companyHomeParent = new ParentReference(storeRef,null, "/app:company_home", Constants.ASSOC_CONTAINS,"sample_folder");

         // Create a reference to the parent where we want to create content

         ParentReference Nodo = new ParentReference();
         // creamos la raiz Pruebas dentro de company_home
         Nodo = this.getPadre(storeRef, "/app:company_home/*[@cm:name=\""+ spaceRaizPruebas + "\"]", spaceRaizPruebas,companyHomeParent);
         
         // se obtiene la referencia ala carpeta Pruebas –> PruebasRaiz
         ParentReference Nodo2 = this.getPadre(storeRef,"/app:company_home/*[@cm:name=\"" + spaceRaizPruebas+ "\"]/*[@cm:name=\"" + carpetaRaiz + "\"]",carpetaRaiz, Nodo);
         
         // Create a reference to the parent where we want to create content
         //ParentReference Origen = this.getPadre(storeRef,"/app:company_home/*[@cm:name=\"" + spaceRaizPruebas+ "\"]/*[@cm:name=\"" + carpetaPrueba + "\"]",carpetaPrueba, Nodo);
         ParentReference Origen = this.getPadre(storeRef,"/app:company_home/*[@cm:name=\"" + spaceRaizPruebas + "\"]/*[@cm:name=\"" + carpetaRaiz + "\"]/*[@cm:name=\"" + carpetaPrueba + "\"]",carpetaPrueba, Nodo2);

         System.out.println("Ruta Fichero a buscar:");
         System.out.println(Origen);
         
         // Assign name
         String name = nombreFicheroCompleto;
         Origen.setChildName("cm:" + name);

         // Construct CML statement to create content node
         // Note: Assign "1" as a local id, so we can refer to it in
         // subsequent
         // CML statements within the same CML block
         NamedValue[] contentProps = new NamedValue[1];
         contentProps[0] = Utils.createNamedValue(Constants.PROP_NAME, name);
         CMLCreate create1 = new CMLCreate("1", Origen, null, null, null,
               Constants.TYPE_CONTENT, contentProps);

         // Construct CML statement to add titled aspect
         NamedValue[] titledProps = new NamedValue[2];
         titledProps[0] = Utils.createNamedValue(Constants.PROP_TITLE, name);
         titledProps[1] = Utils.createNamedValue(Constants.PROP_DESCRIPTION,
               name);
         CMLAddAspect addAspect = new CMLAddAspect(Constants.ASPECT_TITLED,titledProps, null, "1");

         // Construct CML Block
         CML cml1 = new CML();
         cml1.setCreate(new CMLCreate[] { create1 });
         cml1.setAddAspect(new CMLAddAspect[] { addAspect });

         // Issue CML statement via Repository Web Service and retrieve
         // result
         // Note: Batching of multiple statements into a single web call
         UpdateResult[] updateResult = WebServiceFactory.getRepositoryService().update(cml1);

         Reference content = updateResult[0].getDestination();

         //
         // Write some content
         //   
         ContentServiceSoapBindingStub contentService = WebServiceFactory.getContentService();
         ContentFormat contentFormat = new ContentFormat("application/octet-stream", "UTF-8");
         Content contentRef = contentService.write(content,Constants.PROP_CONTENT, contenido,contentFormat);

         if (contentRef==null){
            result=false;
            logger.error("NO SE HA PODIDO GUARDAR EL DOCUMENTO "+carpetaPrueba+"/"+nombreFicheroCompleto);
            throw new Exception("No se ha podido guardar el documento");
         }
         result=true;
         logger.info("SE HA GUARDADO EL DOCUMENTO "+nombreFicheroCompleto);
      } catch (Exception e) {
         result=false;
         e.printStackTrace();
         logger.error("NO SE HA PODIDO GUARDAR EL DOCUMENTO "+carpetaPrueba+"/"+nombreFicheroCompleto);
         throw new Exception("No se ha podido guardar el documento. "+e.getMessage());
         
      } catch (Throwable ee){
         ee.printStackTrace();
         logger.error("NO SE HA PODIDO GUARDAR EL DOCUMENTO "+carpetaPrueba+"/"+nombreFicheroCompleto);
         throw new Exception("No se ha podido guardar el documento. "+ee.getMessage());
      }
      finally {
         System.out.println("Fin guardarDocumentoGD");
         AuthenticationUtils.endSession();
         
      }
      
      return result;
   }


La función getPadre obtiene la referencia padre de un nodo. Y si no existe, la crea:

private ParentReference getPadre(Store storeRef, String path, String espacio, ParentReference abuelo) throws RepositoryFault, RemoteException {

      ParentReference parent = null;
      try {
         System.out.println("Entramos a getPadre");
         System.out.println("Comprobamos que la referencia ya exista.");
         
         WebServiceFactory.getRepositoryService().get(new Predicate(new Reference[] { new Reference(storeRef,null, path) }, storeRef, null));
         
         System.out.println("El nodo " + espacio + " ya existe.");
         parent = new ParentReference(storeRef, null, path,Constants.ASSOC_CONTAINS, Constants.createQNameString(
                     Constants.NAMESPACE_CONTENT_MODEL, espacio));
         return parent;

      } catch (Exception e) {

         System.out.println("El nodo " + espacio + " no existe. Vamos a crearlo.");

         NamedValue[] properties = new NamedValue[] { Utils.createNamedValue(Constants.PROP_NAME, espacio) };
         CMLCreate create = new CMLCreate("1", abuelo, null, null, null,   Constants.TYPE_FOLDER, properties);
         CML cml = new CML();
         cml.setCreate(new CMLCreate[] { create });
         UpdateResult[] results = WebServiceFactory.getRepositoryService().update(cml);

         // Create parent reference to sample folder
         Reference sampleFolder = results[0].getDestination();

         parent = new ParentReference(storeRef, sampleFolder.getUuid(),path, Constants.ASSOC_CONTAINS, Constants.createQNameString(
                           Constants.NAMESPACE_CONTENT_MODEL, espacio));
         System.out.println("El nodo " + espacio + " ya ha sido creado.");
         return parent;

      }
   }
pablo_zapico
Member II

Re: Rendimiento web service API de alfresco

Haces la carga en dos pasos, eso ademas te puede dar problemas en algunos ficheros si son un poco pesados. De todas formas no me pare muxo a ver tu codigo xq llevo una mañana de perros. pero te pego un codigo que me pasaron que puede servirte


  private Reference upload(String nombreFichero, ParentReference rutaDestino) throws RepositoryFault,
         RemoteException {

      String contentString = ContentUtils.putContent(new File(rutaFichero));

      rutaDestino.setChildName("cm:" + nombreFichero);
      NamedValue[] contentProps = new NamedValue[2];
      contentProps[0] = Utils.createNamedValue(Constants.PROP_NAME, nombreFichero);
      contentProps[1] = Utils.createNamedValue(Constants.PROP_CONTENT, contentString);
      CMLCreate create = new CMLCreate(String.valueOf(Calendar.getInstance().getTimeInMillis()), rutaDestino,
            null, null, null, Constants.TYPE_CONTENT, contentProps);

      CML cml = new CML();
      cml.setCreate(new CMLCreate[] { create });

      UpdateResult[] result;
      Reference content = null;
      result = WebServiceFactory.getRepositoryService().update(cml);
      content = result[0].getDestination();
      return content;
   }


Es un upload pero es aplicable a un create