0

私は、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()

問題が発生しました。

  1. FetchFormView() は null を返します
  2. 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

私は解決策を即興で作りました。すべてのサービス呼び出しの前に、トランスポート オブジェクトとプロトコル オブジェクトを閉じて破棄し、再作成しています。これはサーバーに接続する非効率的な方法ですが、機能しています。各サービスの呼び出しを非同期にすることを考えています。おそらくそれはより良い解決策になるでしょう。

4

1 に答える 1