Singleton vs Stateful удаленных ссылок EJB в кластерах - PullRequest
3 голосов
/ 28 марта 2011

Я использую ванильный сервер JBossAS 6 с парой проектов для тестирования функциональности кластерных сред JBoss.Проблема, с которой я столкнулся, заключается в том, что если я передам ссылку на EJB из одного EJB (другого типа) в узле на экземпляр того же типа в другом узле, при вызове метода выдается исключение, заявляющее, что long_alphanumeric_key ключ для указанного компонента не зарегистрирован в кэше (InfinispanStatefulCache).

Дело в том, что при использовании аннотации Singleton вместо аннотации Stateful на объекте, который мне нужно перенести, переданные объекты работают безупречно, успешно вызывая методы общего EJB-компонента на сервере, где он был создан.Проблема в том, что этот случай имеет тот же недостаток, что и HA-Singleton.Все переданные ссылки были получены ранее путем поиска по дереву HA-JNDI.

Некоторое понимание того, чего я пытаюсь достичь:

Что мне в данный момент нужно, так эторазделять один экземпляр Stateful EJB между узлами, например HA-Singleton.Причина, по которой не используется HA-Singleton, заключается в том, что состояние этого типа синглетонов поддерживается исключительно на главном узле кластера, поэтому, если узел отключается или происходит сбой, состояние экземпляра теряется.

Использование bean-компонента Stateful позволило бы мне поддерживать состояние в кластере, предотвращая тем самым потерю состояния при сбое на узле.Я еще не до конца понял, как работает кэш JBoss и Infinispan, но насколько я прочитал, @ Clustered аннотированное состояние bean-компонентов автоматически реплицируется в кластере.

Мы уже были предупреждены о проблемах использования Singletons и HA-Singletons в текущей версии JBoss, поэтому любые документы или шаблоны, помогающие решить эту проблему, будут приветствоваться.

Кроме того, я был бы признателенлюбая документация, которая может дать мне представление о том, как работает кэш Infinispan и кластеризация JBoss.До сих пор материал, который я читал, был смешан со старыми версиями JBoss, где вместо Infinispan использовался JBossCache.

Спасибо заранее,
Немецкий

1 Ответ

2 голосов
/ 13 февраля 2012

К сожалению, JBoss AS6 или AS7 еще не поддерживает кластерные синглтоны EJB - я думаю, это именно то, что вы ищете. HA-Singleton обеспечит запуск только одного экземпляра какой-либо службы только на одном узле кластера. Это не похоже на ваш вариант использования. Похоже, вам действительно нужно только распределить состояние синглтона EJB. Вот что я бы порекомендовал: использовать локальный синглтон EJB, но использовать Infispan для хранения его распределенного состояния: * Для начала я бы рекомендовал использовать AS7 вместо AS6, поскольку интеграция с Infinispan более зрелая. * В AS7 вы можете напрямую использовать бесконечный кэш в вашем синглтоне. например,

@Singleton
public class MySingleton {
  // This references the same infinispan cache container used for sfsb replication
  @Resource(lookup="java:jboss/infinispan/container/ejb")
  private CacheContainer container;
  private Cache<?, ?> cache;

  @PostContruct
  public void init() {
    // This will create a cache for use by this singleton
    // Any state to be distributed should be stored in the cache.
    this.cache = container.getCache(this.getClass().getName());
  }

  @PreDestroy
  public void destroy() {
    this.cache.stop();
  }
}
...