LINUX.ORG.RU

хочу фильтрацию сообщений в akka

 ,


0

1

Доброго. Хочу странного, может быть, но:

Есть у меня некоторое количество акторов такого вида

class Device(x:Double, y:Double, r:Double)

Могу ли я сделать на уровне самой akka так, чтобы device1 отправлял device2 ! msg только в том случае, если выполняется некоторое условие cond(device1, device2):Bool

Сейчас:

trait DeviceMsg{
  val sender:ActorRef
  val x:Double
  val y:Double
}

//и в акторе самом

def filteredMsg(msg:DeviceMsg) =
    Some(msg)
    .filter(m=>inArea(m.x,m.y))

но это ерунда какая-то.

★★★★★

Последнее исправление: RedPossum (всего исправлений: 1)

Ответ на: комментарий от anonymous

что значит в пределах?

да это абсолютно не важно для задачи. Надо просто условие чтобы соблюдалось некоторое для передачи, а условие было функцией от двух акторов.

в пределах зоны видимости. то есть чтобы D1(x1,y1,r1) мог отправить сообщение D2(x2,y2,r2) надо чтобы выполнялось sqrt((x1-x2)^2+(y1-y2)^2)<=r1

RedPossum ★★★★★
() автор топика
Ответ на: комментарий от RedPossum

я всё равно не понял.

1. ты можешь сделать таймер, который будет проверять чтобы условие выполянлось и отправлять сообщение.

2. возможно здесь поможет rx

3. отправлять непосредственно из классов Device сообщения на шину, если они подходят (event bus)

anonymous
()
Ответ на: комментарий от anonymous

Ну смотри, я тут балуюсь с симуляцией беспроводных сетевых устройств с akka. У каждого актора в системе есть 3 параметра (x,y) - текущие координаты и r - радиус действия.

надо чтобы сообщения доходили до другого актора только если этот другой актор находится в пределах r.

3. отправлять непосредственно из классов Device сообщения на шину, если они подходят (event bus)

я щас примерно так и делаю. Но что-то это мне не нравится.

RedPossum ★★★★★
() автор топика
Ответ на: комментарий от RedPossum

при условии что device1 о device2 ничего знать не должен вроде как, логично что делать это надо на уровне выше. То есть либо делать актор контроллер, через который все это проходит, (x,y,r) пихать в сообщения. Либо должно быть что-то стандартное.

RedPossum ★★★★★
() автор топика
Ответ на: комментарий от RedPossum

контроллер делай, в акке нету того что тебе надо.

или можно при создании девайса сразу ему передавать близкие девайсы и отправлять им.

anonymous
()
Ответ на: комментарий от anonymous

алсо можно отправлять всем девайсам, и потом это идёт на все девайсы, а непосредственно в дейвайсе фильтруется на входе, там же можно взять отправителя и посмотреть r

anonymous
()
Ответ на: комментарий от anonymous

там же можно взять отправителя и посмотреть r

чет я не совсем понимаю как, мы же знаем о отправителе только ActorRef. то есть получится что-то такое

(context.sender() ? GetR) match{
case Success(r) => ???//и тут проверка
case Failure => ???
}

страшно жеж

алсо можно отправлять всем девайсам,

ну бродкаст тоже надо делать, да

RedPossum ★★★★★
() автор топика
Последнее исправление: RedPossum (всего исправлений: 1)
Ответ на: комментарий от anonymous

отправлять сообщение вида Msg(self)

ну вот прямо сейчас я как-то так и делаю. Надо только через контроллер все пропускать, так к предметной области ближе.

А еще я вот чего нашел http://doc.akka.io/docs/akka/1.3.1/scala/routing.html , буду почитать

RedPossum ★★★★★
() автор топика

Господи Иисусе, вот говорили «борщевики», «бомжи», а даже на ЛОРе теперь скала поселилась!

stevejobs ★★★★☆
()
Ответ на: комментарий от RedPossum

а я не кложурист, а джавист. Попробовал кложуру и ниасилил. (в смысле - ниасилил не сам синтаксис, а практическое применение. (это, наверное, ничего не говорит о кложуре, только о моем криворучии)

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 2)
Ответ на: комментарий от RedPossum

Сразу хардкор, лютые однострочники (из функций, которые нужно предварительно изучать - свои велосипеды выглядят ужасающе), а вместо ошибок в рантайме - нечитаемая каша. Я юзаю скалу именно как better java, а можно как-то по другому?

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

Можно так:

лютые однострочники (из функций, которые нужно предварительно изучать - свои велосипеды выглядят ужасающе), а вместо ошибок в рантайме - нечитаемая каша

Я вот докатился до того, что простые проверки условий делаю так: Some(value).filter(condition(_)). Но это свои велосипеды, там можно.

RedPossum ★★★★★
() автор топика
Последнее исправление: RedPossum (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.