2017-09-05 5 views
2

Je rencontre une exception java.lang.IllegalMonitorStateException, une seule fois, dans le premier appel execLinkedOp. Je pense qu'il me manque une procédure de Jason qui devrait synchroniser bien les fonctions de Cartago. Probablement execLinkedOp régénère un certain contexte à sa fin ce qui corrige cette condition pour les prochains appels.java.lang.IllegalMonitorStateException dans CArtAgO (JaCaMo) lors de la première exécution de execLinkedOp

Le forum suivant indique que ce genre de problème peut se produire en cas d'absence d'un appel synchronisé (foo). http://www.jguru.com/faq/view.jsp?EID=128732

[counter] setValue invoked sucessfully! old: count(-1), received: -1 opid:opId(0,setValue,counter,robot) 
[robot] New is (-1) old number is: count(-1) 
[robot] Linking router and counter... 
TRACE: Camel Artifact 'listenCamelRoutes' is true 
DEBUG: Listening by reading the incoming queue... 
DEBUG: InOpRequest received! Artifact: router, inc2 
DEBUG: Adding in the inQueue: router: inc2 
DEBUG: Message added in the incoming queue! 
DEBUG: A message was founded in the incoming queue! Artifact:router, op:inc2, body [] 
DEBUG: Getting artifact id of router 
DEBUG: Executing inc2 without parameters. 
DEBUG: InOpRequest received! Artifact: counter, inc3 
DEBUG: Adding in the inQueue: counter: inc3 
DEBUG: Body received: [string...test...counter, 34] 
DEBUG: Parameters details: [string...test...counter, 34] 
DEBUG: Message added in the incoming queue! 
DEBUG: A message was founded in the incoming queue! Artifact:counter, op:inc3, body [string...test...counter, 34] 
DEBUG: Getting artifact id of counter 
DEBUG: artifact name/id/type: counter/7/artifacts.Counter 
DEBUG: Forwarding inc3 with following parameters: [string...test...counter, 34] 
[counter] Counter:inc3 called! A tick signal is going to be send. Parameters: string...test...counter, 34 
ERROR: Error on execLinkedOp with parameters! 
cartago.OperationException: execLinkedOp failed java.lang.IllegalMonitorStateException 
    at cartago.Artifact.execLinkedOp(Artifact.java:965) 
    at camelartifact.CamelArtifact.receiveMsg(CamelArtifact.java:128) 
    at camelartifact.CamelArtifact$ReadCmd.exec(CamelArtifact.java:203) 
    at cartago.Artifact.await(Artifact.java:832) 
    at camelartifact.CamelArtifact.setListenCamelRoute(CamelArtifact.java:69) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at cartago.ArtifactOpMethod.exec(ArtifactOpMethod.java:39) 
    at cartago.Artifact.doOperation(Artifact.java:407) 
    at cartago.Artifact.access$200(Artifact.java:32) 
    at cartago.Artifact$ArtifactAdapter.doOperation(Artifact.java:1235) 
    at cartago.WorkspaceKernel.serveOperation(WorkspaceKernel.java:1045) 
    at cartago.WorkspaceKernel.access$000(WorkspaceKernel.java:49) 
    at cartago.WorkspaceKernel$EnvironmentController.run(WorkspaceKernel.java:1359) 
DEBUG: Forwarding with parameters done! 
DEBUG: InOpRequest received! Artifact: router, inc2 
DEBUG: Adding in the inQueue: router: inc2 
DEBUG: Message added in the incoming queue! 
DEBUG: A message was founded in the incoming queue! Artifact:router, op:inc2, body [] 
+0

Avez-vous envisagé de consulter le Javadoc? – EJP

+0

Je n'ai pas trouvé dans CArtAgO des informations à ce sujet, mais ils montrent une certaine utilisation de l'API par des exemples où ils évitent vraiment l'utilisation de threads externes exactement pour éviter les problèmes de synchronisation. –

Répondre

3

Comme proposé par Alessadro Ricci, chaque java.lang.IllegalMonitorStateException vous devrait dépendre du fait que vous essayez d'appeler à Cartago/code d'artefact d'un fil qui ne fait pas partie de Cartago. Supposons que vous ayez votre propre thread T (externe à CArtAgO) qui veut accéder à un artefact A appelant une méthode publique (dont le but est, par exemple, de mettre à jour l'état obs de l'artefact ..), alors, à partir du code thread que vous venez d'appeler:

art.beginExternalSession(); /* new primitive */ 
art.yourArtifactPublichMethod(); 
... 
art.yourArtifactPublichMethod(); 
art.endExternalSession(true); /* new primitive. true = every thing was OK, false in the case of failures */ 

où art est la référence directe à l'objet Java artefact.

package c4jtest; 

import cartago.*; 

class ExtThread extends Thread { 

    private ArtifactWithExtUse art; 

    public ExtThread(ArtifactWithExtUse art){ 
     this.art = art; 
    } 

    public void run(){ 
     while (true){ 
      try { 
       Thread.sleep(1000); 
       art.beginExternalSession(); 
       art.externalInc(); 
       art.endExternalSession(true); 
      } catch (Exception ex){ 
       art.endExternalSession(false); 
      } 
     } 
    } 

} 

public class ArtifactWithExtUse extends Artifact { 

    void init(){ 
     defineObsProperty("a",0); 
     new ExtThread(this).start(); 
    } 

    /* ext API */ 

    public void externalInc(){ 
     ObsProperty prop = this.getObsProperty("a"); 
     prop.updateValue(prop.intValue()+1); 
    } 

    @OPERATION void reset(){ 
     ObsProperty prop = this.getObsProperty("a"); 
     prop.updateValue(0); 
    } 

}