자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi 데이터스냅 콜백 오류 문의
2016.10.14 11:10
본 게시판 사용시 당부 사항
* 이 게시판은 자유롭게 질문을 올리고 자발적으로 답변을 공유하는 게시판입니다.
* 어느 누구도 답변을 달아야만 하는 책임은 없습니다.
* 따라서 질문을 올리실 때에는 최대한 자세하고 정중하게 질문을 올려 주세요.
* 최대한 질문을 자세히 올려야 답변도 자세히 올라 옵니다.
* 본 질문에 답변을 주시는 여러 개발자님들께 미리 감사드립니다.
-----------------------------------------------------------------------------------------------
현재 베를린 10.1 update 1 버전을 사용중입니다.
엠바코데로 홈페이지에서 데이터스냅 콜백 관련 예제를 다운로드 받아 테스트 중 오류가 있어 문의 드립니다.
샘플코드를 다운받아 컴파일 후 다 정상 작동하는데 NotifyCallback 메서드를 이용해서 클라이언트간에 콜백함수를
호출할경우 오류가 발생합니다. 동영상을 보면 분명 정상 작동하는데 안되네요. 베를린 10.1 버전에서 버그로 인한건지
아니면 다른 설정이 있는건지 알고 싶습니다.
테스트한 예제 소스를 같이 첨부합니다.
다운받은 샘플 url: http://edn.embarcadero.com/article/41374
오류 메시지 : 'Remote error: VAR and OUT arguments must match parameter type exactly'
procedure TFormClient.ButtonNotifyClick(Sender: TObject);
var AClient: TDSAdminClient; aResponse: TJSONValue;
begin
AClient := TDSAdminClient.Create(SQLConnection1.DBXConnection);
try
AClient.NotifyCallback(
DSClientCallbackChannelManager1.ChannelName,
EditDestinationClientId.Text,
EditDestinationCallbackId.Text,
TJSONString.Create(EditMsg.Text),
aResponse
);
finally
AClient.Free;
end;
end;
28288_delphi_labs_datasnap_xe_xe3_callbacks (1).ZIP
참고로 테스트한 소스코드 입니다. NotifyCallback 호출시 오류가 발생합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
unit FormClientUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DBXDataSnap, DBXCommon, DB, SqlExpr, DBXJSON, StdCtrls,
DSHTTPCommon, DSService, DSProxy;
type
TMyCallback = class(TDBXCallback)
public
function Execute(const Arg: TJSONValue): TJSONValue; override;
end;
TFormClient = class(TForm)
SQLConnection1: TSQLConnection;
MemoLog: TMemo;
DSClientCallbackChannelManager1: TDSClientCallbackChannelManager;
ButtonBroadcast: TButton;
EditMsg: TEdit;
Label2: TLabel;
ButtonNotify: TButton;
Label1: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
EditLocalClientId: TEdit;
EditLocalCallbackId: TEdit;
EditDestinationCallbackId: TEdit;
EditDestinationClientId: TEdit;
procedure FormCreate(Sender: TObject);
procedure ButtonBroadcastClick(Sender: TObject);
procedure ButtonNotifyClick(Sender: TObject);
private
FMyCallbackName: string;
public
procedure LogMsg(const s: string);
procedure QueueLogMsg(const s: string);
end;
var
FormClient: TFormClient;
implementation
{$R *.dfm}
{ TMyCallback }
function TMyCallback.Execute(const Arg: TJSONValue): TJSONValue;
begin
FormClient.QueueLogMsg(Arg.ToString);
Result := TJSONTrue.Create;
end;
{ TFormClient }
procedure TFormClient.ButtonBroadcastClick(Sender: TObject);
var AClient: TDSAdminClient;
begin
AClient := TDSAdminClient.Create(SQLConnection1.DBXConnection);
try
AClient.BroadcastToChannel(
DSClientCallbackChannelManager1.ChannelName,
TJSONString.Create(EditMsg.Text)
);
finally
AClient.Free;
end;
end;
procedure TFormClient.ButtonNotifyClick(Sender: TObject);
var AClient: TDSAdminClient; aResponse: TJSONValue;
begin
AClient := TDSAdminClient.Create(SQLConnection1.DBXConnection);
try
AClient.NotifyCallback(
DSClientCallbackChannelManager1.ChannelName,
EditDestinationClientId.Text,
EditDestinationCallbackId.Text,
TJSONString.Create(EditMsg.Text),
aResponse
);
finally
AClient.Free;
end;
end;
procedure TFormClient.FormCreate(Sender: TObject);
begin
FMyCallbackName := TDSTunnelSession.GenerateSessionId;
DSClientCallbackChannelManager1.ManagerId := TDSTunnelSession.GenerateSessionId;
DSClientCallbackChannelManager1.RegisterCallback(
FMyCallbackName,
TMyCallback.Create
);
EditLocalClientId.Text := DSClientCallbackChannelManager1.ManagerId;
EditLocalCallbackId.Text := FMyCallbackName;
EditDestinationClientId.Text := '';
EditDestinationCallbackId.Text := '';
end;
procedure TFormClient.LogMsg(const s: string);
begin
MemoLog.Lines.Add(DateTimeToStr(Now) + ': ' + s);
end;
procedure TFormClient.QueueLogMsg(const s: string);
begin
TThread.Queue(nil,
procedure
begin
LogMsg(s)
end
);
end;
end.
댓글 3
-
험프리
2016.10.14 14:47
-
회원
2016.10.14 16:02
첨부된 압축파일 열면 FormClientUnit.pas 에 보면
procedure TFormClient.ButtonNotifyClick(Sender: TObject);
버튼클릭시 내용입니다.
-
험프리
2016.10.18 16:08
동일한 이슈가 이미 엠바카데로 품질관리 시스템에 보고되어있습니다.
https://quality.embarcadero.com/browse/RSP-15501 (2016년 7월)
해당 이슈 해결은 엠바카데로의 처리를 기다려야할 것 같습니다.
당장은 다음과 같이 콜백 메시지 전송하는 방식을 바꿔서 사용해보시기 바랍니다.
방안
서버 메소드를 이용해 서버에서 콜백 메시지 전송
코드
1) 데이터스냅 서버에 콜백 메시지 전송 서버 메소드 추가
function TServerMethods1.ServerMethodNotifyCallback(const AChannelName, AClientId,
ACallbackId, AValue: string): Boolean;
var
Response: TJSONValue;
begin
FDSServer.NotifyCallback(AClientId, ACallbackId, TJSONString.Create(AValue), Response);
end;
2) 클라이언트에서 위 메소드를 호출해 콜백 메시지 전송
var
LResult: Boolean;
begin
LResult := ClientModule1.ServerMethods1Client.ServerMethodNotifyCallback(
DSClientCallbackChannelManager1.ManagerId,
GetCallbackName,
Edit1.Text);
end;
Delphi 데이터스냅 콜백 오류 문의
2016.10.14 11:10
본 게시판 사용시 당부 사항
* 이 게시판은 자유롭게 질문을 올리고 자발적으로 답변을 공유하는 게시판입니다.
* 어느 누구도 답변을 달아야만 하는 책임은 없습니다.
* 따라서 질문을 올리실 때에는 최대한 자세하고 정중하게 질문을 올려 주세요.
* 최대한 질문을 자세히 올려야 답변도 자세히 올라 옵니다.
* 본 질문에 답변을 주시는 여러 개발자님들께 미리 감사드립니다.
-----------------------------------------------------------------------------------------------
현재 베를린 10.1 update 1 버전을 사용중입니다.
엠바코데로 홈페이지에서 데이터스냅 콜백 관련 예제를 다운로드 받아 테스트 중 오류가 있어 문의 드립니다.
샘플코드를 다운받아 컴파일 후 다 정상 작동하는데 NotifyCallback 메서드를 이용해서 클라이언트간에 콜백함수를
호출할경우 오류가 발생합니다. 동영상을 보면 분명 정상 작동하는데 안되네요. 베를린 10.1 버전에서 버그로 인한건지
아니면 다른 설정이 있는건지 알고 싶습니다.
테스트한 예제 소스를 같이 첨부합니다.
다운받은 샘플 url: http://edn.embarcadero.com/article/41374
오류 메시지 : 'Remote error: VAR and OUT arguments must match parameter type exactly'
procedure TFormClient.ButtonNotifyClick(Sender: TObject);
var AClient: TDSAdminClient; aResponse: TJSONValue;
begin
AClient := TDSAdminClient.Create(SQLConnection1.DBXConnection);
try
AClient.NotifyCallback(
DSClientCallbackChannelManager1.ChannelName,
EditDestinationClientId.Text,
EditDestinationCallbackId.Text,
TJSONString.Create(EditMsg.Text),
aResponse
);
finally
AClient.Free;
end;
end;
28288_delphi_labs_datasnap_xe_xe3_callbacks (1).ZIP
참고로 테스트한 소스코드 입니다. NotifyCallback 호출시 오류가 발생합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
unit FormClientUnit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DBXDataSnap, DBXCommon, DB, SqlExpr, DBXJSON, StdCtrls, DSHTTPCommon, DSService, DSProxy; type TMyCallback = class(TDBXCallback) public function Execute(const Arg: TJSONValue): TJSONValue; override; end; TFormClient = class(TForm) SQLConnection1: TSQLConnection; MemoLog: TMemo; DSClientCallbackChannelManager1: TDSClientCallbackChannelManager; ButtonBroadcast: TButton; EditMsg: TEdit; Label2: TLabel; ButtonNotify: TButton; Label1: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; EditLocalClientId: TEdit; EditLocalCallbackId: TEdit; EditDestinationCallbackId: TEdit; EditDestinationClientId: TEdit; procedure FormCreate(Sender: TObject); procedure ButtonBroadcastClick(Sender: TObject); procedure ButtonNotifyClick(Sender: TObject); private FMyCallbackName: string; public procedure LogMsg(const s: string); procedure QueueLogMsg(const s: string); end; var FormClient: TFormClient; implementation {$R *.dfm} { TMyCallback } function TMyCallback.Execute(const Arg: TJSONValue): TJSONValue; begin FormClient.QueueLogMsg(Arg.ToString); Result := TJSONTrue.Create; end; { TFormClient } procedure TFormClient.ButtonBroadcastClick(Sender: TObject); var AClient: TDSAdminClient; begin AClient := TDSAdminClient.Create(SQLConnection1.DBXConnection); try AClient.BroadcastToChannel( DSClientCallbackChannelManager1.ChannelName, TJSONString.Create(EditMsg.Text) ); finally AClient.Free; end; end; procedure TFormClient.ButtonNotifyClick(Sender: TObject); var AClient: TDSAdminClient; aResponse: TJSONValue; begin AClient := TDSAdminClient.Create(SQLConnection1.DBXConnection); try AClient.NotifyCallback( DSClientCallbackChannelManager1.ChannelName, EditDestinationClientId.Text, EditDestinationCallbackId.Text, TJSONString.Create(EditMsg.Text), aResponse ); finally AClient.Free; end; end; procedure TFormClient.FormCreate(Sender: TObject); begin FMyCallbackName := TDSTunnelSession.GenerateSessionId; DSClientCallbackChannelManager1.ManagerId := TDSTunnelSession.GenerateSessionId; DSClientCallbackChannelManager1.RegisterCallback( FMyCallbackName, TMyCallback.Create ); EditLocalClientId.Text := DSClientCallbackChannelManager1.ManagerId; EditLocalCallbackId.Text := FMyCallbackName; EditDestinationClientId.Text := ''; EditDestinationCallbackId.Text := ''; end; procedure TFormClient.LogMsg(const s: string); begin MemoLog.Lines.Add(DateTimeToStr(Now) + ': ' + s); end; procedure TFormClient.QueueLogMsg(const s: string); begin TThread.Queue(nil, procedure begin LogMsg(s) end ); end; end. |
댓글 3
-
험프리
2016.10.14 14:47
-
회원
2016.10.14 16:02
첨부된 압축파일 열면 FormClientUnit.pas 에 보면
procedure TFormClient.ButtonNotifyClick(Sender: TObject);
버튼클릭시 내용입니다.
-
험프리
2016.10.18 16:08
동일한 이슈가 이미 엠바카데로 품질관리 시스템에 보고되어있습니다.
https://quality.embarcadero.com/browse/RSP-15501 (2016년 7월)
해당 이슈 해결은 엠바카데로의 처리를 기다려야할 것 같습니다.
당장은 다음과 같이 콜백 메시지 전송하는 방식을 바꿔서 사용해보시기 바랍니다.
방안
서버 메소드를 이용해 서버에서 콜백 메시지 전송
코드
1) 데이터스냅 서버에 콜백 메시지 전송 서버 메소드 추가
function TServerMethods1.ServerMethodNotifyCallback(const AChannelName, AClientId,
ACallbackId, AValue: string): Boolean;
var
Response: TJSONValue;
begin
FDSServer.NotifyCallback(AClientId, ACallbackId, TJSONString.Create(AValue), Response);
end;
2) 클라이언트에서 위 메소드를 호출해 콜백 메시지 전송
var
LResult: Boolean;
begin
LResult := ClientModule1.ServerMethods1Client.ServerMethodNotifyCallback(
DSClientCallbackChannelManager1.ManagerId,
GetCallbackName,
Edit1.Text);
end;
NotifyCallback은 저도 몇일전에 테스트 해봤는데 베를린 업데이트1에서 전혀 문제가 없었습니다.
첨부된 샘플은 해당 기능이 없는 프로젝트네요?
테스트하셨던 소스가 있으면 올려주세요. 제가 테스트해보겠습니다.