Ejemplo n.º 1
0
        // 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);
            }
        }
Ejemplo n.º 2
0
        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);
        }