업데이트을 thottling : 나는 내가 단지 방법을 분당 80 번 호출 할 수 있습니까 시나리오가 자바 7자바 메커니즘을
로 업그레이드없이 기회 자바 1.6.34에있어. 나는이있는 ApiThrottler
클래스를 작성하고 싶습니다
public class WidgetService {
// Can only call this method 80x/min, otherwise it
// it just doesn't do anything
public void doSomething(Fizz fizz);
}
: 당신은 너무 많은 시간을 호출하는 경우는 API를 (호출을 무시) 사실은 제 3 자에 의해 작성된 서비스 API이고, 그것은 "종료" boolean canRun()
메서드를 사용하여 Java 클라이언트에 doSomething(Fizz)
메서드를 호출 할 수 있는지 여부를 알릴 수 있습니다. (물론 항상 가라고 할 수 있지만, 우리는 우리의 속도를 초과 한 경우를 호출하는 것은 의미가 없습니다.)
그래서 나를 이렇게 같은 코드를 작성할 수 있습니다 무언가 :
// 80x/min
ApiThrottler throttler = new ApiThrottler(80);
WidgetService widgetService = new DefaultWidgetService();
// Massive list of Fizzes
List<Fizz> fizzes = getFizzes();
for(Fizz fizz : fizzes)
if(throttler.canRun())
widgetService.doSomething(fizz);
이것은 반드시 API (ApiThrottler#canRun
) 일 필요는 없지만 그럼에도 불구하고 WidgetService#doSomething(Fizz)
까지까지 일시 중지/잠자기 상태가 될 수있는 견고한/안정적인 메커니즘이 필요합니다.
이것은 우리가 우리가 메커니즘 및 자바 통지 (wait()
/notify()
) 모델을 잠금 어떤 종류를 사용할 수처럼 나를을 느낄 하게하는, 다중 스레드를 사용하는 영역으로 향하고있는 것처럼 나를을 느낄 있습니다. 그러나이 분야에 대한 경험이 없기 때문에 가장 세련된 솔루션을 둘러 볼 수는 없습니다. 미리 감사드립니다.
감사합니다 @hgrey (+1) - 의사 코드를 볼 기회가 있습니까? 나는 호출자 스레드가 어떻게 생겼는지, 타이머 스레드와 통신하는 방법을 시각화하는 데 어려움을 겪고 있습니다. 다시 한 번 감사드립니다! – IAmYourFaja
니스! 다시 한 번 감사드립니다. 마지막 하나의 후속 조치 :'doMakeCall'은 내 'widgetService.doSomething (Fizz)'호출을 수행하는 곳이라고 가정합니다. 그리고 '호출자'를 1 분 실행하도록 예약하려면 어떤 Java 클래스를 사용해야합니까? 지금까지 모든 위대한 도움에 다시 한번 감사드립니다! – IAmYourFaja
예, domakeCall – hgrey