我正在使用 nestjs 并想设置一个工作流程:
http websocket
External----------Server----------Clients
| event | |
|===============>| |
| | event |
| |===============>|
我已经使用示例repo中的代码设置了nestjs 网关,并准备了一个发送给所有客户端的方法。WsAdapter
broadcast
@WebSocketGateway({
transports: ['websocket'],
path: '/websocket',
})
export class AppGateway {
@WebSocketServer()
server: Server;
protected logger: Logger = new Logger('AppGateway');
handleConnection(): void {
this.logger.debug('handleConnection');
}
handleDisconnect(): void {
this.logger.debug('handleDisconnect');
}
async broadcast(data: any): Promise<void> {
this.logger.debug('broadcast', JSON.stringify(data));
this.server.clients.forEach((client) => client.send(JSON.stringify(data)));
}
}
我有一个广播控制器供外部服务调用POST http://myserver/api/broadcast
。
@Controller('broadcast')
export class BroadcastController {
logger: Logger = new Logger('BroadcastController');
constructor(private broadcastService: BroadcastService) {}
@Post()
async doBroadcast(@Req() request: Request): Promise<void> {
this.logger.debug('doBroadcast', request.body);
try {
await this.broadcastService.enqueue(JSON.stringify(request.body));
} catch (error) {
this.logger.error(error);
}
}
}
我有一个队列来BroadcastService
排队广播事件。
@Injectable()
export class BroadcastService {
protected logger: Logger = new Logger('BroadcastService');
constructor(
@Inject(CACHE_MANAGER) private cache: Cache,
@InjectQueue('broadcast') private queue: Queue,
) {}
async enqueue(data: string): Promise<void> {
this.queue.add('broadcast', data, {});
}
}
如何让网关从broadcast
队列和调用broadcast
方法中获取项目?
到目前为止,我只看到了这样的示例,即在@SubscribeMessage('xxx')
从任何客户端(通过)接收到消息后,服务器将消息广播给所有客户端。但现在触发器是队列消息。