记一次stf开发中通过reply发消息后前台收不到的情况

没有崩溃,通过如下代码发消息

router.on(wire.OpenMessage, function(channel, message) {
//收到前台websocket/index层发送的OpenMessage,后,通过reply发送TransactionDoneMessage,(TransactinService的作用,返回应答给前台)
      var reply = wireutil.reply(options.serial)

      push.send([
        channel
        , reply.okay('SUCCEEDED')//最终发送该完成标志
      ])
    })

可是, 前台收不到。

$scope.control.open()
.then(function(){
//没有打印log
})

所以就想在消息各流通点加上log查看:

  • 在process/index.js的TransactionDoneMessage和Websocket/index.js的TransactionDoneMessage接收的地方打log,发现processor [proc002] 接收到了消息
2020-11-19 17:32:02 INF/processor 14841 [proc002] TransactionDoneMessage channel tx.6b525540-77e1-41df-8709-c8cbca667dad message .TransactionDoneMessage data

然后websocket/index.js没有打印。

对比其他正常的功能应答,发现能正常应答的 processor是proc001进程,这很关键,关键,关键。

2020-11-19 17:28:55 INF/processor 14840 [proc001] TransactionDoneMessage channel tx.617edde6-49e5-497b-a833-7092490eb8bd message .TransactionDoneMessage data&
JTK5T19917028084 localhost:7401
2020-11-19 17:28:55 INF/websocket 14848 [*] TransactionDoneMessage channel tx.617edde6-49e5-497b-a833-7092490eb8bd message .TransactionDoneMessage

再在router.js里面Router.prototype.handler解析protobuf(wire.Envelop) 获取消息type, channel的地方打印log。
结果正常应答的点都是router [proc001] 24 , 然后router [*] 24。 24是TransactionDoneMessage的枚举值。
而到我的OpenMessage里reply则只有router [proc002] 24。 说明我的应答消息就没法正常中转。

问题应该就是出在 Websocket/index.js, 因为process能收到。

然后发现:

.on('open', function(channel, responseChannel) {
          //我怎么手滑漏了这句代码: joinChannel(responseChannel)
          
          push.send([
            channel
            , wireutil.transaction(
              responseChannel
              , new wire.OpenMessage('test')
            )
          ])
        })

接着,就研究起来了 joinChannel(responseChannel)是怎么个意思、

function joinChannel(channel) {
      channels.push(channel)
      channelRouter.on(channel, messageListener)
      sub.subscribe(channel)
    }

sub.subscribe(channel) 没有这个,肯定是不行的。不经过zmq的订阅,所以消息肯定不能跨进程收到,这也就是为什么我的应答是[proc002],而正常的是[proc001]。
channelRouter.on(channel, messageListener)这行貌似也很有用,因为messageListener对应下面的wirerouter.on(wire.TransactionDoneMessage)呢,在这里有socket.emit所以能返给前台。那channelRouter和sub之间应该有联系。

追踪websocket/index.js里sub的代码

//sub初始化
var sub = zmqutil.socket('sub')
  Promise.map(options.endpoints.sub, function(endpoint) {
    return srv.resolve(endpoint).then(function(records) {
      return srv.attempt(records, function(record) {
        log.info('Receiving input from "%s"', record.url)
        sub.connect(record.url)
        return Promise.resolve(true)
      })
    })
  })
    .catch(function(err) {
      log.fatal('Unable to connect to sub endpoint', err)
      lifecycle.fatal()
    })

  // Establish always-on channels
  ;[wireutil.global].forEach(function(channel) {
    log.info('Subscribing to permanent channel "%s"', channel)
    sub.subscribe(channel)
  })
//sub接收消息,嗯就是这里,
  sub.on('message', function(channel, data) {
    channelRouter.emit(channel.toString(), channel, data)
  })

sub.on 接收到message后, 通过channelRouter.emit发表,而上面的joinChannel函数里channelRouter.on再接收,再传给wireRouter。 一切豁然开朗!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值