cancel
Showing results for 
Search instead for 
Did you mean: 

Accès par RMI : ClassNotFoundException: SimpleCredentials

marinew
Champ in-the-making
Champ in-the-making
Bonjour,

Nous avons une application Web, hébergée dans le même Tomcat qu'Alfresco.
Cette application accède à Alfresco via RMI, pour lire /modifier des documents.
Tout fonctionne très bien depuis plus de 2 ans.
Et depuis hier, sans que personne n'ait modifié quoique ce soit, tout tentative d'accès à Alfresco par l'application métier retourne l'exception suivante :

   java.lang.ClassNotFoundException: javax.jcr.SimpleCredentials (no security manager: RMI class loader disabled)
   at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:371)
   at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
   at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
   at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
   at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
   at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1544)
   at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
   at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1699)
   at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
   at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
   at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:290)
   at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:279)
   at sun.rmi.transport.Transport$1.run(Transport.java:153)
   at java.security.AccessController.doPrivileged(Native Method)
   at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
   at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)
   at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707)
   at java.lang.Thread.run(Thread.java:595)

Précision : A l'époque du développement, j'obtenais une erreur de façon aléatoire, très ressemblanteà celle-ci mais concernant la classe "net.sf.acegisecurity.AuthenticationCredentialsNotFoundException" au lieu de "javax.jcr.SimpleCredentials".
Après de longues recherches, j'avais conclu que ce problème était lié au bug Alfresco AR-706 (dont le lien ne fonctionne plus aujourd'hui : http://issues.alfresco.com/jira/browse/AR-706).
J'avais trouvé une solution de contournement avec le projet "jcr-rmi" : http://forge.alfresco.com/projects/jcr-rmi/
Que j'avais mise en place en suivant les instructions suivantes : http://forge.alfresco.com/frs/shownotes.php?group_id=21&release_id=298

Ce problème est vraiment bloquant, donc j'apprécierai vraiment si quelque pouvait me donner des pistes de résolution, ou des éléments me permettant de mieux cerner l'origine du problème.
Merci d'avance.
Marine
16 REPLIES 16

jayjayecl
Confirmed Champ
Confirmed Champ
Bonjour, quelle version d'Alfresco, quel environnement précis ?

marinew
Champ in-the-making
Champ in-the-making
Effectivement, je n'ai pas été très précise.
Nous sommes sur la version Community 2.1.0 d'Alfresco, sur un serveur Linux Debian 4.0, Tomcat 5.5.23

Merci d'avance pour votre aide, et Joyeux Noël !!
Marine

marinew
Champ in-the-making
Champ in-the-making
Je vous mets le code exécuté ci-dessous, en sachant que le programme plante à la ligne "session = repo.login(new SimpleCredentials(…"

      String repositoryName = "javaContentRepository";
      InitialContext ictx = null;
      Repository repo = null;
      
      try {
         
         // On initialise le contexte JNDI, avec ou sans Properties selon
         // les paramètres fournis par le fichier de configuration.
         if (Utils.isVide(config.getInitialContextFactory()) ||
               Utils.isVide(config.getInitialContextProviderUrl())) {
            
            ictx = new InitialContext();

         } else {
            
            Properties prop = new Properties();

            // Accès à l'annuaire JNDI du serveur d'application hébergeant Alfresco :
            // (si Alfresco hébergé sur serveur d'appli différent)
            prop.put(Context.INITIAL_CONTEXT_FACTORY, config.getInitialContextFactory());
            prop.put(Context.PROVIDER_URL, config.getInitialContextProviderUrl());
            if (! Utils.isVide(config.getInitialContextSecurityPrincipal()))
               prop.put(Context.SECURITY_PRINCIPAL, config.getInitialContextSecurityPrincipal());
            if (! Utils.isVide(config.getInitialContextSecurityCredentials()))
               prop.put(Context.SECURITY_CREDENTIALS, config.getInitialContextSecurityCredentials());

            ictx = new InitialContext(prop);

         }
         
         // On récupère le repository
         RemoteRepository srv = (RemoteRepository) ictx.lookup(repositoryName);
         repo = new ClientRepository(srv, new ClientAdapterFactory()) ;
         
      } catch (NamingException exc) {
         
         log.error("Erreur lors de la récupération du Repository Alfresco", exc);
         
      } finally {
         
         if (ictx != null)
            try {
               ictx.close();
            } catch (NamingException ignore) {
               log.warn(
                     "Erreur a la fermeture du contexte initial pour"
                           + " RepositoryName=" + repositoryName, ignore);
            }
      }

      Session session;
      try {
         
         session = repo.login(new SimpleCredentials(
               "monLogin",
               "monPassword".toCharArray()));

marinew
Champ in-the-making
Champ in-the-making
Bon, je n'étais pas du tout sur la bonne piste, ce message m'a induite en erreur !

En réalité Alfresco ne démarre plus, et voici les logs d'erreurs au démarrage de Tomcat :

01:15:49,886 ERROR [org.springframework.web.context.ContextLoader] Context initialization failed
org.alfresco.error.AlfrescoRuntimeException: Unknown Exception in Transaction.
        at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:292)
        at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:155)
        at org.alfresco.repo.workflow.WorkflowInterpreter$1.doWork(WorkflowInterpreter.java:291)
        at org.alfresco.repo.workflow.WorkflowInterpreter$1.doWork(WorkflowInterpreter.java:282)
        at org.alfresco.repo.security.authentication.AuthenticationUtil.runAs(AuthenticationUtil.java:260)
        at org.alfresco.repo.workflow.WorkflowInterpreter.interpretCommand(WorkflowInterpreter.java:280)
        at org.alfresco.repo.workflow.WorkflowInterpreter.onBootstrap(WorkflowInterpreter.java:149)
        at org.alfresco.util.AbstractLifecycleBean.onApplicationEvent(AbstractLifecycleBean.java:62)
        at org.springframework.context.event.SimpleApplicationEventMulticaster$1.run(SimpleApplicationEventMulticaster.java:77)
(…)
Caused by: javax.transaction.RollbackException: Transaction didn't commit: Failed to prepare: requires rollback
        at org.alfresco.util.transaction.SpringAwareUserTransaction.commit(SpringAwareUserTransaction.java:430)
        at org.alfresco.repo.transaction.RetryingTransactionHelper.doInTransaction(RetryingTransactionHelper.java:239)
        … 40 more
Caused by: org.alfresco.repo.search.IndexerException: Failed to prepare: requires rollback
        at org.alfresco.repo.search.impl.lucene.AbstractLuceneIndexerAndSearcherFactory.prepare(AbstractLuceneIndexerAndSearcherFactory.java:684)
        at org.alfresco.repo.transaction.AlfrescoTransactionSupport$TransactionSynchronizationImpl.beforeCommit(AlfrescoTransactionSupport.java:63
4)
        at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCommit(TransactionSynchronizationUtils.java:48)
(…)
Caused by: org.alfresco.repo.search.IndexerException: Invalid state MARKED_ROLLBACK
        at org.alfresco.repo.search.impl.lucene.index.IndexInfo.getTransition(IndexInfo.java:1171)
        at org.alfresco.repo.search.impl.lucene.index.IndexInfo.setStatus(IndexInfo.java:1099)
        at org.alfresco.repo.search.impl.lucene.AbstractLuceneBase.setStatus(AbstractLuceneBase.java:256)
        at org.alfresco.repo.search.impl.lucene.AbstractLuceneIndexerImpl.setRollbackOnly(AbstractLuceneIndexerImpl.java:549)
        at org.alfresco.repo.search.impl.lucene.AbstractLuceneIndexerImpl.prepare(AbstractLuceneIndexerImpl.java:484)
        at org.alfresco.repo.search.impl.lucene.AbstractLuceneIndexerAndSearcherFactory.prepare(AbstractLuceneIndexerAndSearcherFactory.java:679)
        … 48 more

En cherchant sur le Web, je suis tombée sur ce post : http://forums.alfresco.com/en/viewtopic.php?f=12&t=11137&p=36858&hilit=Invalid+state+MARKED_ROLLBACK...
Un autre post sur le sujet, mais sans réponse : http://forums.alfresco.com/en/viewtopic.php?f=9&t=18716&p=103543&hilit=Invalid+state+MARKED_ROLLBACK...

Et effectivement, le dossier <ALFRESCO_HOME>/alf_data/lucene-indexes/workspace/SpacesStore comporte 32000 sous-dossiers, et on ne peut plus en créer d'autres :
mkdir test
mkdir: ne peut créer le répertoire `test': Trop de liens

A part créer changer de système de fichiers, savez-vous si on peut augmenter le nombre de sous-dossiers autorisés ?
Ou est-il possible de réduire le nombre de sous-dossiers créés à cet emplacement ?

Merci d'avance.

jeanjot
Confirmed Champ
Confirmed Champ
Bonjour

Je suppose que votre partition est en ext3. Si le nombre de dossier autorisé est variable sur ext3, malheureusement à ma connaissance le maximum d'inode de création de dossier est limité à 32.000.
http://www.worldlingo.com/ma/enwiki/fr/ext3#cite_note-0

Par conséquent, je vous propose de créer une nouvelle partition en ext4 qui elle n'a pas de limitation sur la création des inodes de répertoire, et de recopier l'intégralité de votre ancien répertoire dans cette nouvelle partition.
N'oubliez pas de connecter correctement cette nouvelle partition à votre Alfresco.

marinew
Champ in-the-making
Champ in-the-making
Bonjour,

Effectivement, on est sur du ext3.
Et la proposition de créer une nouvelle partition en ext4 pour y déplacer les données d'Alfresco me paraît judicieuse, et sans doute la plus simple et moins risquée.
Malgré tout, savez-vous si le fait de passer de ext3 en ext4 peut engendrer des soucis éventuels ?
Y a-t-il des précautions particulières à prendre, ou on peut faire une copie standard de dossiers ?

Au niveau configuration d'Alfresco, je n'ai pas l'appli sous les yeux actuellement pour vérifier, mais je suppose que je chemin vers le dossier Alf_data se configure en un point unique du fichier de configuration d'Alfresco ?
A moins que je ne créée un lien symbolique à l'emplacement actuel, pointant vers le dossier sur la nouvelle partition ?

Merci beaucoup pour votre aide !
Marine

jeanjot
Confirmed Champ
Confirmed Champ
Bonjour

Vous ne prenez aucun risque à passer sur une partition de type ext4, celle-ci est aujourd'hui largement éprouvée.
Vous n'avez aucune disposition particulière à avoir pour effectuer la copie.
Il est possible de faire une migration directe de ext3 en ext4, mais personnellement je passerais pas par là. Mais si l'aventure vous intéresse, voici la procédure sous ubuntu :
http://doc.ubuntu-fr.org/ext4#convertir_une_partition_ext3_en_ext4

Pour le plaisir, quelques informations sur ext4 :
Nouveautés
1. Ext4 a une option : extents qui permet de limiter grandement et automatiquement la fragmentation du système de fichiers.
2. Ext4 défragmente les fichiers en arrière-plan en utilisant les ressources disponibles.
3. Ext4 est considérée comme stable depuis la version 2.6.28 du noyau Linux.
4. Ext4 présente des performances en hausse par rapport à Ext3, ReiserFS 3 et XFS comme en témoigne ce bench de Phoronixhttp://www.phoronix.com/scan.php?page=article&item=ext4_benchmarks&num=1
5. Ext4 peut se transformer en système de fichier non journalisé comme Ext2.

Pour ce qui concerne le chemin du alf_data, celui-ci se trouve pour la version 2.1 (si mes souvenirs sont bons) dans le fichier alfresco.properties sous $ALFRESCO/tomcat/shared/classes/alfresco/

marinew
Champ in-the-making
Champ in-the-making
Ca aurait été trop simple… La version de Linux que nous utilisons (Debian Etch 4.0) n'est pas compatible avec ext4 : http://wiki.debian.org/Ext4

Du coup, je change d'orientation, et cherche à savoir si je peux réduire le nombre de sous dossiers pour qu'il n'atteigne pas 32.000, au moins pour gagner un peu de temps.
Pourriez-vous me dire à quoi sert ce dossier /alf_data/lucene-indexes/workspace/SpacesStore ?
Est-ce que je peux limiter le nombre de dossiers qui y sont créés ? Et comment ?

Merci

jeanjot
Confirmed Champ
Confirmed Champ
A mon avis, vous n'avez aucune possibilité de toucher à l'organisation de ces dossiers. Ceux-ci sont liés à votre base de données et au système Alfresco.
Je vous conseille fortement de ne rien faire à ce niveau.
Tous les dossiers nommés avec le mot "lucene" concerne l'indexation de vos documents, il serait préférable de ne pas y toucher.

Par contre, il se peut que vous ayez des fichiers supprimés dans alfresco que vous n'avez jamais définitivement supprimer via l'administrateur. Si, oui il vous faudra, les supprimer via Alfresco et non pas au niveau des répertoires de dossiers.
Getting started

Tags


Find what you came for

We want to make your experience in Hyland Connect as valuable as possible, so we put together some helpful links.