私は、Apache THRIFT RPC フレームワークを使用して構築された C# で記述されたクライアント - サーバー アプリケーションに取り組んでいます。
サービス定義を含むいくつかの IDL ファイル (.thrift ファイル) を作成しました。これらのサービスはサーバーに実装されており、クライアントから呼び出されています。
IDL ファイルの構造体とサービス定義の例を以下に示します。
構造体ViewColumn {
1: string ColumnProperty,
2: i32 ColWidth,
3: i32 ColPosition,
4: bool ColAscending,
5: i32 ColSortOrder,
}
構造体 FormView {
1: i32 ID
2: string formname
3: list<ViewColumn> SelectedColumns
}
サービスフォームクエリ{
1: FormView FetchFormView()
}
このようなサービスは、アプリケーション全体で多数定義されています。
サーバーでは、サービスは次のように実装されています
Public FormView FetchFormView() {
return something
}
クライアントとサーバーの構成は次のとおりです。
クライアント 1. TSocket 2 TBinaryprotocol 3. TMultiplexedProtocol
サーバー 1. TserverSocket 2. Tmultiplexedprocessor 3. TbinaryProtocol
以下のようにクライアントからサービスを呼び出すと
var f = Queries.FetchFormView()
問題が発生しました。
- FetchFormView() は null を返します
- system.OutOfMemoryException
これらのエラーのスタック トレースを以下に示します。
Exception of type 'System.OutOfMemoryException' was thrown.
at Thrift.Protocol.TBinaryProtocol.ReadStringBody(Int32 size)
at Thrift.Protocol.TBinaryProtocol.ReadMessageBegin()
at Thrift.Protocol.TProtocolDecorator.ReadMessageBegin()
at Queries.recv_FetchFormView()
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
FetchFormView failed: unknown result (result is null)
NOTE: This error occurs with other defined services also
at Queries.recv_FetchFormView()
at Queries.Client.FetchFormView()
at Queries.FetchFormView()
at System.Windows.Forms.ToolStripDropDownItem.OnDropDownShow(EventArgs e)
at System.Windows.Forms.ToolStripMenuItem.OnDropDownShow(EventArgs e)
at System.Windows.Forms.ToolStripDropDownItem.ShowDropDownInternal()
at System.Windows.Forms.ToolStripDropDownItem.ShowDropDown(Boolean mousePush)
at System.Windows.Forms.ToolStripMenuItem.OnMouseButtonStateChange(MouseEventArgs e, Boolean isMouseDown)
at System.Windows.Forms.ToolStripMenuItem.OnMouseDown(MouseEventArgs e)
at System.Windows.Forms.ToolStripItem.HandleMouseDown(MouseEventArgs e)
at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
at System.Windows.Forms.ToolStrip.OnMouseDown(MouseEventArgs mea)
at System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ToolStrip.WndProc(Message& m)
at System.Windows.Forms.MenuStrip.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
エンタープライズ レベルのアプリケーションで Apache THRIFT を使用した経験がある場合は、洞察、ソリューション、アイデア、および最良のアプローチを提供してください。
これは重大な状況です。どんな助けでも大歓迎です。
前もって感謝します
ロミ
更新 - 26/7/13
私は解決策を即興で作りました。すべてのサービス呼び出しの前に、トランスポート オブジェクトとプロトコル オブジェクトを閉じて破棄し、再作成しています。これはサーバーに接続する非効率的な方法ですが、機能しています。各サービスの呼び出しを非同期にすることを考えています。おそらくそれはより良い解決策になるでしょう。