// 默认发送消息,不知道消息是否正确到达Broker代理服务器 private void SendMessage(RabbitMQConnectionDTO mqConnection, string exchangeName, string queueName, string routingKey, EnumRabbitExchangeType exchangeType, string message) { try { ConnectionFactory rabbitMqFactory = new ConnectionFactory() { HostName = mqConnection.HostName, UserName = mqConnection.UserName, Password = mqConnection.Password, Port = mqConnection.Port }; using (IConnection conn = rabbitMqFactory.CreateConnection()) { using (IModel channel = conn.CreateModel()) { //channel.ExchangeDeclare(exchangeName, exchangeType.ToString(), durable: true, autoDelete: false, arguments: null); //channel.QueueDeclare(queueName, durable: false, autoDelete: false, exclusive: false, arguments: null); // 必须执行QueueBind 需要将routingKey与队列和交换机进行绑定 channel.QueueBind(queueName, exchangeName, routingKey); var properties = channel.CreateBasicProperties(); properties.Persistent = false; // 设置消息持久化属性为true byte[] messagebuffer = Encoding.UTF8.GetBytes(message); channel.BasicPublish(exchangeName, routingKey, properties, messagebuffer); Rtx_Receive.Text = Rtx_Receive.Text + $"\r 发送时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}"; } } } catch (Exception ex) { MessageBox.Show($"发送消息失败!{ex.Message}"); } }
// 采取RabbitMQ事务方式传输消息 private void SendMessageByTransaction(RabbitMQConnectionDTO mqConnection, string exchangeName, string queueName, string routingKey, EnumRabbitExchangeType exchangeType, string message) { try { ConnectionFactory rabbitMqFactory = new ConnectionFactory() { HostName = mqConnection.HostName, UserName = mqConnection.UserName, Password = mqConnection.Password, Port = mqConnection.Port }; using (IConnection conn = rabbitMqFactory.CreateConnection()) { using (IModel channel = conn.CreateModel()) { channel.ExchangeDeclare(exchangeName, exchangeType.ToString(), durable: true, autoDelete: false, arguments: null); channel.QueueDeclare(queueName, durable: false, autoDelete: false, exclusive: false, arguments: null); // 必须执行QueueBind 需要将routingKey与队列和交换机进行绑定 否则就算事务提交了队列也不会有数据~ channel.QueueBind(queueName, exchangeName, routingKey); byte[] messagebuffer = Encoding.UTF8.GetBytes(message); try { channel.TxSelect(); channel.BasicPublish(exchangeName, routingKey, null, messagebuffer); //if (1 == 1) throw new Exception("没错!我是故意抛出异常的!看看最终队列是否写入了消息~"); channel.TxCommit(); } catch (Exception ex) { Rtx_Receive.Text = Rtx_Receive.Text + $"\r 异常产生时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")},异常信息:{ex.Message}"; channel.TxRollback(); // TODO 进行补发OR其他逻辑处理 } Rtx_Receive.Text = Rtx_Receive.Text + $"\r 发送时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}"; } } } catch (Exception ex) { MessageBox.Show($"发送消息失败!{ex.Message}"); } }
// 采取确认机制方式传输消息 private void SendMessageByAck(RabbitMQConnectionDTO mqConnection, string exchangeName, string queueName, string routingKey, EnumRabbitExchangeType exchangeType, string message) { try { ConnectionFactory rabbitMqFactory = new ConnectionFactory() { HostName = mqConnection.HostName, UserName = mqConnection.UserName, Password = mqConnection.Password, Port = mqConnection.Port }; using (IConnection conn = rabbitMqFactory.CreateConnection()) { using (IModel channel = conn.CreateModel()) { channel.ExchangeDeclare(exchangeName, exchangeType.ToString(), durable: false, autoDelete: false, arguments: null); channel.QueueDeclare(queueName, durable: false, autoDelete: false, exclusive: false, arguments: null); // 必须执行QueueBind 需要将routingKey与队列和交换机进行绑定 否则就算事务提交了队列也不会有数据~ channel.QueueBind(queueName, exchangeName, routingKey); byte[] messagebuffer = Encoding.UTF8.GetBytes(message); channel.ConfirmSelect(); // 启用服务器确认机制方式 channel.BasicPublish(exchangeName, routingKey, null, messagebuffer); if (channel.WaitForConfirms()) { Rtx_Receive.Text = Rtx_Receive.Text + $"\r 消息发送成功! 发送时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}"; } } } } catch (Exception ex) { MessageBox.Show($"发送消息失败!{ex.Message}"); } }