2014-06-19 2 views
0

며칠 전부터이 문제로 고심하고 있으며 솔루션을 찾을 수 없습니다. 나는 시장 데이터를받는 청취자가있다. 시장이 조용하다면 (선행 시장 또는 사후 시장 (낮은 변동성)) 모든 것이 잘 작동합니다. 그러나 일단 시장이 열리면 청취자는 너무 빠른 사건을받습니다. 몇 분 후에 앱이 정지됩니다. 수신자는 수신 된 데이터 만 var에 할당합니다.Java 수신기의 새로 고침 빈도를 제어 할 수 있습니까?

orderBookBid.getBuyOrders().addListener(new ObservableListModelListener<Order>() { 
     @Override 
     public void modelChanged(final Change<? extends Order> change) { 
       System.out.println("bid event"); 
        bidChange = change.getSource(); 
      } 
    }); 

실제 데이터를 사용할 때만 프로그램이 정지됩니다. 시장이 닫히고 로컬 파일의 테스트 데이터를 사용하면 문제가 없습니다.

초당 최대 이벤트 수를 설정하는 방법이 있습니까? 또는 짧은 기간 동안 이벤트를 무시할 수있는 방법은 없습니까? 어떻게 처리 할 수 ​​있는지에 대한 아이디어는 매우 높이 평가 될 것입니다.

감사합니다.

+1

을 보여주고 싶었다로 예,이 아무것도 컴파일하지 않습니다? – laune

+1

로드 균형 조정을 위해 앱과 소스 사이에 메시지 대기열 넣기 – Lexandro

답변

1

로드 밸런서를 응용 프로그램에 넣으면 대기열이 생성되고 응용 프로그램이 고정되지 않습니다.

청취자의 논리에서 일부 이벤트를 보내려면 이벤트를 마지막으로 관리 한 후 X 시간인지 확인해야합니다. 정말 나머지는 당신이 무엇을하고 있는지에 따라 달라집니다 slow

그대로 리스너 모두의

public void modelChanged(final Change<? extends Order> change) { 
    long timeSystem = System.currentTimeMillis(); 
    if(timeSystem - timeSinceLastEventManaged > MINIMUM_TIME){ 
     //do your stuff 
     timeSinceLastEventManaged = timeSystem; 
    } 
} 
0

먼저

private long timeSinceLastEventManaged = 0; 
private final static long MINIMUM_TIME = 2000; //2 seconds 

당신은 println 없애한다. 지금 당장은 가치를 얻고 그것을 변수에 쓰는 것 같습니다. 그런 식으로 최신 변경 사항 만 볼 수 있으며 원하는 경우 @TyMarc이 제안한 솔루션이 정상적으로 작동 할 것입니다.

우리에게 보여 주신 내용이 단지 하나의 예일 뿐이고 실제로 모든 변화가 필요하다면 조금 더 복잡해집니다. 현재 값을 대기열에 추가하려면 modelChanged 메소드를 변경해야합니다 (예 : LinkedList 또는 Stack).

public void modelChanged(final Change<? extends Order> change) 
     { 
      syncronized(syncObject) 
      { 
       //add to your preffered queue 
       syncObject.notifyAll() 
      } 
     } 

이렇게하면 청취자가 실제 작업에서 벗어나 데이터를 수집 할 수 있습니다.

누군가가 작업을 수행해야하므로 syncronized을 추가했습니다. 다른

Order current; 
while(keeprunning) 
{ 
    syncronized(syncObject) 
    { 
     if(queue.hasNext()) 
     { 
     current = queue.getNext() 
     } 
     else 
     { 
     Thread.wait() 
     } 
    } 

    //do the real work here 
} 

이제 누군가가 문제가있다 :이를 위해 당신이 뭔가를 실행하는 Thread를 사용할 수 있습니다. 말 그대로. Thread이 데이터 유입을 처리 할 수없는 경우 메모리가 부족 해지거나 다른 제한을받을 때까지 대기열 크기가 커집니다. 그러나 그것은 또 다른 이야기입니다.

그리고 난 단지 당신이 생산 코드에에 println을 사용하지 않는 예를 들어

+0

방금 ​​마지막 값이 필요합니다. 주문은 입찰시 60 ~ 100 회의 주문이 가장 좋은 스냅 샷입니다 (getSellOrders 리스너의 요청). 새로운 주문이 도착하지 않으면 동일한 스냅 샷이 반복해서 전송됩니다. println이 프로덕션 코드에 없습니다. 동기화 된 솔루션은 이미 성공하지 않고 시도한 것입니다. @TyMarc의 해결책을 시도 하겠지만, 2 초 정도면 200 또는 300ms로 시도 할 것입니다. 이제 시장은 폐쇄되어 있고 나는 그것을 확인할 수 없다. 모든 것이 지금 작동합니다. TY – fpinero

+0

@fpinero 효과가 있다면 답을 받아주십시오. 다른 사람들도 유용 할 수 있습니다. – TyMarc

+0

@TyMarc 답변을 수락했습니다. 적은 이벤트를 처리해야하는 경우 문제를 해결합니다. 그리고 그것이 제가 물었던 것입니다. 그러나 문제는 ObservableListModelListener와 관련이있는 것으로 보입니다. 청취자에게 아무것도하지 않으면 프로그램이 멈 춥니 다. API 공급 업체에 연락하여 문제를 조사하고 있습니다. 그 사이에 연결하는 경우 청취자의 연결을 해제하면 앱을 계속 사용할 수 있다고 생각합니다. – fpinero

관련 문제