<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>CoPilot开发指南 :: NJET文档</title>
    <link>https://docs.njet.org.cn/docs/v4.0.1/development/copilot/index.html</link>
    <description>CoPilot开发指南 1. CoPilot概述 OpenNJet是一个多进程的程序，有一个Master进程和多个Worker进程，另外还可以创建多个CoPilot进程。CoPilot在Master-Workers进程架构的基础之上进行了扩展，提升了OpenNJet的控制管理和提供服务的能力。比如，可以用CoPilot运行一个Controller，对外提供访问控制；还可以用CoPilot运行一个Broker，作为一个消息中间件。这是两种典型的用法，但并不是全部，受限的是必须遵守CoPilot插件开发规范，而不是CoPilot提供的功能和服务。&#xA;Master进程创建了CoPilot进程，并在NJET的整个生命周期过程中管理着CoPilot进程，在根据控制信号停止（-s stop 或 -s quit）OpenNJet时，会停止CoPilot进程；在重新加载配置（-s reload）时，是否停止并创建新的CoPilot进程，是由这个CoPilot进程的so决定，这一点在CoPilot插件规范有描述；在CoPilot进程因为意外挂掉时，会及时创建新的CoPilot进程。&#xA;2. CoPilot配置 CoPilot的配置，是在主配置文件中使用helper指令。&#xA;指令说明：&#xA;Syntax helper tag so_file conf_file; Default — Context main 参数说明：&#xA;参数名称 是否必须 参数说明 tag 是 指定一个名字标签 so_file 是 so文件 conf_file 是 配置文件 下面为示例配置：&#xA;helper ctrl modules/njt_helper_ctrl_module.so conf/njet_ctrl.conf; helper broker modules/njt_helper_broker_module.so conf/mqtt.conf; helper ha modules/njt_helper_ha_module.so conf/vrrp.conf; 3.CoPilot插件规范 CoPilot插件的形式是一个so文件，需实现以下接口：&#xA;1）unsigned int njt_helper_check_version(void) 注：当前版本号是 1 #define NJT_HELPER_VER 1 2）void njt_helper_run(helper_param param) 注：helper_param是一个struct类型，定义如下 typedef struct { njt_str_t conf_fn; njt_str_t conf_fullfn; helper_check_cmd_fp check_cmd_fp; void *ctx; void *cycle;//njt_cycle_t *cycle; } helper_param; typedef void (*njt_helper_run_fp)(helper_param param); 在njt_helper_run的事件循环中，需调用param.check_cmd_fp()接收命令 例如： unsigned int cmd; cmd = param.check_cmd_fp(param.ctx); 命令宏定义如下： #define NJT_HELPER_CMD_NO 0 #define NJT_HELPER_CMD_STOP 1 #define NJT_HELPER_CMD_RESTART 2 接收到命令后，需进行命令处理。 NJT_HELPER_CMD_STOP命令，要进行停止操作； NJT_HELPER_CMD_RESTART 为预留命令，暂不会发送该命令，在事件处理中可以按停止操作处理该命令，或者执行自身业务逻辑的重新开始。 3）unsigned int njt_helper_ignore_reload(void) 返回1，表示该so的copilot进程，不会在reload的时候重启。 放回0，表示该so的copilot进程，会在reload的时候重启。 注1：so可以不实现该接口。若不实现，则等同于返回0。 注2：如果so实现该接口并且返回1，那么在reload的时候该so的copilot进程不会重启，但是有一点需要注意：reload的时候配置文件中需保留原helper指令，这是配置上的强制要求，不满足此要求会导致reload失败。 4.开发实例 开发一个demo的CoPilot插件，与开发一个module相比，有一些相似的地方，比如config文件的编写，也存在不同的地方，比如CoPilot插件不需要提像module那样实现njt_module_t中的commands和ctx等，而是需要按照CoPilot插件规范进行实现。下面的CoPilot实例，提供了参考。</description>
    <generator>Hugo</generator>
    <language>zh</language>
    <lastBuildDate>Tue, 26 Aug 2025 10:48:54 +0800</lastBuildDate>
    <atom:link href="https://docs.njet.org.cn/docs/v4.0.1/development/copilot/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>golang CoPilot开发</title>
      <link>https://docs.njet.org.cn/docs/v4.0.1/development/copilot/go-copilot/index.html</link>
      <pubDate>Tue, 26 Aug 2025 10:48:54 +0800</pubDate>
      <guid>https://docs.njet.org.cn/docs/v4.0.1/development/copilot/go-copilot/index.html</guid>
      <description>调用其他语言编写的CoPilot go-copilot开发 在NJET中需要启动Go 开发的外部二进制程序时，可以通过加载NJET提供的 njt_helper_go_copilot_module 模块，并指定外部go二进制程序使用的配置文件。&#xA;njt_helper_go_copilot_module 将解析Toml格式文件，并获取配置文件中设置的可执行文件路径，如果是相对路径，将添加$NJT_PREFIX 前缀，该前缀通过启动NJET 时使用 -p 方式传入，默认值是编译时传入的 –prefix, rpm/deb安装时该路径是 /usr/local/njet。&#xA;njt_helper_go_copilot_module 获取到文件路径后，将通过 njt_execute 启动并执行对应的外部文件。&#xA;通过ps 查看时，将看到copilot 进程是启动的go 外部程序的父进程。&#xA;Go copilot 配置文件中如果可执行文件名没有配置， 将不启动对应的go copilot, 且不会重试，需要提供正确配置后再重启NJET。&#xA;NJET配置 使用 helper 指令加载NJET 提供的 njt_helper_go_copilot_module 模块，并提供配置文件，例如：&#xA;helper goProgName /usr/local/njet/modules/njt_helper_go_copilot_module.so conf/go_prog_config.toml; Go copilot 规范 命令行参数 需要能够解析以下两个参数&#xA;-p prefix （NJET 实例的 prefix 路径）&#xA;-c full_conf_name （完整路径的配置文件名）&#xA;配置文件 配置文件使用TOML格式，Toml 中需要有 copilot 配置项:&#xA;copilotType copilot 类型，控制面提供的配置修改api 将根据这个字段用对应的lua 逻辑进行处理</description>
    </item>
  </channel>
</rss>