Ruby on rails 带有自定义TCP数据服务的Rails

Ruby on rails 带有自定义TCP数据服务的Rails,ruby-on-rails,Ruby On Rails,我正在构建一个Rails应用程序,它需要连接到一个定制的TCP数据服务,该服务使用XML消息来交换数据。从功能上讲,这并不是一个问题,但我在以一种感觉“干净”的方式构建它时遇到了麻烦 简要概述: 用户登录到Rails应用程序。登录时,使用数据服务验证凭据,并返回“上下文id” 请求: <login><username>testuser</username><password>mypass</password></login>

我正在构建一个Rails应用程序,它需要连接到一个定制的TCP数据服务,该服务使用XML消息来交换数据。从功能上讲,这并不是一个问题,但我在以一种感觉“干净”的方式构建它时遇到了麻烦

简要概述:

用户登录到Rails应用程序。登录时,使用数据服务验证凭据,并返回“上下文id”

请求:

<login><username>testuser</username><password>mypass</password></login>
<reply><context_id>123456</context_id></reply>
<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>
从设计的角度来看,我想解决两个问题:

  • 将上下文id传递给每个模型操作有点麻烦。如果模型能够从会话本身检索id就好了,但我知道这打破了关注点分离规则
  • 有一个TcpSocket连接,模型会在每次请求时创建/销毁该连接。连接没有直接绑定到context_id,因此如果套接字可以存储在某个地方并由模型检索就好了,因此我不会为每个请求重新建立连接
  • 这听起来可能真的很复杂,我可能在这方面完全错了。如果有人有什么想法,我很想听


    技术细节:我正在运行Apache/mod_rails,我对TCP服务及其架构拥有0控制权。

    考虑将API访问移动到一个新类,并将
    TcpSocket
    实例和上下文ID存储在那里。将模型更改为与此API访问类对话,而不是与套接字本身对话


    在控制器中添加一个
    around\u过滤器
    ,该过滤器将上下文ID从会话中取出,存储到API访问类中,并在运行操作后将其置零。只要Rails进程仍然是单线程的,就不会有问题。如果切换到多线程模型,还需要更改API访问类以将上下文ID和
    TcpSocket
    存储在线程本地存储中,并且每个线程需要一个
    TcpSocket

    我实际上已经做了一半。我创建了一个API类来处理通信/保存上下文。我在我的模型中添加了一个with_backend方法,这与around_过滤器的功能基本相同。谢谢你的指针,指向周围的过滤器!
    @transactions = Transaction.find( { :context_id => 123456, :start_date => '1/1/2010', :end_date => '1/31/2010' } )