2015-05-06 2 views
2

Я написал топологию шторма и задал номер своих рабочих 1. Итак, я думаю, что все его компоненты должны работать в одном процессе. И я хочу разделить общий объект между несколькими компонентами в топологии, поэтому я использую singleton pattern: 1, я инициализирую объект singleton, когда был открыт уникальный носик. 2, Затем я использую объект singleton в других компонентах, вызывая функцию getInstance().singleton pattern в штормовой топологии

Но я обнаружил, что получаю разные объекты между различными компонентами.

Спасибо за ваши ответы. Ключевой код задачи перечислены ниже: Код класса синглтон:

public class TraceApplicationContext { 
    private volatile static TraceApplicationContext instance = new TraceApplicationContext(); 
    private TraceApplicationContext() { 

    } 
    public static TraceApplicationContext getInstance() { 
     return instance; 
    } 
} 

SpoutA код класса:

public class SpoutA extends BaseRichSpout { 
    public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) { 
     TraceApplicationContext.getInstance().init(); 
    } 
} 

Болта код:

public class BoltA extends BaseRichBolt { 
    private static JedisCluster jedisCluster = TraceApplicationContext.getInstance().getJedisCluster(); 
} 

код BoltB :

public class BoltB extends BaseRichBolt { 
    private static JedisCluster jedisCluster = TraceApplicationContext.getInstance().getJedisCluster(); 
} 

После инициализации одноэлементного объекта TraceApplicationContext в SpoutA я проверяю возврат объекта TraceApplicationContext.getInstance(). GetJedisCluster(), это не null. Но я проверяю его в BoltA и BoltB, объект, возвращаемый TraceApplicationContext.getInstance(). GetJedisCluster() имеет значение null.

У кого-нибудь была такая же проблема или вы знали, что не так с такой проблемой?

Пожалуйста, помогите! Спасибо!

+0

Пожалуйста, покажите код, или мы не сможем помочь. – Dragondraikk

+0

отправьте свой код. – Zealous

+0

Я добавил код ключа, пожалуйста, помогите. Благодаря! – Snail

ответ

1

Если вы убедитесь, что все ваши процессы запущены в одной JVM, попробуйте реализовать Singleton как Enumeration одного элемента. Это должно решить любую возможную проблему совпадения с инициализацией объекта.

Например:

Реализация как

public class MySingleton { 
    private static MySingleton instance; 
    private MySingleton() { ... } 
    public static MySingleton getInstance() { 
     if (instance == null) { instance = new MySingleton() } 
     return instance; 
    } 
} 

склонен к проблемам параллелизма. Тем не менее, подобный этому

public enum MySingleton { 
    INSTANCE; 

    private MySingleton() {...} 
} 

Должен работать везде.

+0

+1, проблема с кодом OPs заключается в том, что он пытается вызвать метод init() в своем носике. Создание экземпляра должно обрабатываться внутри Singleton автоматически. –

2

Если вы не можете использовать перечисление, как @Jorge_B говорит, что вы можете использовать синхронизированный блок в getInstance() методом

public class MySingleton { 
    private static volatile MySingleton instance; 
    private MySingleton() { ... } 
    public static MySingleton getInstance() { 
     if (instance == null) { 
      synchronized(MySingleton.class) { 
       if (instance == null) { 
        instance = new MySingleton(); 
       } 
      } 
     } 
     return instance; 
    } 
} 

http://en.wikipedia.org/wiki/Singleton_pattern


EDIT

Но это может быть не a singleton problem

Тот факт, что e getJedisCluster() возвращение разных значений не означает, что это не тот же синглтон, а скорее, что состояние синглтона изменилось.

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

private final JedisCluster jedisCluster; 

, если вы не можете попытаться отследить, когда jedisCluster меняется: использование сеттера ...

0

Как с моим опытом, я использовал одноплодную Кассандру объект сессии, в а также singleton для свойств приложения в моей топологии шторма. Поскольку эти одноэлементные объекты не имеют какого-либо изменяющегося состояния, даже если у нас есть несколько WorkerProcess (WP) (то есть одна JVM для каждого WP), каждый WP будет иметь копию синглтона и может быть использован без проблем.

Что касается наилучшей практики, то лучше указать статические синглтоны на объект конфигурации при отправке топологии, а метод подготовки предоставит ее отдельным задачам.

https://groups.google.com/forum/#!topic/storm-user/rWeQpGEnT9Q

Смежные вопросы