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 []
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:
where art is the direct reference to the artifact Java object.