// TODO 어떻게 async 하게? public Task Publish(T message) { try { using var connection = _connectionProvider.CreateConnection(); using var channel = connection.CreateModel(); var exchangeName = NamingRule.PubSubExchangeNameOf<T>(); channel.ExchangeDeclare(exchangeName, ExchangeType.Fanout, durable: false, autoDelete: false, null); var messageType = typeof(T).AssemblyQualifiedName; var props = channel.CreateBasicProperties(); // props.AppId = "MireroTicket"; props.ContentEncoding = "utf8"; props.ContentType = "application/json"; props.Headers = new Dictionary<string, object> { ["message_type"] = messageType, }; var json = JsonSerializer.Serialize(message); var body = Encoding.UTF8.GetBytes(json); channel.BasicPublish(exchangeName, "", props, body); return Task.CompletedTask; } catch (Exception e) { throw new ServiceBusException($"Failed in Publish Message(Type={typeof(T).FullName}", e); } }
public void Start() { if (_connection != null || _channel != null) { Console.WriteLine("Consumer Already Started."); return; } _connection = _connectionProvider.CreateConnection(); _channel = _connection.CreateModel(); var exchangeName = NamingRule.PubSubExchangeNameOf <T>(); _channel.ExchangeDeclare(exchangeName, ExchangeType.Fanout); var queueName = _channel.QueueDeclare().QueueName; _channel.QueueBind(queueName, exchangeName, ""); _consumer = new EventingBasicConsumer(_channel); _consumer.Received += ConsumerOnReceived; _channel.BasicConsume(queue: queueName, autoAck: true, consumer: _consumer); }