2010-07-27 82 views
0

我正在構建一個Rails應用程序,它需要連接到使用XML消息交換數據的自定義TCP數據服務。在功能上,這不是一個問題,但是我在設計時感覺「乾淨」,卻遇到了麻煩。Rails w /自定義TCP數據服務

簡要概述:

用戶登錄到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' }) 

從設計的角度來看,我有2個問題,我想解答:

  1. 薪火context_id到每個示範行動是一個有點疼痛。如果模型能夠從會話本身檢索到id,那將是非常好的,但我知道這打破了關注點分離規則。
  2. 有一個TcpSocket連接在每次請求時被模型創建/銷燬。連接並不直接綁定到context_id,所以如果套接字可以存儲在某個地方並由模型檢索到,那將會很好,所以我不會爲每個請求重新建立連接。

這可能聽起來真的很複雜,我可能會這樣做都是錯誤的。如果有人有任何想法,我很樂意聽到他們的意見。技術細節:我正在運行Apache/mod_rails,並且我對TCP服務及其體系結構有0個控制權。

回答

1

考慮將API訪問移到新類中,並將TcpSocket實例和上下文ID存儲在那裏。改變你的模型來與這個API訪問類交談,而不是與套接字本身交談。

around_filter添加到您的控制器,將上下文ID拉出會話,將其存儲到API訪問類中,並在運行該操作後將其刪除。只要你的Rails進程保持單線程,你會沒事的。如果切換到多線程模型,則還需要更改API訪問類以將線程本地存儲中的上下文ID TcpSocket存儲,並且每個線程需要一個TcpSocket

+0

我實際上已經完成了一半。我創建了一個處理通信/保持上下文的API類。我在我的模型中添加了一個with_backend方法,這基本上和around_filter做的是一樣的。感謝指向around_filter的指針! – 2010-07-27 13:56:29