簡體   English   中英

Activemq和Php Stomp:同步生產者樣本

[英]Activemq and Php Stomp: synchronous producer sample

我正在嘗試使這個原理起作用:

  • 發送一條消息(1)並等待包含某些結果的ack的生產者(實際上是操作的json結果)
  • 使用者每隔5秒檢查一次所有待處理的消息,並在一行中處理所有消息,並在一行中確認所有消息,然后再次等待5秒(無限循環)。

這是我的stompproducer.php的30行:

<?php

function msg($txt)
{
    echo date('H:i:s > ').$txt."\n";
}

$queue  = '/aaaa';
$msg    = 'bar';
if (count($argv)<3) {
    echo $argv[0]." [msg] [nb to send]\n";
    exit(1);
}
$msg     = (string)$argv[1];
$to_send = intval($argv[2]);

try {
    $stomp = new Stomp('tcp://localhost:61613');
    while (--$to_send) {
        msg("Sending...");
        $result = $stomp->send(
            $queue,
            $msg." ". date("Y-m-d H:i:s"),
            array('receipt' => 'message-123')
        );
        echo 'result='.var_export($result,true)."\n";
        msg("Done.");
    }
} catch(StompException $e) {
    die('Connection failed: ' . $e->getMessage());
}

這是我的stompconsumer.php的30行:

<?php

$queue  = '/aaaa';
$_waitTimer=5000000;
$_timeLastAsk = microtime(true);

function msg($txt)
{
    echo date('H:i:s > ').$txt."\n";
}

try {
    $stomp = new Stomp('tcp://localhost:61613');
    $stomp->subscribe($queue, array('activemq.prefetchSize' => 40));
    $stomp->setReadTimeout(0, 10000);
    while (true) {
        $frames_read=array();
        while ($stomp->hasFrame()) {
            $frame = $stomp->readFrame();
            if ($frame != null) {
                array_push($frames_read, $frame);
            }
            if (count($frames_read)==40) {
                break;
            }
        }
        msg("Nombre de frames lues : ".count($frames_read));
        msg("Pause...");
        $e=$_waitTimer-(microtime(true)-$_timeLastAsk);
        if ($e>0) {
            usleep($e);
        }
        if (count($frames_read)>0) {
            msg("Ack now...");
            foreach ($frames_read as $frame) {
                $stomp->ack($frame);
            }
        }
        $_timeLastAsk = microtime(true);
    }
} catch(StompException $e) {
    die('Connection failed: ' . $e->getMessage());
}

我無法管理同步生產者,即等待消費者確認的生產者。 如果運行我在此處完成的示例,您將看到生成器在發送$stomp->send()立即發送所有消息,然后退出,並顯示所有“ true”(如“ ok”)結果。 我仍然沒有找到好的示例,也沒有找到帶有簡單阻止示例的好的文檔。

在消費者發送確認之前,我應該怎么做才能阻止生產者?

注:我讀過的所有文件在這里和計算器的蹬PHP的問題, 在這里這里

從這個問題看來,您正在尋找一個請求/響應類型的消息傳遞模式。 這是您必須實現的事情,因為您引用的STOMP確認僅代表消費者將消息確認給消息代理,生產者對此一無所知。 請求響應包括在出站消息上設置回復地址,然后在發送下一條消息之前等待在該地址上接收響應。 有一個偉大的很多文章,在那里,文件這樣的事情,如這一個

或者,如果您只需要知道經紀人是否已從客戶端接收到消息並將其保留,則可以使用STOMP的內置收據機制讓經紀人向您發送收據,表明它已處理了已發送的消息。 但是,這不能保證消費者已經處理了該消息。

首先想到的是:看一下這個stomp插件:

http://activemq.apache.org/message-redelivery-and-dlq-handling.html

我可以想到的另一種解決方法是:在生產者端:1.更改生產者以發送持久性消息

在您的消費者方面:使用計時器。 1.閱讀消息/幀,直到達到空或最大上限。 2.創建一個CURL請求並清空郵件的打包列表。3.使服務器休眠5秒鍾

您肯定需要進一步測試,但是應該可以。 進程喚醒后,您應該能夠讀取所有排隊的消息。

需要考慮的事項:-持久性消息將需要一個有效時間-消費者方將需要ACK以確保更新已出席消息的狀態。 使用ACK = client,以便您可以確認所有已確認的消息-如果您不必等待CURL進行響應,這會更容易。 -開箱即用,不支持從使用者(服務器端)發送ACK。

祝你好運

我只記得,您可以嘗試reactphp / stomp庫。 這是一個事件驅動的庫,可能會對您有所幫助。 特別看一下核心功能addPeriodicTimer

https://github.com/reactphp/stomp

干杯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM