this.checkValidWorkerChoiceStrategyOptions(
this.opts.workerChoiceStrategyOptions
)
+ this.opts.restartWorkerOnError = opts.restartWorkerOnError ?? true
this.opts.enableEvents = opts.enableEvents ?? true
this.opts.enableTasksQueue = opts.enableTasksQueue ?? false
if (this.opts.enableTasksQueue) {
worker: Worker,
message: MessageValue<Response>
): void {
- const workerNodeKey = this.getWorkerNodeKey(worker)
- const workerTasksUsage = this.workerNodes[workerNodeKey].tasksUsage
+ const workerTasksUsage =
+ this.workerNodes[this.getWorkerNodeKey(worker)].tasksUsage
--workerTasksUsage.running
++workerTasksUsage.run
if (message.error != null) {
++workerTasksUsage.error
}
+ this.updateRunTimeTasksUsage(workerTasksUsage, message)
+ this.updateWaitTimeTasksUsage(workerTasksUsage, message)
+ }
+
+ private updateRunTimeTasksUsage (
+ workerTasksUsage: TasksUsage,
+ message: MessageValue<Response>
+ ): void {
if (this.workerChoiceStrategyContext.getRequiredStatistics().runTime) {
workerTasksUsage.runTime += message.runTime ?? 0
if (
workerTasksUsage.medRunTime = median(workerTasksUsage.runTimeHistory)
}
}
+ }
+
+ private updateWaitTimeTasksUsage (
+ workerTasksUsage: TasksUsage,
+ message: MessageValue<Response>
+ ): void {
if (this.workerChoiceStrategyContext.getRequiredStatistics().waitTime) {
workerTasksUsage.waitTime += message.waitTime ?? 0
if (
worker.on('message', this.opts.messageHandler ?? EMPTY_FUNCTION)
worker.on('error', this.opts.errorHandler ?? EMPTY_FUNCTION)
+ worker.on('error', error => {
+ if (this.emitter != null) {
+ this.emitter.emit(PoolEvents.error, error)
+ }
+ })
+ if (this.opts.restartWorkerOnError === true) {
+ worker.on('error', () => {
+ this.createAndSetupWorker()
+ })
+ }
worker.on('online', this.opts.onlineHandler ?? EMPTY_FUNCTION)
worker.on('exit', this.opts.exitHandler ?? EMPTY_FUNCTION)
worker.once('exit', () => {
}
private checkAndEmitEvents (): void {
- if (this.opts.enableEvents === true) {
+ if (this.emitter != null) {
if (this.busy) {
this.emitter?.emit(PoolEvents.busy)
}
*/
private removeWorkerNode (worker: Worker): void {
const workerNodeKey = this.getWorkerNodeKey(worker)
- this.workerNodes.splice(workerNodeKey, 1)
- this.workerChoiceStrategyContext.remove(workerNodeKey)
+ if (workerNodeKey !== -1) {
+ this.workerNodes.splice(workerNodeKey, 1)
+ this.workerChoiceStrategyContext.remove(workerNodeKey)
+ }
}
private executeTask (workerNodeKey: number, task: Task<Data>): void {