环境信息
- EMQX 版本:4.4.4
- 操作系统及版本:rocky linux 8
- 其他
问题描述
emqx 4.4.4使用epmd启动,在本地执行 emqx_broker:subscribe(Topic),在ets表emqx_broker:subscribe可以看到记录
开启另一个shell通过empd连上emqx后执行rpc,可以看到执行成功,但是ets表没有该条记录,而且打印日志能看到其实所有的执行是正常的
如果想让系统给远端node的进程发topic message,请问应该如何操作
配置文件及日志
常规配置,没有做定制
可以看下 emqx_broker_helper 的代码,它会 monitor 订阅进程,当订阅进程挂了就会替他取消订阅关系。
你可以检查下 rpc:call/4 是否是启动的一个临时进程去订阅的
我打印了,RPC call本身确实启动的是一个临时进程,但是除了这个方式,有其他方法可以实现我的目的吗?
按我理解是需要给 “远端节点的客户端/连接添加一个订阅”? 如果理解没错的话你可以直接调用 HTTP-API
它的实现其实就是 ClientPid ! {subscribe, TopicFilter}
,具体的参数类型可以看 emqx_channel.erl:handle_info/2 这个方法的处理
不是客户端,实际情况是我另一个erlang node,用的empd连接了emqx4.4.4,需要订阅一些主题消息,但是想通过原生erlang的 send 函数来发,我目前看源码应该是给emqx_subscription的ets表里的pid发消息,但是对于我这个情况有没有可以直接调用的原生函数,可以直接将另一个远程node的pid注册进去
直接起一个进程,在里面执行 emqx_broker:subscribe/x
来订阅你想要的主题。不用 rpc 的
我另起的erlang node不是emqx,只是一个普通的application,本身是没有emqx_broker:subscribe函数的,这个是无法执行的
那改下 emqx_broker.erl 的 subscribe 函数就好了,把 SubPid 做成参数