我正在构建一个需要连接到自定义TCP数据服务的Rails应用程序,该服务使用XML消息来交换数据。从功能上讲,这不是一个问题,但我在设计方式上遇到了“干净”的问题。
简要概述:
用户登录Rails应用。登录时,将使用数据服务验证凭据,并返回“上下文ID”。
请求:
<login><username>testuser</username><password>mypass</password></login>
响应:
<reply><context_id>123456</context_id></reply>
这个context_id基本上是一个会话令牌。对此用户的所有后续请求必须在XML消息中提供此context_id。
请求:
<history><context_id>123456</context_id><start_date>1/1/2010</start_date><end_date>1/31/2010</end_date></history>
响应:
<reply><history_item>...</history_item><history_item>..</history_item></reply>
我已经隐藏了我的模型中的所有XML构建/解析,这非常有效。我可以将context_id存储在用户的会话中,并在我的控制器中检索它,并将其传递给模型函数。
@transactions = Transaction.find( { :context_id => 123456, :start_date => '1/1/2010', :end_date => '1/31/2010' } )
从设计的角度来看,我有两个问题需要解决:
这可能听起来很复杂,我可能会说这一切都错了。如果有人有任何想法,我很乐意听到。
技术细节:我正在运行Apache / mod_rails,我对TCP服务及其架构有0控制权。
答案 0 :(得分:1)
考虑将API访问权移动到新类,并将TcpSocket
实例和上下文ID存储在那里。更改模型以与此API访问类通信,而不是与套接字本身交谈。
向控制器添加around_filter
,将会话中的上下文ID拉出会话,将其存储到API访问类中,并在运行操作后将其置为nils。只要您的Rails进程保持单线程,您就可以了。如果切换到多线程模型,您还需要更改API访问类,以在线程本地存储中存储上下文ID 和 TcpSocket
,您将需要每个帖子需要一个TcpSocket
。