Scala Akka ZeroMQExtension Req套接字发送过程

Scala Akka ZeroMQExtension Req套接字发送过程,scala,akka,zeromq,Scala,Akka,Zeromq,我有一个微型Rep服务器,我能够使用以下代码成功地向其发送消息: import akka.actor.Actor import akka.zeromq._ import org.zeromq.ZMQ import akka.util.ByteString class Sender extends Actor { override def preStart(): Unit = { val context = ZMQ.context(1) val socket = conte

我有一个微型Rep服务器,我能够使用以下代码成功地向其发送消息:

import akka.actor.Actor
import akka.zeromq._
import org.zeromq.ZMQ
import akka.util.ByteString

class Sender extends Actor {

  override def preStart(): Unit = {
    val context = ZMQ.context(1)
    val socket = context.socket(ZMQ.REQ)
    socket.connect ("tcp://127.0.0.1:1234")
    socket.send("test".getBytes(), 0)
    println("Sent!")
    //val reqSocket =     ZeroMQExtension(context.system).newReqSocket(
    //                        Array(Connect("tcp://127.0.0.1:1234")))
    //reqSocket ! ZMQMessage(ByteString("test"))
  }

  def receive : Receive = {
    case _ =>
  }
}
但是,如果改用注释掉的部分(并注释掉def中的所有其他内容),则服务器无法检测到任何消息。当使用
ZeroMQExtension
时,是否应该使用其他类型的过程来发送消息?我使用的是ZeroMQ 2.2.0版

以下是服务器代码供参考:

import akka.actor._
import akka.zeromq._

class ReplyActor extends Actor {
  def receive = {
    case _ =>
      println("Received something!")
  }
}

object Replyer extends App {
   val system = ActorSystem("zmq")
   val serverSocket = ZeroMQExtension(system).newRepSocket(
   Array(Bind("tcp://127.0.0.1:1234"),
         Listener(system.actorOf(Props[ReplyActor]))))
}

在服务器中,将case=>代码切换为以下代码:

案例x=>println(“消息为:”+x)


然后,您会发现您的ReplyActor和发件人最终收到一条“连接”消息。我发现,在收到此“连接”消息之前,您无法发送/接收任何内容。这只意味着你实际上是有联系的。一旦你得到它,你就可以开始发送/接收消息了。

我得到的是
消息是:ZMQMessage(Vector(ByteString(116、101、115、116))
应该是“test”的字节。如果我将客户机代码更改为当前已注释的代码,我将一无所获。在注释掉的第一行中设置套接字需要一些时间。这是一个异步调用。如果您在第二行中发送注释掉的“test”字符串,那么套接字可能还没有准备好:(至少这是我似乎发现的:(啊,是的,如果我在设置套接字后稍微睡眠一下,它就能够发送消息了(但我没有看到任何“连接”消息).没有
线程,还有什么更合适的方法吗?睡眠
?谢谢你的帮助,我希望我能给你投票,但我还没有足够的代表权:(我不确定是否有更好的方法。我只是想让ZMQ自己工作,并且偶然发现了相同的问题。呵呵。不必担心追加投票。如果你能找到一种“更好”的方法,而不必睡觉,我会很感兴趣。我还没有找到任何关于它的好例子/信息:(