没有崩溃,通过如下代码发消息
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。 一切豁然开朗!!!