Я разрабатываю простой тип обработки событий с 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;}