我希望能够订阅“Exchange”(如果您熟悉的话,类似于通过 RabbitMQ 中的哈希订阅主题交换),然后,发布到给定类型的交换的所有消息都转发给订阅者. 所以基本上每种类型都代表一个通道。
我已经能够使用案例对象通过测试(只是先让它工作,现在重构为适当的设计)。但是使用案例类,我不知道该怎么做。我可以创建一个新的类实例并将其传入。但是,我只想传入类型,而不是它的对象。然后根据类型进行匹配。
我正在考虑只传入一个类的对象并保持它以匹配它是否相同类型,但这似乎我只是把东西粘在一起,因为我不知道我在做什么。有人有什么建议吗?
describe("Subscribe") {
it("should add the subscriber to the list of subscribers for the given channel (message type)", LibraryTest) {
import lib.exchange.ExchangeInterface.{ TestCommand, Subscribe }
val exchange = TestActorRef(new Exchange)
val probe = TestProbe()
exchange ! Subscribe(probe.ref, /*Insert Type Here*/)
awaitCond(exchange.underlyingActor.subscribers.get(/* Channel/Type */).get.contains(probe.ref))
}
}
object ExchangeInterface {
case class Subscribe(subscriber: ActorRef, channel: Command)
trait Command
case class TestCommand(message: Any) extends Command
}
class Exchange extends Actor with ActorLogging {
import ExchangeInterface.{ Command, Subscribe }
val name = self.path.name
var subscribers = HashMap[Any, Set[ActorRef]]()
def receive = {
case Subscribe(subscriber: ActorRef, channel: Command) => subscribers(channel) += subscriber
}
}