2013年1月31日木曜日

Zend_QueueでActiveMQを使う_その2

さて、その1の続き。

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

コメントを投稿