java.lang.IllegalMonitorStateException in CArtAgO (JaCaMo) on the first execution of execLinkedOp

121 views Asked by At

I am experiencing a java.lang.IllegalMonitorStateException, it happens only once, in the first execLinkedOp call. I think I am missing some Jason procedure that should synchronize well cartago functions. Probably execLinkedOp is regenerating some context at its end what fix this condition for next calls.

The following forum is saying that this kind of problem may happen in case of a lack o a synchronized (foo) call. 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 []
1

There are 1 answers

0
Sharlene Goncalves On

As proposed by Alessadro Ricci, every java.lang.IllegalMonitorStateException you get should depend by the fact that you are trying to call to CArtAgO/artifact code from a thread which does not belong to CArtAgO.

Suppose that you have your own thread T (external to CArtAgO) that wants to access an artifact A calling some public method (whose purpose is, for instance, to update the obs state of the artifact..), then, from the thread code you just call:

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

where art is the direct reference to the artifact Java object.

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);
    }

}