Example #1
0
        public async Task Add(SQueue queue, SMessage message)
        {
            if (queue.IsDead)
            {
                throw new Exception(string.Format("SQueue {0}.{1} isdead, can't be used in SMessageStoreForSQLDB.Add", queue.GroupName, queue.Name));
            }

            //根据存储类型和服务器名称获取连接字符串
            var strConn = _messageQueueConnectionFactory.CreateAllForMessageQueue(queue.StoreType, queue.ServerName);
            await DBTransactionHelper.SqlTransactionWorkAsync(DBTypes.SqlServer, false, false, strConn, async (conn, transaction) =>
            {
                SqlTransaction sqlTran = null;
                if (transaction != null)
                {
                    sqlTran = (SqlTransaction)transaction;
                }

                await using (SqlCommand commond = new SqlCommand()
                {
                    Connection = (SqlConnection)conn,
                    CommandType = CommandType.Text,
                    Transaction = sqlTran
                })
                {
                    //Queue.Name为要存储消息的表名称

                    if (message.ID == Guid.Empty)
                    {
                        commond.CommandText = string.Format(@"insert into {0}([id],[key],[type],[data],[typelistenerid],[originalmessageid],[delaymessageid],[extensionmessage],[createtime],[expectationexecutetime],[lastexecutetime],[retrynumber],[exceptionmessage],[isdead])
                                    values(default,@key,@type,@data,@typelistenerid,@originalmessageid,@delaymessageid,@extensionmessage,getutcdate(),@expectationexecutetime,null,0,null,0);
                                    select @newid=[id] from {0} where [sequence]=SCOPE_IDENTITY()", queue.Name);
                    }
                    else
                    {
                        commond.CommandText = string.Format(@"insert into {0}([id],[key],[type],[data],[typelistenerid],[originalmessageid],[delaymessageid],[extensionmessage],[createtime],[expectationexecutetime],[lastexecutetime],[retrynumber],[exceptionmessage],[isdead])
                                    values(@id,@key,@type,@data,@typelistenerid,@originalmessageid,@delaymessageid,@extensionmessage,getutcdate(),@expectationexecutetime,null,0,null,0)", queue.Name);
                    }

                    SqlParameter parameter;
                    if (message.ID != Guid.Empty)
                    {
                        parameter = new SqlParameter("@id", SqlDbType.UniqueIdentifier)
                        {
                            Value = message.ID
                        };
                        commond.Parameters.Add(parameter);
                    }
                    else
                    {
                        parameter = new SqlParameter("@newid", SqlDbType.UniqueIdentifier)
                        {
                            Direction = ParameterDirection.Output
                        };
                        commond.Parameters.Add(parameter);
                    }

                    parameter = new SqlParameter("@key", SqlDbType.VarChar, 150)
                    {
                        Value = message.Key
                    };
                    commond.Parameters.Add(parameter);

                    parameter = new SqlParameter("@type", SqlDbType.VarChar, 150)
                    {
                        Value = message.Type
                    };
                    commond.Parameters.Add(parameter);

                    parameter = new SqlParameter("@data", SqlDbType.NVarChar, message.Data.Length)
                    {
                        Value = message.Data
                    };
                    commond.Parameters.Add(parameter);

                    if (message.TypeListenerID.HasValue)
                    {
                        parameter = new SqlParameter("@typelistenerid", SqlDbType.UniqueIdentifier)
                        {
                            Value = message.TypeListenerID
                        };
                    }
                    else
                    {
                        parameter = new SqlParameter("@typelistenerid", SqlDbType.UniqueIdentifier)
                        {
                            Value = DBNull.Value
                        };
                    }
                    commond.Parameters.Add(parameter);


                    if (message.OriginalMessageID.HasValue)
                    {
                        parameter = new SqlParameter("@originalmessageid", SqlDbType.UniqueIdentifier)
                        {
                            Value = message.OriginalMessageID
                        };
                    }
                    else
                    {
                        parameter = new SqlParameter("@originalmessageid", SqlDbType.UniqueIdentifier)
                        {
                            Value = DBNull.Value
                        };
                    }
                    commond.Parameters.Add(parameter);

                    if (message.DelayMessageID.HasValue)
                    {
                        parameter = new SqlParameter("@delaymessageid", SqlDbType.UniqueIdentifier)
                        {
                            Value = message.DelayMessageID
                        };
                    }
                    else
                    {
                        parameter = new SqlParameter("@delaymessageid", SqlDbType.UniqueIdentifier)
                        {
                            Value = DBNull.Value
                        };
                    }
                    commond.Parameters.Add(parameter);



                    if (message.ExtensionMessage != null)
                    {
                        parameter = new SqlParameter("@extensionmessage", SqlDbType.NVarChar, message.ExtensionMessage.Length)
                        {
                            Value = message.ExtensionMessage
                        };
                    }
                    else
                    {
                        parameter = new SqlParameter("@extensionmessage", SqlDbType.NVarChar, 10)
                        {
                            Value = DBNull.Value
                        };
                    }
                    commond.Parameters.Add(parameter);



                    parameter = new SqlParameter("@expectationexecutetime", SqlDbType.DateTime)
                    {
                        Value = message.ExpectationExecuteTime
                    };
                    commond.Parameters.Add(parameter);

                    await commond.PrepareAsync();

                    await commond.ExecuteNonQueryAsync();

                    if (message.ID == Guid.Empty)
                    {
                        message.ID = (Guid)commond.Parameters["@newid"].Value;
                    }
                }
            });
        }