Storm 운영:nextTuple 에 대하 여

2474 단어 stormnextTuple
http://www.cnblogs.com/panfeng412/p/storm-spout-common-issues.html
http://blog.itpub.net/29754888/viewspace-1260026/
 
아침 에 storm 에 문제 가 있 는 것 을 발 견 했 습 니 다.로 그 를 보 니
2015-10-31T20:02:23.332+0800 STDIO [ERROR] java.lang.InterruptedException
2015-10-31T20:02:23.333+0800 STDIO [ERROR] at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.reportInterruptAfterWait(AbstractQueuedSynchronizer.java:2014)
2015-10-31T20:02:23.333+0800 STDIO [ERROR] at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2048)
2015-10-31T20:02:23.333+0800 STDIO [ERROR] at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
2015-10-31T20:02:23.333+0800 STDIO [ERROR] at com.hzw.monitor.storm.spout.ActiveMQSpout.nextTuple(ActiveMQSpout.java:45)
2015-10-31T20:02:23.333+0800 STDIO [ERROR] at backtype.storm.daemon.executor$fn__6579$fn__6594$fn__6623.invoke(executor.clj:565)
2015-10-31T20:02:23.334+0800 STDIO [ERROR] at backtype.storm.util$async_loop$fn__459.invoke(util.clj:463)
2015-10-31T20:02:23.334+0800 STDIO [ERROR] at clojure.lang.AFn.run(AFn.java:24)
2015-10-31T20:02:23.334+0800 STDIO [ERROR] at java.lang.Thread.run(Thread.java:745)

그리고 포 지 셔 닝 은 nextTuple 함 수 를 보 는 것 입 니 다.
우리 가 사용 하 는 것 은 링크 드 BlockingQueue 입 니 다.take,이 함 수 를 사 용 했 습 니 다.
 Message java.util.concurrent.LinkedBlockingQueue.take() throws InterruptedException

Retrieves and removes the head of this queue, waiting if necessary until an element becomes available.Specified by: take() in BlockingQueueReturns:the head of this queueThrows:InterruptedException - if interrupted while waiting

이 함 수 는 현재 스 레 드 를 막 을 것 입 니 다.
 
그리고 nextTuple 함수.
 /**
     * When this method is called, Storm is requesting that the Spout emit tuples to the 
     * output collector. This method should be non-blocking, so if the Spout has no tuples
     * to emit, this method should return. nextTuple, ack, and fail are all called in a tight
     * loop in a single thread in the spout task. When there are no tuples to emit, it is courteous
     * to have nextTuple sleep for a short amount of time (like a single millisecond)
     * so as not to waste too much CPU.
     */
    void nextTuple();
 
그 러 니까 여 기 는 take 로 처리 해 서 는 안 된다 는 거 야.
나중에 poll()로 수정 하여 내 놓 은 메시지 가 null 이면 10ms 를 잔다.

좋은 웹페이지 즐겨찾기