ひたすら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 件のコメント:
コメントを投稿