Если вам нужно часто фильтровать по нескольким предикатам, вы можете определить способ их объединения:
case class And[A]( p1: A=>Boolean, p2: A=>Boolean ) extends (A=>Boolean) {
def apply( a: A ) = p1(a) && p2(a)
}
Вот как его использовать, чтобы оставить нечетные числа больше 10:
scala> (0 until 20) filter And( _ > 10, _ % 2 == 1 )
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(11, 13, 15, 17, 19)
Легко написать Or
и Not
комбинаторы одинаковым образом.
Я хочу протестировать его локально, поэтому я запуск двух отдельных экземпляров tomcat с приведенной выше конфигурацией.
Поскольку я только что отправил ответ на вопрос, связанный с Cherouvims , я просто хотел бы здесь также подчеркнуть, что они фактически предоставляют пример, делающий что-то похожее, по крайней мере (несколько узлов на хост, хотя только один экземпляр): см. раздел Полный пример в документации Распределенное кэширование RMI .
Действительно важно изменить порт TCP для каждого cacheManagerPeerListenerFactory
, но настройки многоадресной рассылки могут (я думаю, они должны) остаться прежними: вы можете увидеть это в действии в ehcache.xml для упомянутого выше Полного примера : номер порта увеличивается по одному с 40001 до 40006 на узел, при этом настройки многоадресной рассылки остаются идентичными.
Если вы выполнили это,ваша проблема может быть связана только с Tomcat, работающим в Windows - см. соответствующий абзац в разделе Общие проблемы в Распределенное кэширование RMI :
Ошибка в Tomcat и / или JDK, где любой слушатель RMI будет не запускается на Tomcat, если в пути установки есть пробелы.
[...]
По умолчанию в Windows Tomcat устанавливается в "Program Files", эта проблема возникает по умолчанию.
Для начала убедитесь, что на ваших серверах включена многоадресная рассылка. Не знаю, на какой платформе вы работаете.
В качестве быстрого продолжения.
Мы действительно заставили это работать с двумя отдельными машинами, что решило исходную проблему - заставить его работать вообще. Насколько я помню, многоадресная рассылка должна работать «из коробки», но ее стоит проконсультироваться с вашим локальным системным администратором (наш предложил настройку для multicastGroupAddress).
В конце концов мы столкнулись со всевозможными проблемами в Solaris и в итоге отказались от многоадресной рассылки для Вместо этого - ручное обнаружение одноранговых узлов .
Наконец, с точки зрения отладки, использование jconsole для отслеживания значений кеша оказалось лучшим способом сделать это. Не пришлось прибегать к обнюхиванию пакетов. : -)
Одна ошибка, с которой я столкнулся во время репликации однорангового узла EHCache . Это может быть полезно, если кто-то пытается выполнить одноранговую репликацию на одном локальном компьютере.
Я хотел запустить 3 экземпляра EhCache с одноранговой репликацией на одном компьютере с Windows Vista, используя peerDiscovery = automatic (конечной целевой средой была Linux).
Одноранговая репликация не работает. Как ни странно, все экземпляры EhCache запускались без каких-либо ошибок или жалоб в журнале.
Мне потребовалось время, чтобы понять свою ошибку; без чего-либо в журналах мне пришлось разобраться: я использовал тот же listenerPort (40001) в конфигурации однорангового прослушивателя для каждого из экземпляров EhCache. Использование разных listenerPorts (40001, 40002 ...) помогло.
<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
properties="port=40001, socketTimeoutMillis=3000"/>
<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
properties="port=40002, socketTimeoutMillis=3000"/>
Обратите внимание, что это конфигурация «однорангового прослушивателя», для которой требуются разные номера портов. Многоадресное «обнаружение одноранговых узлов» по-прежнему использует идентичные многоадресные адреса и номера портов для каждого экземпляра ehcache.
<cacheManagerPeerListenerFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"/>
просто выполняя вышеуказанное, ehcache будет использовать следующий доступный! Таким образом, вам не нужно беспокоиться о настройке новых узлов, которые вы хотите развернуть в кластере.