2017-09-05 2 views
2

java.lang.IllegalMonitorStateExceptionが発生しました。最初のexecLinkedOp呼び出しで1回しか発生しません。私は、うまくいきものの機能を同期させるべきJasonの手順をいくつか見逃していると思う。おそらくexecLinkedOpは、次の呼び出しのためにこの条件を修正する最後の文脈を再生成しています。execLinkedOpの最初の実行時のCArtAgO(JaCaMo)のjava.lang.IllegalMonitorStateException

次のフォーラムでは、同期(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

Javadocと相談したことはありますか? – EJP

+0

CArtAgOではCArtAgOに関する情報は見つかりませんでしたが、実際に同期の問題を防ぐために外部スレッドの使用を実際に避ける例でAPIを使用しています。 –

答えて

3

Alessadro・リッチによって提案されているように、あなたが得るすべてのjava.lang.IllegalMonitorStateExceptionあなたはカルタゴに属していないスレッドからカルタゴ/アーティファクトコードを呼び出すようにしようとしているという事実によって依存しなければなりません。

パブリックメソッド(アーティファクトのobs状態を更新するなど)を呼び出すアーティファクトAにアクセスする独自のスレッドT(CArtAgOの外部)があるとします。

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

artは、artifact Javaオブジェクトへの直接参照です。

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

} 
関連する問題