#scala #publish-subscribe
#scala #опубликовать-подписаться
Вопрос:
Я новичок в Scala, и я изучаю использование подписки издателя. Может быть проблема с моими навыками Google, но я не могу найти пример такого использования, где я мог бы указать, какие события должны наблюдаться подписчиком.
У кого-нибудь есть несколько примеров?
Спасибо!
Ответ №1:
Если вам нужно что-то действительно простое, я предлагаю сделать это самостоятельно, это не должно быть так сложно. Но если вы хотите чего-то большего, вы можете посмотреть на Eventbus. Это Java-библиотека, но я использую ее и со Scala.
Пример реализации в Scala описан в http://jim-mcbeath.blogspot.com/2009/10/simple-publishsubscribe-example-in.html
Комментарии:
1. Ну, я видел учебник Джима Макбита, но на самом деле я ищу реализацию функции Scale Publisher ( scala-lang.org/api/2.7.1/scala/collection/mutable /… )
2. Я тоже его не нашел. Что именно останавливает вас от реализации? Издатель будет публиковать только один вид события. Но если эта тема вас интересует, вы можете изучить вопрос об отказе от шаблона Observer от Инго Майера, Тиарка Ромпфа, Мартина Одерски.
3. На самом деле я ищу способ отслеживать класс: как только любой из его методов будет завершен, я хочу, чтобы какой-нибудь класс monitor фиксировал событие и выполнял некоторые действия. Итак, я ищу способ, которым каждый метод класса publisher автоматически публикуется по завершении.
4. Тогда Eventbus должен быть для вас, я думаю. Каждый метод в классе может публиковать определенное событие на шине событий, и вы можете определить обработчики, которые заинтересованы в событии.
Ответ №2:
Простой справочный пример можно найти на http://comments.gmane.org/gmane.comp.lang.scala.user/63002 :
case class MyEvent(number: Int)
class PrintIt extends Subscriber[MyEvent, Publisher[MyEvent]] {
override def notify(pub: Publisher[MyEvent], event: MyEvent): Unit = {
println("got an event: " event)
}
}
class RunIt extends Publisher[MyEvent] {
def pub() = publish(MyEvent(12))
}
object Main extends App {
val runIt = new RunIt()
runIt.subscribe(new PrintIt)
runIt.pub()
}
Ответ №3:
Вы можете найти простую реализацию EventBus здесь . Он также выполняет асинхронную обработку событий и публикацию запланированных событий.
https://github.com/hipjim/scala-event-bus
case class Msg(content: String)
val eb = EventBus()
eb.subscribe[Msg] { t =>
println(t.content)
}
for (i <- 1 to 100)
eb.post(Msg(i.toString))