2017-09-05 8 views
2

java.lang.IllegalMonitorStateException이 발생합니다. 첫 번째 execLinkedOp 호출에서 한 번만 발생합니다. 나는 잘 cartago 기능을 동기화해야 몇 가지 제이슨 절차가 누락 된 것 같아요. 아마도 execLinkedOp는 다음 호출을 위해이 조건을 수정하는 끝에서 일부 컨텍스트를 다시 생성합니다.execLinkedOp의 첫 번째 실행시 CArtAgO (JaCaMo)의 java.lang.IllegalMonitorStateException

다음 포럼에서는 동기화 된 (foo) 호출이없는 경우 이런 종류의 문제가 발생할 수 있다고 말합니다. Alessadro 리치에 의해 제안으로 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

, 당신이 얻을 모든 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는 아티팩트 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); 
    } 

}