14
14
* *
15
15
* hprose client unit for delphi. *
16
16
* *
17
- * LastModified: Dec 14 , 2016 *
17
+ * LastModified: Dec 16 , 2016 *
18
18
* Author: Ma Bingyao <andot@hprose.com> *
19
19
* *
20
20
\**********************************************************/
@@ -201,7 +201,7 @@ THproseClient = class(TComponent, IInvokeableVarObject)
201
201
FFilters: TFilterList;
202
202
FHandlers: THandlerManager;
203
203
FURI: string;
204
- FURIList: TStringArray ;
204
+ FURIList: IList ;
205
205
FIndex: Integer;
206
206
FFailround: Integer;
207
207
FRetry: Integer;
@@ -228,7 +228,7 @@ THproseClient = class(TComponent, IInvokeableVarObject)
228
228
const Context: TClientContext): Variant;
229
229
function GetFullName (const AName: string): string;
230
230
procedure SetURI (const AValue: string);
231
- // procedure ByValue(var Arguments: TVariants );
231
+ procedure SetURIList ( const AURIList: IList );
232
232
{ $IFDEF SUPPORTS_ANONYMOUS_METHOD}
233
233
procedure VarToT (Info: PTypeInfo; const Src: Variant; out Dst);
234
234
function VarTo <T>(const AValue: Variant): T;
@@ -241,10 +241,9 @@ THproseClient = class(TComponent, IInvokeableVarObject)
241
241
constructor Create(AOwner: TComponent); override;
242
242
destructor Destroy; override;
243
243
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;
248
247
function AddFilter (const Filter: IFilter): THproseClient;
249
248
function RemoveFilter (const Filter: IFilter): THproseClient;
250
249
function AddInvokeHandler (const Handler: TInvokeHandler): THproseClient;
@@ -317,7 +316,7 @@ THproseClient = class(TComponent, IInvokeableVarObject)
317
316
function SubscribedList (): TStringArray;
318
317
published
319
318
property URI: string read FURI write SetURI;
320
- property URIList: TStringArray read FURIList;
319
+ property URIList: IList read FURIList write SetURIList ;
321
320
property Failround: Integer read FFailround;
322
321
property Retry: Integer read FRetry write FRetry;
323
322
property Timeout: Integer read FTimeout write FTimeout;
@@ -374,10 +373,6 @@ implementation
374
373
uses
375
374
HproseIO;
376
375
377
- { $IFNDEF FPC}
378
- { $I InterlockedAPIs.inc}
379
- { $ENDIF}
380
-
381
376
type
382
377
383
378
{ TCallback }
@@ -605,7 +600,6 @@ constructor TAsyncInvokeThread.Create(Client: THproseClient;
605
600
FClient := Client;
606
601
FName := AName;
607
602
FArgs := Args;
608
- // Client.ByValue(FArgs);
609
603
FCallback1 := Callback;
610
604
FSettings := ASettings;
611
605
FError := nil ;
@@ -620,7 +614,6 @@ constructor TAsyncInvokeThread.Create(Client: THproseClient;
620
614
FClient := Client;
621
615
FName := AName;
622
616
FArgs := Args;
623
- // Client.ByValue(FArgs);
624
617
FCallback := Callback;
625
618
FSettings := ASettings;
626
619
FError := nil ;
@@ -659,7 +652,6 @@ constructor TAsyncInvokeThread1<T>.Create(Client: THproseClient;
659
652
FClient := Client;
660
653
FName := AName;
661
654
FArgs := Args;
662
- // Client.ByValue(FArgs);
663
655
FCallback := Callback;
664
656
FSettings := ASettings;
665
657
FError := nil ;
@@ -680,7 +672,6 @@ constructor TAsyncInvokeThread2<T>.Create(Client: THproseClient;
680
672
FClient := Client;
681
673
FName := AName;
682
674
FArgs := Args;
683
- // Client.ByValue(FArgs);
684
675
FCallback := Callback;
685
676
FSettings := ASettings;
686
677
FError := nil ;
@@ -921,7 +912,7 @@ constructor THproseClient.Create(AOwner: TComponent);
921
912
inherited Create(AOwner);
922
913
FNameSpace := ' ' ;
923
914
FURI := ' ' ;
924
- FURIList := nil ;
915
+ FURIList := TArrayList.Create ;
925
916
FIndex := 0 ;
926
917
FFailround := 0 ;
927
918
FOnError := nil ;
@@ -941,60 +932,58 @@ destructor THproseClient.Destroy;
941
932
inherited Destroy;
942
933
end ;
943
934
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;
945
939
begin
946
- Result := Self.Create(nil ).UseService(AURI, ANameSpace);
940
+ Client := Self.Create(nil );
941
+ Client.URI := AURI;
942
+ Result := Client.UseService(ANameSpace);
947
943
end ;
948
944
949
- class function THproseClient.New (const AURIList: array of string ;
945
+ class function THproseClient.New (const AURIList: IList ;
950
946
const ANameSpace: string): Variant;
947
+ var
948
+ Client: THproseClient;
951
949
begin
952
- Result := Self.Create(nil ).UseService(AURIList, ANameSpace);
950
+ Client := Self.Create(nil );
951
+ Client.URIList := AURIList;
952
+ Result := Client.UseService(ANameSpace);
953
953
end ;
954
954
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;
957
959
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 );
961
963
end ;
962
964
963
- function THproseClient.UseService (const AURIList: array of string;
964
- const ANameSpace: string): Variant;
965
+ function THproseClient.UseService (const ANameSpace: string): Variant;
965
966
begin
966
967
FNameSpace := ANameSpace;
967
- SetURIList(AURIList);
968
968
Result := ObjToVar(Self);
969
969
end ;
970
970
971
- procedure THproseClient.SetURIList (const AURIList: array of string );
971
+ procedure THproseClient.SetURIList (const AURIList: IList );
972
972
begin
973
- FURIList := ShuffleStringArray(AURIList);
973
+ FURIList.Assign(AURIList);
974
+ FURIList.Shuffle;
974
975
FIndex := 0 ;
975
976
FFailround := 0 ;
976
977
InitURI(FURIList[0 ]);
977
978
end ;
978
979
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
-
988
980
procedure THproseClient.SetURI (const AValue: string);
989
981
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 ]);
998
987
end ;
999
988
1000
989
procedure THproseClient.InitURI (const AValue: string);
@@ -1152,7 +1141,7 @@ function THproseClient.RetrySendRequest(var Request: TBytes;
1152
1141
if Settings.Idempotent and (Context.Retried < Settings.Retry) then begin
1153
1142
Context.Retried := Context.Retried + 1 ;
1154
1143
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 );
1156
1145
if Interval > 5000 then Interval := 5000 ;
1157
1146
if Interval > 0 then Sleep(Interval);
1158
1147
Result := AfterFilterHandler(Request, Context, nil );
@@ -1164,15 +1153,22 @@ procedure THproseClient.FailSwitch;
1164
1153
var
1165
1154
N: Integer;
1166
1155
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];
1172
1167
end
1173
- else FURI := FURIList[InterlockedIncrement(FIndex)];
1174
- end
1175
- else InterlockedIncrement(FFailround);
1168
+ else Inc(FFailround);
1169
+ finally
1170
+ FURIList.Unlock;
1171
+ end ;
1176
1172
if Assigned(FOnFailswitch) then FOnFailswitch(Self);
1177
1173
end ;
1178
1174
0 commit comments