订阅发布变速器
概念
在许多场景中,我们需要控制发布频率。例如,一个 UI 界面不能过快的接收处理信息,而此时发布者的发布频率又非常快。在这种场景下,我们需要改变发布的频率。
使用 VSOA Regulator 可以解决这个问题,它既可以使用在服务端,也可以使用在客户端。
例程
我们在原 axis 试验客户端程序基础上进行修改,原发布频率是每秒一次,我们使用变速器改为 5 秒一次。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/select.h>
#include "vsoa_client.h"
#include "vsoa_cliauto.h"
#include "vsoa_regulator.h"
#define MY_SERVER_PASSWD "123456"
static vsoa_regulator_t* regulator;
static void onmessage (void *arg, struct vsoa_client *client, vsoa_url_t *url, vsoa_payload_t *payload, bool quick)
{
printf("subscribe message, url:%.*s, quick:%s\n",
(int)url->url_len, url->url,
quick ? "ture":"false");
printf("subscribe message, param:%.*s, data:%.*s\n",
(int)payload->param_len, payload->param,
(int)payload->data_len, (char *)payload->data);
vsoa_regulator_update(regulator, url, payload);
}
static void slow_onmessage (void *arg, vsoa_url_t *url, vsoa_payload_t *payload)
{
printf("slow subscribe message, url:%.*s\n",
(int)url->url_len, url->url);
printf("slow subscribe message, param:%.*s, data:%.*s\n",
(int)payload->param_len, payload->param,
(int)payload->data_len, (char *)payload->data);
}
int main (int argc, char **argv)
{
vsoa_client_auto_t *cliauto;
static char *sub_urls[] = { "/axis" };
struct timespec period = { 5, 0 };
vsoa_url_t url;
/*
* 创建并注册发布订阅变速器,每5秒处理器一次订阅
*/
regulator = vsoa_regulator_create(&period);
url.url = "/axis";
url.url_len = strlen(url.url);
vsoa_regulator_slot(regulator, &url, slow_onmessage, NULL, 1024);
/*
* 创建客户端机器人
*/
cliauto = vsoa_client_auto_create(onmessage, NULL);
vsoa_client_auto_consistent(cliauto, sub_urls, 1, 1000);
/*
* 启动客户端机器人127.0.0.1:4001 vsoa://axis_server
*/
vsoa_client_auto_start(cliauto, "vsoa://axis_server", MY_SERVER_PASSWD, sub_urls, 1, 1000, 1000, 1000);
while (true) {
sleep(1);
}
}
运行效果
服务端运行效果:
客户端运行效果:
可以看到每 5 次正常订阅处理就会有一次降速处理。如果实际项目不需要正常处理,只需要去掉正常处理回调的业务程序即可,但要保留vsoa_regulator_update 函数调用。