自定义消息--发消息-如何对于同一个业务(消息内容里面包含业务字段)只更新此业务的消息内容(而不是新增一条消息)

serena279 2021-6-29 598

比如自定义一个用户审批的业务,消息类型type为1011,根据content 里的业务号contractid是否一致来判断是否同一个审批。

如果是同一个审批(包含多条发消息:第一条消息----提交审批申请;后续消息----审批中,审批通过/审批失败...)只更新 t__messages_xx_对应消息的content, 而不是新增一条消息。----也就是说同一个业务在消息表t__messages_xx_只对应一条消息只有一个messageId,返回结果也是同一个messageId。

发消息的参数:

{

"sender": "plswpwyx",

"conv": {

"type": 0,

"target": "rBr-r-xw"

},

"payload": {

"type": 1011,

"content": "{\"contractid\": \"186501000001\", \"appid\":\"112887840\",\"title\":\"哈哈哈哈\"}"

}

}

对于开源的野火IM,如果才能实现上述的功能,还请各位大神指点!!!

对于开源的野火IM,如果才能实现上述的功能,还请各位大神指点!!!

对于开源的野火IM,如果才能实现上述的功能,还请各位大神指点!!!

现在的思路:在消息表t__messages_xx_新增_contract_id用于存储自定义消息的业务id,通过查数据库来判断是否有相同业务的信息,如果有则更新,无则插入新消息。但是现在这种思路有问题:

1. 消息存储在t__messages_xx_每个月一个表,在判断比较_contract_id的时候如何判断去哪个表里查?

2. 发消息会初始化messagesId,也会插入新消息至t_user_messages_xx表,对于更新的消息是不应该更新t_user_messages_xx的。

最新回复 (6)
  • x86 2021-6-29
    引用 2
    在服务端去做比较麻烦,可以放到客户端去做:
    1. 自定义一中非存储类型(通过persistFlag控制)消息
    2. 收到该自定义消息的时候,去更新之前该消息对应的其他消息的状态。
  • HeavyRain 2021-6-30
    引用 3
    建议消息仅作为一个通知,不要依赖消息内的状态,可以在消息显示时去业务服务(审批服务)内获取当前审批的状态,获取完成后存储在本地
  • serena279 2021-6-30
    引用 4
    对于“收到该自定义消息的时候,去更新之前该消息对应的其他消息的状态。”
    我们是这么理解的:
    1. 需要定义两个自定义消息(这两个类型的自定义消息得有个关联字段):
        一个是UI显示类型—— 用于审批的首次创建(比如user提交审批申请)
        一个是UI不显示类型—— 审批的状态回复(比如审批者或者机器人的回复—审批中,审批通过,审批失败。。)
        客户端收到UI不显示类型的消息后,需要根据关联字段,找到UI显示类型的消息进行UI的更新。

    2. 如果这样的话, 我们需要考虑:这个UI不显示类型的消息, 前后端的交互机制, 
        1.1. 比如, 待审批人每次进入审批会话:
          a. 需要到后台拉取全部的UI不显示类型的消息? 因为他们审批是有不同人, 不同顺序的, 每个人审批通过或失败, 都需要产生这么一个UI不显示类型的消息
          b. 或者只拉取最后一个UI不显示类型的消息, 这个消息里带着所有之前审批的结果和状态信息
        1.2. 当待审批人一直在审批会话, 如果有审批人此时发送审批结果的UI不显示类型的消息, 需要前端在接收到UI不显示消息时, 能够根据关联字段, 找到对应的UI显示消息, 并更新UI字段

    这样理解对吗?
  • x86 2021-6-30
    引用 5
    HeavyRain 建议消息仅作为一个通知,不要依赖消息内的状态,可以在消息显示时去业务服务(审批服务)内获取当前审批的状态,获取完成后存储在本地
    对的,这样做更合理。

    消息只是用来通知,比如审批完成之后,发送审批完成通知。
    具体的审批状态,显示的时候,现场去审批服务拉取
  • serena279 2021-6-30
    引用 6
    x86 对的,这样做更合理。 消息只是用来通知,比如审批完成之后,发送审批完成通知。 具体的审批状态,显示的时候,现场去审批服务拉取
    如果显示的时候再去审批服务拉取的话,一个用户已经提交了多个审批(假设10个审批),每次一查看审批对话框的话,就需要拉取多次(比如10个审批拉取10次)来更新所有审批的状态。
    很多用户的话,这样去服务器拉取状态的频率是不是太高了。
  • HeavyRain 2021-7-1
    引用 7
    可以拉取完状态保存在本地,如果已经是已经完结状态就不需要再请求了,因为正在进行中的审批数总是有限的,所以不用担心频率太高
返回