ひたすらZendのソースを追ってみたところ、その1で作ったMy_Queue_Stomp_Clientクラスを使うようにするにはZend_Queueのインスを作成する際のパラメータで、オブジェクトを渡してやれば良いことが判明。
$stompClient = new My_Queue_Stomp_Client( Zend_Queue_Adapter_Activemq::DEFAULT_SCHEME ); $options = array( 'name' => $name , 'driverOptions' => array( 'stompClient' => $stompClient ) ); $activeMq = new Zend_Queue( 'Activemq', $options );後は今までどおり
$msgQueue = $activeMq -> receive( 1 );とやれば、キューを一つ取り出すことができた。
とりあえずこれで最低限使える状態にはなったのだけど、このやり方だとキューを1つしか取り出すことができない。
マニュアルを読んだところ
$msgQueue = $activeMq -> receive( 5 );のようにすると、キューを5つ取り出すことができるらしい。
というわけで早速試してみたところ、またも微妙に意図した動きをしてくれない。
キューが5件以上ある時は問題なく5件取得できるし、キューが1件もない時はすぐに終了してくれるのだけど、キューが5件未満だった場合、いつまで待ってもレスポンスが返ってこない。
またもZendのソースを追ってみたところ、今度はかなり難解だった。
というわけで今度は素直に断念して、以下のようなコードで対応することに。
$insertDataCount = 0; $queueArray = array(); while ( 1 ) { // ActiveMQから一件ずつ取得 $msgQueue = $activeMq -> receive( 1 ); $queue = $msgQueue -> current(); // 取得できなければ終了 if ( is_null( $queue ) === TRUE ) { break; } else { ; } // Bodyを抽出 $message = $queue -> body; // 内部変数にプール $queueArray[] = $message; // キューを削除 $activeMq -> deleteMessage( $queue ); // 制限数を超えたら終了 $insertDataCount++; if ( $insertDataCount >= 10000 ) { break; } else { ; } }
久々にちゃんとZendのソースを読むのはかなり疲れる作業だったけど、色々と仕組みがわかってとても勉強になりましたとさ。
0 件のコメント:
コメントを投稿