| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- using Application.Abstractions.Cache;
- using Application.Abstractions.Chat;
- using Application.Abstractions.Hub;
- using Infrastructure.Hubs;
- using Microsoft.AspNetCore.SignalR;
- using StackExchange.Redis;
- using Web.Api.Hubs;
- namespace Web.Api.Services;
- public sealed class KickSubscriberService(
- IConnectionMultiplexer redis,
- IHubContext<ChatHub, IChatHubClient> hubContext,
- IHubContext<AppHub, IAppHubClient> appHubContext
- ) : IHostedService
- {
- public async Task StartAsync(CancellationToken cancellationToken)
- {
- await redis.GetSubscriber().SubscribeAsync(
- RedisChannel.Literal(CacheKeys.ChatKickChannel),
- async (_, connectionId) =>
- {
- if (!connectionId.IsNullOrEmpty)
- await hubContext.Clients.Client(connectionId!).Kick();
- });
- // AppHub 전역 접속자 강제 종료 (Admin 현재 접속자 페이지)
- await redis.GetSubscriber().SubscribeAsync(
- RedisChannel.Literal(CacheKeys.AppKickChannel),
- async (_, connectionId) =>
- {
- if (!connectionId.IsNullOrEmpty)
- await appHubContext.Clients.Client(connectionId!).Kick();
- });
- }
- public async Task StopAsync(CancellationToken cancellationToken)
- {
- await redis.GetSubscriber().UnsubscribeAsync(
- RedisChannel.Literal(CacheKeys.ChatKickChannel));
- await redis.GetSubscriber().UnsubscribeAsync(
- RedisChannel.Literal(CacheKeys.AppKickChannel));
- }
- }
|