我正在开发一个用 C# 编写的客户端 - 服务器应用程序,该应用程序是使用 Apache THRIFT RPC 框架构建的。
我们已经创建了几个带有服务定义的 IDL 文件(.thrift 文件)。这些服务已在服务器中实现,并正在从客户端调用。
下面给出了 IDL 文件中的结构和服务定义的示例
结构视图列{
1: string ColumnProperty,
2: i32 ColWidth,
3: i32 ColPosition,
4: bool ColAscending,
5: i32 ColSortOrder,
}
结构窗体视图 {
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
我提出了一个解决方案。我在每次服务调用之前关闭/处理并重新创建传输和协议对象。这是一种与服务器连接的低效方式,但它正在工作。我正在考虑使每个服务调用异步。可能这将是一个更好的解决方案。