Bulk FileSystem Import en entorno Multitenant

cancel
Showing results for 
Search instead for 
Did you mean: 
calvo
Senior Member

Bulk FileSystem Import en entorno Multitenant

Hola,

Me he encontrado con un problema al utilizar la herramienta Bulk FileSystem Import, en un sistema Alfresco 5.0.2 CE Multitenant, que describo a continuación, a ver si por favor alguien dispone de información que pueda orientarme.

.- Alfresco 5.2.0 CE sobre el que he creado un "tenant" (zzz.com)

.- Me logueo en este tenant, con el usuario administrador: "admin@zzz.com"

.- Creo un sitio y una carpeta "importacion" dentro de la "DocumentLibrary"

.- Sobre la carpeta: "importacion" defino una regla (sencilla) que mueve todos los ficheros que entran en esta, a otra previamente creada (movidos)
Document Library
   importacion
   movidos

.- Accedo a la herramienta: "Bulk FileSystem Import" y procedo a cargar una serie de ficheros (http://localhost:8383/alfresco/service/bulkfsimport) indicando los datos necesarios

.- El proceso de importación comienza, y la regla se aplica sobre el primer documento/carpeta, pero con el segundo es cuando falla, devolviendo el siguiente error:

org.alfresco.error.AlfrescoRuntimeException: 070827656 org.alfresco.service.cmr.repository.InvalidNodeRefException: Failed invocation: ReflectiveMethodInvocation: public abstract boolean org.alfresco.service.cmr.repository.NodeService.hasAspect(org.alfresco.service.cmr.repository.NodeRef,org.alfresco.service.namespace.QName) throws org.alfresco.service.cmr.repository.InvalidNodeRefException,org.alfresco.service.cmr.dictionary.InvalidAspectException; target is of class [com.sun.proxy.$Proxy22]
at org.alfresco.repo.tenant.MultiTNodeServiceInterceptor.invoke(MultiTNodeServiceInterceptor.java:151)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at com.sun.proxy.$Proxy22.hasAspect(Unknown Source)
at sun.reflect.GeneratedMethodAccessor143.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.alfresco.repo.service.StoreRedirectorProxyFactory$RedirectorInvocationHandler.invoke(StoreRedirectorProxyFactory.java:231)
at com.sun.proxy.$Proxy44.hasAspect(Unknown Source)
at org.alfresco.repo.node.MLPropertyInterceptor.getPivotNodeRef(MLPropertyInterceptor.java:329)
at org.alfresco.repo.node.MLPropertyInterceptor.invoke(MLPropertyInterceptor.java:179)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.alfresco.repo.node.NodeRefPropertyMethodInterceptor.invoke(NodeRefPropertyMethodInterceptor.java:219)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at com.sun.proxy.$Proxy22.getProperties(Unknown Source)
at sun.reflect.GeneratedMethodAccessor253.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:198)
at com.sun.proxy.$Proxy22.getProperties(Unknown Source)
at org.alfresco.repo.rule.RuleServiceImpl.getRule(RuleServiceImpl.java:685)
at org.alfresco.repo.rule.RuleServiceImpl$3.doWork(RuleServiceImpl.java:1196)
at org.alfresco.repo.rule.RuleServiceImpl$3.doWork(RuleServiceImpl.java:1)
at org.alfresco.repo.security.authentication.AuthenticationUtil.runAs(AuthenticationUtil.java:555)
at org.alfresco.repo.rule.RuleServiceImpl.executePendingRuleImpl(RuleServiceImpl.java:1192)
at org.alfresco.repo.rule.RuleServiceImpl.executePendingRule(RuleServiceImpl.java:1161)
at org.alfresco.repo.rule.RuleServiceImpl.executePendingRulesImpl(RuleServiceImpl.java:1127)
at org.alfresco.repo.rule.RuleServiceImpl.executePendingRules(RuleServiceImpl.java:1100)
at org.alfresco.repo.rule.RuleTransactionListener.beforeCommit(RuleTransactionListener.java:64)
at org.alfresco.util.transaction.TransactionSupportUtil$TransactionSynchronizationImpl.doBeforeCommit(TransactionSupportUtil.java:535)
at org.alfresco.util.transaction.TransactionSupportUtil$TransactionSynchronizationImpl.doBeforeCommit(TransactionSupportUtil.java:514)
at org.alfresco.util.transaction.TransactionSupportUtil$TransactionSynchronizationImpl.beforeCommit(TransactionSupportUtil.java:479)
at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCommit(TransactionSynchronizationUtils.java:95)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(AbstractPlatformTransactionManager.java:925)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:738)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:475)
at org.alfresco.util.transaction.SpringAwareUserTransaction.commit(SpringAwareUserTransaction.java:482)
at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:486)
at org.alfresco.repo.batch.BatchProcessor$TxnCallback.run(BatchProcessor.java:764)
at org.alfresco.repo.batch.BatchProcessor.process(BatchProcessor.java:406)
at org.alfresco.repo.bulkimport.impl.StripingBulkFilesystemImporter.bulkImportImpl(StripingBulkFilesystemImporter.java:65)
at org.alfresco.repo.bulkimport.impl.AbstractBulkFilesystemImporter$3.execute(AbstractBulkFilesystemImporter.java:391)
at org.alfresco.repo.bulkimport.impl.AbstractBulkFilesystemImporter$3.execute(AbstractBulkFilesystemImporter.java:1)
at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:464)
at org.alfresco.repo.bulkimport.impl.AbstractBulkFilesystemImporter.bulkImport(AbstractBulkFilesystemImporter.java:366)
at org.alfresco.repo.bulkimport.impl.AbstractBulkFilesystemImporter$2$1.doWork(AbstractBulkFilesystemImporter.java:347)
at org.alfresco.repo.security.authentication.AuthenticationUtil.runAs(AuthenticationUtil.java:555)
at org.alfresco.repo.bulkimport.impl.AbstractBulkFilesystemImporter$2.run(AbstractBulkFilesystemImporter.java:343)
at java.lang.Thread.run(Unknown Source)
Caused by: org.alfresco.service.cmr.repository.InvalidNodeRefException: Node does not exist: workspace://SpacesStore/366b4066-741f-4fde-ae95-b6e347b3f171 (status:null)
at org.alfresco.repo.node.db.DbNodeServiceImpl.getNodePairNotNull(DbNodeServiceImpl.java:198)
at org.alfresco.repo.node.db.DbNodeServiceImpl.hasAspect_aroundBody38(DbNodeServiceImpl.java:1043)
at org.alfresco.repo.node.db.DbNodeServiceImpl$AjcClosure39.run(DbNodeServiceImpl.java:1)
at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:221)
at org.alfresco.traitextender.AJExtender.localProceed(AJExtender.java:729)
at org.alfresco.traitextender.AJProxyTrait.invoke(AJProxyTrait.java:86)
at com.sun.proxy.$Proxy18.hasAspect(Unknown Source)
at org.alfresco.repo.virtual.bundle.VirtualNodeServiceExtension.hasAspect(VirtualNodeServiceExtension.java:130)
at sun.reflect.GeneratedMethodAccessor143.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.alfresco.traitextender.SingletonExtensionFactory$TraiSingletontHandler.invoke(SingletonExtensionFactory.java:74)
at com.sun.proxy.$Proxy208.hasAspect(Unknown Source)
at sun.reflect.GeneratedMethodAccessor153.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.alfresco.traitextender.AJExtender.extendAroundAdvice(AJExtender.java:655)
at org.alfresco.traitextender.RouteExtensions.ajc$inlineAccessMethod$org_alfresco_traitextender_RouteExtensions$org_alfresco_traitextender_AJExtender$extendAroundAdvice(RouteExtensions.java:1)
at org.alfresco.traitextender.RouteExtensions.intercept(RouteExtensions.java:85)
at org.alfresco.repo.node.db.DbNodeServiceImpl.hasAspect(DbNodeServiceImpl.java:1037)
at sun.reflect.GeneratedMethodAccessor143.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.alfresco.repo.lock.mem.LockableAspectInterceptor.invoke(LockableAspectInterceptor.java:126)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at com.sun.proxy.$Proxy22.hasAspect(Unknown Source)
at sun.reflect.GeneratedMethodAccessor143.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.alfresco.repo.tenant.MultiTNodeServiceInterceptor.invoke(MultiTNodeServiceInterceptor.java:147)
... 51 more

at org.alfresco.repo.bulkimport.impl.StripingBulkFilesystemImporter.bulkImportImpl(StripingBulkFilesystemImporter.java:68)
at org.alfresco.repo.bulkimport.impl.AbstractBulkFilesystemImporter$3.execute(AbstractBulkFilesystemImporter.java:391)
at org.alfresco.repo.bulkimport.impl.AbstractBulkFilesystemImporter$3.execute(AbstractBulkFilesystemImporter.java:1)
at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:464)
at org.alfresco.repo.bulkimport.impl.AbstractBulkFilesystemImporter.bulkImport(AbstractBulkFilesystemImporter.java:366)
at org.alfresco.repo.bulkimport.impl.AbstractBulkFilesystemImporter$2$1.doWork(AbstractBulkFilesystemImporter.java:347)
at org.alfresco.repo.security.authentication.AuthenticationUtil.runAs(AuthenticationUtil.java:555)
at org.alfresco.repo.bulkimport.impl.AbstractBulkFilesystemImporter$2.run(AbstractBulkFilesystemImporter.java:343)
at java.lang.Thread.run(Unknown Source)

.- Si deshabilito la ejecución de las reglas desde la herramienta Bulk FileSystem Import, el proceso de carga funciona con normalidad. Entiendo que el problema está con la ejecución de las reglas definidas.
El nodo que indica que no existe (workspace://SpacesStore/366b4066-741f-4fde-ae95-b6e347b3f171) corresponde a la regla aplicada sobre la carpeta:

Nombre: rule:rulesfa06addc-b70b-482c-90fd-d3149ec8baaf
Padre: /app:company_home/st:sites/cm:netic360-tenant/cm:documentLibrary/cm:importacion/rule:ruleFolder
Referencia: workspace://SpacesStore/366b4066-741f-4fde-ae95-b6e347b3f171

¿Sabéis si esta herramienta (Bulk FileSystem Import) tiene algún problema/error conocido sobre entornos Multitenant?. ¿Os habéis encontrado con este problema, y conocéis por favor alguna solución?

Muchas gracias

4 Replies
angelborroy
Alfresco Employee

Re: Bulk FileSystem Import en entorno Multitenant

Mi respuesta es "no" y "no".

Multi-tenant es una funcionalidad que tiene un gran número de incidencias en diferentes ámbitos y que Alfresco tiende a ignorar. Así que, por defecto, no recomiendo utilizarla a mis clientes.

Hyland Developer Evangelist
calvo
Senior Member

Re: Bulk FileSystem Import en entorno Multitenant

Muchas gracias por la rápida respuesta, Ángel.

En mi caso, desde otro departamento se ha montado una instancia de Alfresco, y sobre esta definen "tenants" para distintos clientes, por lo que estos pre-requisitos venían ya establecidos (:-).

Tomaré muy en cuenta tu respuesta.

Gracias de nuevo

cesarista
Customer

Re: Bulk FileSystem Import en entorno Multitenant

Buenas:

Primero preguntarte, te refieres al Filesystem Bulk import de serie o al módulo de github de Peter Monks ? Te aconsejaría que uses el segundo. Es mucho mejor, incluso para la versión Enterprise. 

Como comenta Angel, los entornos multitenant siempre han dado guerra (además creo que desaparecen en la versión 6), pero con el tema de las reglas es más o menos normal desactivarlas en un Bulk import. Al final son post-procesos en servidor, en una carga masiva. Y pueden reventar las transacciones, por ejemplo debido a que estás moviendo los documentos, antes de que termine el batch de documentos subidos (si tu batch size es 1 quizas te funcione, pero te irá muy lento). También las reglas aplicadas pueden empeorar el rendimiento del servidor... imagínate que cargas miles de ficheros doc, y que la regla los transforman a pdf, más el indexador....

En tu caso, desactivaría la regla para hacer el Bulk import. Y luego ejecutaría la regla desde el interfaz de reglas de Share para moverlos. Si tienes problemas para moverlos con la regla, usaría un script desde la JS Console para moverlos de 1000 en 1000 al otro path. Lo ejecutas unas cuantas veces y listo.

También pondría unos loggers en el Bulk Import y el script de javascript para ver que se está procesando todo convenientemente.

Hace tiempo escribí algo sobre esto, quizás te sirva:

- Procesos de importación masiva de datos en Alfresco con Filesystem Bulk Import - zylk 

Saludos.

--C.

calvo
Senior Member

Re: Bulk FileSystem Import en entorno Multitenant

Hola César,

En primer lugar, muchas gracias por tu tiempo. 

A tu pregunta, utilizo el Bulk  FileSystem Import que viene de serie en Alfresco 5.2.0 CE (entorno Linux).

Respecto a lo que comentas del batch, había probado con valor 1 -por si fuera eso- pero el problema persistía, incluso con la aplicación de una regla muy sencilla.

Efectivamente, ahora -sobre el servidor de producción- estoy realizando la importación de ficheros desde Bulk FileSystem Import des-habilitando las reglas y posteriormente -desde la interfaz de share- ejecutando las reglas a mano; En este sentido, incluso había pensado en un "cron" para ejecutarlas a determinadas horas, por ejemplo: una vez al día.

De todas formas, trataba (sin mucha fortuna) de determinar el motivo por el que devolvía ese error, indicando que el nodo (regla definida) no existía. A la conclusión a la que llegué era que estaba relacionado con el multitenant, pero no quería meterme a revisar el código de la aplicación.

Por lo que  dices, el multitenant es algo que da problemas, por lo que habrá que tenerlo en cuenta para el futuro. d

Le echaré un vistazo al módulo de Github y haré  pruebas con lo que describes en el artículo que me indicas.

Muchísimas gracias