[英]Rails w/custom TCP data service
我正在构建一个需要连接到自定义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。
考虑将API访问权限移至新类,然后在其中存储TcpSocket
实例和上下文ID。 更改模型以与该API访问类进行通信,而不是与套接字本身进行通信。
在控制器中添加一个around_filter
,将上下文ID从会话中拉出,将其存储到API访问类中,并在执行操作后将其设置为nil。 只要您的Rails进程保持单线程,就可以了。 如果切换到多线程模型,则还需要更改API访问类以将上下文ID 和 TcpSocket
存储在线程本地存储中,并且每个线程需要一个TcpSocket
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.