Ключ Ehcache неожиданно теряется при обработке событий Apache-Storm - PullRequest
0 голосов
/ 08 апреля 2019

Я разрабатываю простой тип обработки событий с Apache Storm и Ehcache для обработки данных от конкретного датчика.

Общий поток таков: когда данные датчика публикуются в redis, мой «Redis Spout» получает их и отправляет на следующий болт, а болт каждый раз получает данные из ehcache, чтобы получить основную информацию для обработки данных датчика ( Данные Ehcache создаются при запуске штормового движка).

Проблема в том, что, когда я запускаю штормовую машину на 2 разных компьютерах соответственно, а затем, когда данные создаются с датчика, 2 приложения подписывают данные случайным образом. Кажется, все идет хорошо ... но вдруг одно из приложений не может получить данные из кеша с подписанным ключом. Ключ отправляется с данными датчика, и я подтвердил, что ключ существует, прежде чем перейти к методу .get (key). Но после того, как get (key) возвращает null и getKeys () также ничего не получает. (Ehcache синхронизируется в каком-то другом процессе, поскольку данные ehcache обновляются на веб-странице)

Работа только с одним приложением работает нормально, но запуск двух приложений одновременно всегда приводит к тому, что кэш некоторых приложений становится пустым.

Я использую net.sf.ehcache 2.10.6. Можете ли вы дать мне какие-либо предложения? И я путаюсь, нормально ли получать данные из ehcache каждый раз, когда огромное количество данных с датчиков поступает очень часто (0,1-1 с) через Apache Storm Engine ...

  public static synchronized Cache getCache(String cacheName) {
Cache cache = null;
CacheManager cacheManager = CacheManager.getInstance();
if (cacheManager == null) {
  URL configurationFileURL = Constants.class.getResource("/Constants.xml");
  cacheManager = CacheManager.create(configurationFileURL);

} else {            
  cache = cacheManager.getCache(cacheName);

}
return cache;}

  public static List<PrepObject> getPrepObjectCacheData(String epId) {
List<PrepObject> list = new ArrayList<PrepObject>();
Cache prepObjectCache = getCache(prepCache);
if (prepObjectCache != null) {
  if (prepObjectCache.isKeyInCache(epId)) {
    Element element = prepObjectCache.get(epId);
    list = (List<PrepObject>) element.getObjectValue();

  } else {
    LOGGER.info(
        String.format("the element %s has not been found in the cache %s", epId, prepCache));
  }

} else {
  LOGGER.info(String.format("The cache %s has not been found in the cacheManager.", prepCache));
}
return list;}
...