Router Hanging in Dealer-Router Setup

2019-08-03 05:32发布

问题:

Given the following attempt to connect 1 DEALER to 1 ROUTER:

package net.async

import org.zeromq.ZMQ
import org.zeromq.ZMQ.Socket

import scala.annotation.tailrec

object Client {
  val Empty           = "".getBytes
  def message(x: Int) = s"HELLO_#$x".getBytes
  val Count   = 5
}

class Client(name: String) extends Runnable {

  import Client._
  import AsyncClientServer.Port

  override def run(): Unit = {
    val context = ZMQ.context(1)
    val dealer = context.socket(ZMQ.DEALER)
    dealer.setIdentity(name.getBytes)
    dealer.connect(s"tcp://localhost:$Port")
    runHelper(dealer, Count)
  }

  @tailrec
  private def runHelper(dealer: Socket, count: Int): Unit = {
    dealer.send(dealer.getIdentity, ZMQ.SNDMORE)
    dealer.send(Empty,              ZMQ.SNDMORE)
    dealer.send(message(count),     0)
    println(s"Dealer: ${dealer.getIdentity} received message: " + dealer.recv(0))
    runHelper(dealer, count - 1)
  }
}

object AsyncClientServer {

  val Port = 5555

  val context = ZMQ.context(1)
  val router = context.socket(ZMQ.ROUTER)

  def main(args: Array[String]): Unit = {
    router.bind(s"tcp://*:$Port")
    mainHelper()
    new Thread(new Client("Joe")).start()
  }

  private def mainHelper(): Unit = {
    println("Waiting to receive messages from Dealer.")
    val identity = router.recv(0)
    val empty    = router.recv(0)
    val message  = router.recv(0)

    println(s"Router received message, ${new String(message)} from sender: ${new String(identity)}.")
    mainHelper()
  }
}

I see the following output, hanging on the second message.

[info] Running net.async.AsyncClientServer
[info] Waiting to receive messages from Dealer.

Why is that?

回答1:

Not sure if its the cause of your problem but you don't need to send the identity frame from your dealer, zeromq will do this for you. By adding it your actually sending a 4 part message.

IDENTITY
IDENTITY
EMPTY
CONTENT


标签: scala zeromq