websocket消息处理子程序应能使用子程序内的子程序

功能建议 · 2634 次浏览
浅沧 创建于 2024-09-05 10:43

目前使用websocket模块连接到websocket服务时只能指定动作的直接子程序。

我将websocket连接,发送消息等步骤弄成了一个公共子程序以便复用,然后在公共子程序内定义了一个消息处理子程序sub,在连接到websocket时指定了使用sub,但是运行动作后sub并没有并调用。

从自己复用以及分享子程序的角度看,将消息处理子程序打包在websocket子程序内是合理的,希望能增加这个功能。

浅沧 最后更新于 2024/9/5

回复内容
CL 2024-09-05 10:48
#1

调用报错了么?看下quicker.log里有没有相关的记录。

浅沧 回复 CL 2024-09-05 15:24 :

2024-09-05 15:22:56,309 [action:思源笔记websocket] INFO Quicker.Domain.AppServer - 执行动作:思源笔记websocket id=002bc84f-2cfb-4686-bdb9-15dd76640613

2024-09-05 15:22:56,323 [53] WARN RuWb3AbQCUrwpLLrAby.W06BVybaWpt1NXQUBRp - 处理Websocket消息出错:无法找到子程序:onmessage

System.InvalidOperationException: 无法找到子程序:onmessage

   在 Quicker.Domain.Actions.X.SubPrograms.SubProgramHelper.<RunStandaloneSubprogram>d__18.MoveNext()

--- 引发异常的上一位置中堆栈跟踪的末尾 ---

   在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   在 Quicker.Domain.Actions.ActionExecuteContext.RunSp(String spName, IDictionary`2 inputParams)

   在 Quicker.Domain.AppServer.ExecuteActionSubProgram(String actionIdOrNameOrTempplateId, String spName, IDictionary`2 inputParams, ActionExtraContextData actionExtraContextData, Nullable`1 cts)

   在 RuWb3AbQCUrwpLLrAby.W06BVybaWpt1NXQUBRp.XUcZFYotCs(Object  , MessageEventArgs  )


CL 回复 浅沧 2024-09-05 16:03 :

这个是不支持的,需要是主程序自身的子程序。可以在这个子程序里调用公共子程序。

浅沧 回复 CL 2024-09-05 16:39 :

消息处理和主程序是独立运行的,我觉得不必要把消息处理程序限定在主程序的子程序吧,公共子程序的子程序应该也行啊,只要调用的时候能找到不就好了吗。公共子程序和动作勉强可以说是平级吧~

CL 回复 浅沧 2024-09-05 16:46 :

这是由设计决定的,在定义回调的时候,得到的是动作id和子程序标识,所以当有消息的时候,只能找到动作和动作里的子程序,找不到共享子程序。所以,可以把主要逻辑封装到共享子程序里,然后在动作的子程序里调用这个共享的子程序。

浅沧 回复 CL 2024-09-05 17:21 :

我自用是够了,就是不好分享为子程序了,需要用户再手动定义一个子程序,相对麻烦一点

wilsons 回复 浅沧 4天9小时前 :

我也遇到了这个问题,我还遇到一个问题,就是回调子程序里的返回结果无法传递给主程序,子程序和主程序之间也无法通过全局变量传递数据,我目前只能通过剪切板来交互,请教下你是如何解决这个问题的?

这是我的演示动作 https://getquicker.net/Sharedaction?code=325829b7-7011-47b8-1221-08dd062f9162&fromMyShare=true

我是想实现quicker向思源发送js代码并返回执行结果时遇到的问题,所以我目前暂时放弃websocket互发方案,使用http请求方案代替 https://getquicker.net/SubProgram?id=cb322876-e4a3-462a-e322-08dd0733f195

wilsons 最后更新于 4天9小时前
浅沧 回复 wilsons 4天7小时前 :

子程序收到消息后写入全局变量,主程序在运行子程序后要等待一段时间,要等异步的子程序写入全局变量后再读取,这个等待时间设置为多少只能自己测试了。

wilsons 回复 浅沧 4天7小时前 :

感谢大佬! 学习了!

quicker里好像没有全局变量和变量作用域的教程,我这样理解对吗?读写动作状态可以认为是动作内的全局变量;读写全局状态可以认为是跨动作的全局变量。

如图

关于等待时间,我一般用重复n次,每100毫秒检查下,找到就立刻跳出循环,这样通常比设置固定时间快速和可靠些。

wilsons 最后更新于 4天7小时前
浅沧 回复 wilsons 4天7小时前 :

截图里的全局状态时跨动作的。动作内的状态变量我不是很确定子程序异步修改后动作是否能立马获取到。

wilsons 回复 浅沧 4天5小时前 :

感谢大佬!

我测试了,用读写动作状态也可以主子共享数据的。

不过还有两个小问题:

1. quicker里websocket链接服务器不知道怎么加头信息,所以如果用户设置了授权码,就无法认证,我把token加到websocket连接的url中及使用cookie虽然能实现认证,总感觉别扭,cooke用户不好获取,放URL总感觉怪怪的,不知quicker webscoket连接怎么设置header?

2. quicker里关闭websocket连接,竟然花了5s多,不知道在干什么?quicker bug?这个一定要警惕,之前这个步骤放前面总感觉有延迟,后来才发现是这个问题。

演示地址:https://getquicker.net/Sharedaction?code=325829b7-7011-47b8-1221-08dd062f9162

wilsons 最后更新于 4天5小时前
浅沧 回复 wilsons 4天5小时前 :

请求头可以参考:思源API(子程序) - 子程序信息 - Quicker

你为啥要关闭连接?一直连着就好了。

wilsons 回复 浅沧 4天4小时前 :

不显式关闭连接,在动作退出后,思源这边显示连接数还在

不过,我如果使用相同的channel再次监听也没啥影响,而且连接数还是1,说明上一个客户端退出了,但不清楚思源这边为什么还在,可能非主动退出,服务器感知不到,需要超时后才消失吧,但主动退出立即显示0,这点后面再观察下。

感谢提供的Api,http请求,加头信息这样是可以的,但websocket不行,下面是对比图

【http请求】


【webscoket连接】


wilsons 最后更新于 4天4小时前
浅沧 回复 wilsons 4天1小时前 :

你已经在ws链接里附加token这个参数了,这样就行了。注意token是全小写,你现在这个地址是OK的

wilsons 回复 浅沧 4天1小时前 :

是的,连接关闭问题可以放到最后,影响不大;token放链接里也能用,所以说这两个是小问题。

回复主贴