Skip to content

Commit faa3349

Browse files
committed
Improved THproseClient.New
Improved THproseClient.UseService Improved THproseClient.URIList
1 parent df96271 commit faa3349

File tree

1 file changed

+53
-57
lines changed

1 file changed

+53
-57
lines changed

Source/HproseClient.pas

Lines changed: 53 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* *
1515
* hprose client unit for delphi. *
1616
* *
17-
* LastModified: Dec 14, 2016 *
17+
* LastModified: Dec 16, 2016 *
1818
* Author: Ma Bingyao <andot@hprose.com> *
1919
* *
2020
\**********************************************************/
@@ -201,7 +201,7 @@ THproseClient = class(TComponent, IInvokeableVarObject)
201201
FFilters: TFilterList;
202202
FHandlers: THandlerManager;
203203
FURI: string;
204-
FURIList: TStringArray;
204+
FURIList: IList;
205205
FIndex: Integer;
206206
FFailround: Integer;
207207
FRetry: Integer;
@@ -228,7 +228,7 @@ THproseClient = class(TComponent, IInvokeableVarObject)
228228
const Context: TClientContext): Variant;
229229
function GetFullName(const AName: string): string;
230230
procedure SetURI(const AValue: string);
231-
//procedure ByValue(var Arguments: TVariants);
231+
procedure SetURIList(const AURIList: IList);
232232
{$IFDEF SUPPORTS_ANONYMOUS_METHOD}
233233
procedure VarToT(Info: PTypeInfo; const Src: Variant; out Dst);
234234
function VarTo<T>(const AValue: Variant): T;
@@ -241,10 +241,9 @@ THproseClient = class(TComponent, IInvokeableVarObject)
241241
constructor Create(AOwner: TComponent); override;
242242
destructor Destroy; override;
243243
class function New(const AURI: string; const ANameSpace: string = ''): Variant; overload;
244-
class function New(const AURIList: array of string; const ANameSpace: string = ''): Variant; overload;
245-
function UseService(const AURI: string = ''; const ANameSpace: string = ''): Variant; overload;
246-
function UseService(const AURIList: array of string; const ANameSpace: string = ''): Variant; overload;
247-
procedure SetURIList(const AURIList: array of string);
244+
class function New(const AURIList: IList; const ANameSpace: string = ''): Variant; overload;
245+
class function New(const AURIList: array of const; const ANameSpace: string = ''): Variant; overload;
246+
function UseService(const ANameSpace: string = ''): Variant; overload;
248247
function AddFilter(const Filter: IFilter): THproseClient;
249248
function RemoveFilter(const Filter: IFilter): THproseClient;
250249
function AddInvokeHandler(const Handler: TInvokeHandler): THproseClient;
@@ -317,7 +316,7 @@ THproseClient = class(TComponent, IInvokeableVarObject)
317316
function SubscribedList(): TStringArray;
318317
published
319318
property URI: string read FURI write SetURI;
320-
property URIList: TStringArray read FURIList;
319+
property URIList: IList read FURIList write SetURIList;
321320
property Failround: Integer read FFailround;
322321
property Retry: Integer read FRetry write FRetry;
323322
property Timeout: Integer read FTimeout write FTimeout;
@@ -374,10 +373,6 @@ implementation
374373
uses
375374
HproseIO;
376375

377-
{$IFNDEF FPC}
378-
{$I InterlockedAPIs.inc}
379-
{$ENDIF}
380-
381376
type
382377

383378
{ TCallback }
@@ -605,7 +600,6 @@ constructor TAsyncInvokeThread.Create(Client: THproseClient;
605600
FClient := Client;
606601
FName := AName;
607602
FArgs := Args;
608-
//Client.ByValue(FArgs);
609603
FCallback1 := Callback;
610604
FSettings := ASettings;
611605
FError := nil;
@@ -620,7 +614,6 @@ constructor TAsyncInvokeThread.Create(Client: THproseClient;
620614
FClient := Client;
621615
FName := AName;
622616
FArgs := Args;
623-
//Client.ByValue(FArgs);
624617
FCallback := Callback;
625618
FSettings := ASettings;
626619
FError := nil;
@@ -659,7 +652,6 @@ constructor TAsyncInvokeThread1<T>.Create(Client: THproseClient;
659652
FClient := Client;
660653
FName := AName;
661654
FArgs := Args;
662-
//Client.ByValue(FArgs);
663655
FCallback := Callback;
664656
FSettings := ASettings;
665657
FError := nil;
@@ -680,7 +672,6 @@ constructor TAsyncInvokeThread2<T>.Create(Client: THproseClient;
680672
FClient := Client;
681673
FName := AName;
682674
FArgs := Args;
683-
//Client.ByValue(FArgs);
684675
FCallback := Callback;
685676
FSettings := ASettings;
686677
FError := nil;
@@ -921,7 +912,7 @@ constructor THproseClient.Create(AOwner: TComponent);
921912
inherited Create(AOwner);
922913
FNameSpace := '';
923914
FURI := '';
924-
FURIList := nil;
915+
FURIList := TArrayList.Create;
925916
FIndex := 0;
926917
FFailround := 0;
927918
FOnError := nil;
@@ -941,60 +932,58 @@ destructor THproseClient.Destroy;
941932
inherited Destroy;
942933
end;
943934

944-
class function THproseClient.New(const AURI: string; const ANameSpace: string): Variant;
935+
class function THproseClient.New(const AURI: string;
936+
const ANameSpace: string): Variant;
937+
var
938+
Client: THproseClient;
945939
begin
946-
Result := Self.Create(nil).UseService(AURI, ANameSpace);
940+
Client := Self.Create(nil);
941+
Client.URI := AURI;
942+
Result := Client.UseService(ANameSpace);
947943
end;
948944

949-
class function THproseClient.New(const AURIList: array of string;
945+
class function THproseClient.New(const AURIList: IList;
950946
const ANameSpace: string): Variant;
947+
var
948+
Client: THproseClient;
951949
begin
952-
Result := Self.Create(nil).UseService(AURIList, ANameSpace);
950+
Client := Self.Create(nil);
951+
Client.URIList := AURIList;
952+
Result := Client.UseService(ANameSpace);
953953
end;
954954

955-
function THproseClient.UseService(const AURI: string; const ANameSpace: string
956-
): Variant;
955+
class function THproseClient.New(const AURIList: array of const;
956+
const ANameSpace: string): Variant;
957+
var
958+
Client: THproseClient;
957959
begin
958-
FNameSpace := ANameSpace;
959-
Self.URI := AURI;
960-
Result := ObjToVar(Self);
960+
Client := Self.Create(nil);
961+
Client.URIList := ArrayList(AURIList);
962+
Result := Client.UseService(ANameSpace);
961963
end;
962964

963-
function THproseClient.UseService(const AURIList: array of string;
964-
const ANameSpace: string): Variant;
965+
function THproseClient.UseService(const ANameSpace: string): Variant;
965966
begin
966967
FNameSpace := ANameSpace;
967-
SetURIList(AURIList);
968968
Result := ObjToVar(Self);
969969
end;
970970

971-
procedure THproseClient.SetURIList(const AURIList: array of string);
971+
procedure THproseClient.SetURIList(const AURIList: IList);
972972
begin
973-
FURIList := ShuffleStringArray(AURIList);
973+
FURIList.Assign(AURIList);
974+
FURIList.Shuffle;
974975
FIndex := 0;
975976
FFailround := 0;
976977
InitURI(FURIList[0]);
977978
end;
978979

979-
{
980-
procedure THproseClient.ByValue(var Arguments: TVariants);
981-
var
982-
I: Integer;
983-
begin
984-
for I := 0 to Length(Arguments) - 1 do Arguments[I] := VarUnref(Arguments[I]);
985-
end;
986-
}
987-
988980
procedure THproseClient.SetURI(const AValue: string);
989981
begin
990-
if AValue <> '' then
991-
SetURIList([AValue])
992-
else begin
993-
FURIList := nil;
994-
FIndex := 0;
995-
FFailround := 0;
996-
InitURI('');
997-
end;
982+
FURIList.Clear;
983+
FURIList.Add(AValue);
984+
FIndex := 0;
985+
FFailround := 0;
986+
InitURI(FURIList[0]);
998987
end;
999988

1000989
procedure THproseClient.InitURI(const AValue: string);
@@ -1152,7 +1141,7 @@ function THproseClient.RetrySendRequest(var Request: TBytes;
11521141
if Settings.Idempotent and (Context.Retried < Settings.Retry) then begin
11531142
Context.Retried := Context.Retried + 1;
11541143
Interval := Context.Retried * 500;
1155-
if Settings.Failswitch then Dec(Interval, (Length(FURIList) - 1) * 500);
1144+
if Settings.Failswitch then Dec(Interval, (FURIList.Count - 1) * 500);
11561145
if Interval > 5000 then Interval := 5000;
11571146
if Interval > 0 then Sleep(Interval);
11581147
Result := AfterFilterHandler(Request, Context, nil);
@@ -1164,15 +1153,22 @@ procedure THproseClient.FailSwitch;
11641153
var
11651154
N: Integer;
11661155
begin
1167-
N := Length(FURIList);
1168-
if N > 1 then begin
1169-
if InterlockedCompareExchange(FIndex, 0, N - 1) = 0 then begin
1170-
FURI := FURIList[0];
1171-
InterlockedIncrement(FFailround);
1156+
FURIList.Lock;
1157+
try
1158+
N := FURIList.Count;
1159+
if N > 1 then begin
1160+
if FIndex < N - 1 then
1161+
Inc(FIndex)
1162+
else begin
1163+
FIndex := 0;
1164+
Inc(FFailround);
1165+
end;
1166+
FURI := FURIList[FIndex];
11721167
end
1173-
else FURI := FURIList[InterlockedIncrement(FIndex)];
1174-
end
1175-
else InterlockedIncrement(FFailround);
1168+
else Inc(FFailround);
1169+
finally
1170+
FURIList.Unlock;
1171+
end;
11761172
if Assigned(FOnFailswitch) then FOnFailswitch(Self);
11771173
end;
11781174

0 commit comments

Comments
 (0)