2012-07-10 51 views
0

我使用2個TCP連接連接到供應商API。在一個連接上,我發出同步請求;第二個連接用於API推出響應。以斯卡拉風格管理2個連接

我目前使用ganymed-ssh-2庫來建立與服務器的兩個連接。我在進行連接時執行握手:在建立同步連接時,我收到一個令牌,我使用該令牌在異步通道上進行身份驗證。我目前只需打印一次認證後在異步通道上收到的所有消息。

我應該採取哪些步驟來繼續在同步通道上發出請求(現在簡單地使用stdin),並繼續從stdout上的異步通道打印響應?我不確定我是否應該使用Actor(我一直在努力尋找可以從輸入流中讀取並相應地解析消息的Actor的示例),還是我應該使用其他一些Scala-esque構造。

class SyncConnection { 
    def connect(): String = { 
    // Establish connection  
    ...  
    val out = new PrintStream(outputStream) 
    val in = new BufferedSource(inputStream).getLines() 

    // Make login request, receive token 
    out.println("loginRequest") 
    out.flush() 

    val token = in.next() 

    token 
    } 
} 

class AsyncConnection { 
    def connect(token: String) { 
    // Establish connection  
    ...  
    val in = new BufferedSource(inputStream).getLines() 
    val out = new PrintStream(outputStream) 

    // Authenticate using token 
    out.println(token) 
    out.flush() 

    // Print all messages received on input stream 
    for (line <- in) println(line)  
    } 
} 

回答

0

我最終使用組合或常規斯卡拉演員和阿卡演員來完成此任務。演員可以很容易地傳遞消息到彼此以執行握手:

  • 同步請求者演員使得登錄請求
  • 同步偵聽器接收令牌需要建立異步連接
  • 同步聽者向前令牌ASYNC請求者
  • 異步請求者使得認證請求
  • 異步偵聽器接收認證成功的確認

我迷上2名定期演員多達兩個連接的輸入流:

class InputStreamReaderActor(lines: Iterator[String], listener: ActorRef) extends Actor { 
    def act() { 
    for (line <- lines) { 
     listener ! line 
    } 
    } 
} 

這將讀取兩個連接任何收到的消息,並立即轉發給聽衆演員的響應。這些聽衆演員看上去像下面這樣:在連接

class SyncListenerActor() extends Actor { 
    def receive: Receive = { 
    // respond to incoming messages 
    } 
} 

並提出要求,我只是迷上每個連接到阿卡演員的輸出流:

class SyncRequestorActor(out: PrintStream) extends Actor { 
    def receive: Receive = { 
    //  
    } 

    def sendRequest(request: String) { 
    println("Making request: " + request) 
    out.println(request) 
    out.flush() 
    } 
}