(1)新增一个控制台项目,作为我们的Payment Service RPC Server,并引用Contracts类库项目
(2)引入thrift-netcore包:
NuGet>Install-Package apache-thrift-netcore
(3)加入一个新增的PaymentService实现类
public class PaymentServiceImpl : Manulife.DNC.MSAD.Contracts.PaymentService.Iface
{
public TrxnResult Save(TrxnRecord trxn)
{
// some business logic here
//Thread.Sleep(1000 * 1);
Console.WriteLine("Log : TrxnName:{0}, TrxnAmount:{1}, Remark:{2}", trxn.TrxnName, trxn.TrxnAmount, trxn.Remark);
return TrxnResult.SUCCESS;
}
}
这里输出日志仅仅是为了测试。
(4)编写启动RPC Server的主程序
public class Program
{
private const int port = 8885;
public static void Main(string[] args)
{
Console.WriteLine("[Welcome] PaymentService RPC Server is lanuched...");
TServerTransport transport = new TServerSocket(port);
var processor = new Manulife.DNC.MSAD.Contracts.PaymentService.Processor(new PaymentServiceImpl());
TServer server = new TThreadedServer(processor, transport);
// lanuch
server.Serve();
}
}
(5)如果是多个服务实现的话,也可以如下这样启动:
public static void Main(string[] args)
{
Console.WriteLine("[Welcome] PaymentService RPC Server is lanuched...");
TServerTransport transport = new TServerSocket(port);
var processor1 = new Manulife.DNC.MSAD.Contracts.PaymentService.Processor(new PaymentServiceImpl());
var processor2 = new Manulife.DNC.MSAD.Contracts.PayoutService.Processor(new PayoutServiceImpl());
var processorMulti = new Thrift.Protocol.TMultiplexedProcessor();
processorMulti.RegisterProcessor("Service1", processor1);
processorMulti.RegisterProcessor("Service2", processor2);
TServer server = new TThreadedServer(processorMulti, transport);
// lanuch
server.Serve();
}
WHEN ic1.IndexInclude IS NULL THEN ic1.IndexColumns
ELSE ic1.IndexColumns + ' INCLUDE ' + ic1.IndexInclude
END AS IndexCols ,
ic1.index_id
FROM IndexColumns ic1
JOIN IndexColumns ic2 ON ic1.object_id = ic2.object_id
AND ic1.index_id < ic2.index_id
AND ic1.IndexColumns = ic2.IndexColumns
AND ( ISNULL(ic1.IndexInclude, '') = ISNULL(ic2.IndexInclude,
'')
OR ic1.index_id = 1
)
)
SELECT SchemaName ,
TableName ,
IndexName ,
DuplicateIndexName ,
IndexType,
IndexCols ,
Index_ID ,
Object_ID ,
0 AS IsXML
FROM DuplicatesTable dt
ORDER BY 1 , 2 ,3
注意,关于重复索引(Duplicate Indexes)表示存在的索引除了名字不一样外, 索引所在字段以及索引字段顺序都是一样的。An index is considered to be a duplicate if it references the same column and ordinal position as another index in the same database。 这个脚本是找出一模一样的索引,如果你创建下面索引,索引字段一样,但是有包含列字段不一样,那么这个脚本会将这个索引视为不一样的索引。有兴趣可以自己试试。
CREATE INDEX IX_Address_N2 ON [Person].[Address](StateProvinceID) INCLUDE (City);
另外关于XML索引的重复索引,可以使用下面脚本检查。
--Use the below T-SQL script to generate the complete list of duplicate XML indexes in a given database:
;WITH XMLTable
AS ( SELECT OBJECT_NAME(x.object_id) AS TableName ,
SCHEMA_NAME(o.schema_id) AS SchemaName ,
x.object_id ,
x.name ,
x.index_id ,
x.using_xml_index_id ,
x.secondary_type ,
CONVERT(NVARCHAR(MAX), x.secondary_type_desc) AS secondary_type_desc ,
ic.column_id
FROM sys.xml_indexes x ( NOLOCK )
JOIN sys.objects o ( NOLOCK ) ON x.object_id = o.object_id
JOIN sys.index_columns (NOLOCK) ic ON x.object_id = ic.object_id
AND x.index_id = ic.index_id
),
DuplicatesXMLTable
AS ( SELECT x1.SchemaName ,
x1.TableName ,
x1.name AS IndexName ,
x2.name AS DuplicateIndexName ,
x1.secondary_type_desc AS IndexType ,
x1.index_id ,
x1.object_id ,
ROW_NUMBER() OVER ( ORDER BY x1.SchemaName, x1.TableName, x1.name, x2.name ) AS seq1 ,
ROW_NUMBER() OVER ( ORDER BY x1.SchemaName DESC, x1.TableName DESC, x1.name DESC, x2.name DESC ) AS seq2 ,