Подтвердить что ты не робот

Как уведомить все (одинаковые) Singleton beans в кластере Glassfish 3.1?

У меня есть приложение JEE6, которое работает на кластере Glassfish 3.1.2. Один @Singleton Bean содержит какой-то (readolny) кеш. Пользователь может нажать кнопку в графическом интерфейсе, чтобы обновить кеш с (обновленным) контентом из базы данных.

Это хорошо работает в кластерной среде, но теперь нам нужно переключиться на кластер.

Итак, я столкнулся с проблемой, что, когда пользователь нажимает эту кнопку обновления, обновляется только Cache Singleton с его сервера node. Мой вопрос в том, что было бы самым простым способом сделать другие синглтоны (в других узлах) также обновлять данные?

Я знаю вопрос Singleton в среде кластеров, но мой вопрос специфичен для Glassfish (потому что я надеюсь, что есть некоторая поддержка сборки), другая с "Websphere". И мой вопрос о JEE6, другой старше, чем JEE6.

4b9b3361

Ответ 1

Руководство по администрированию высокой доступности GlassFish явно указывает:

Ограничения

При настройке продолжительности сеанса и отказоустойчивости обратите внимание на следующее: Ограничения:

  • Когда сеанс завершается с ошибкой, любые ссылки на открытые файлы или сетевые соединения теряются. Приложения должны быть закодированы с учетом этого ограничения.

  • EJB Singletons создаются для каждого экземпляра сервера в кластере, а не один раз для кластера.

Еще одно предложение - использовать JMS и нажать кнопку GUI, чтобы отправить сообщение в тему JMS. Все Singleton beans могут подписаться на эту тему, и получение сообщения приведет к тому, что все они будут обновляться из базы данных почти одновременно. Преимущество такого подхода состоит в том, что он использует больше встроенных функций Glassfish, не обязательно привнося в другие рамки.

В любом случае переход от одного экземпляра к нескольким экземплярам никогда не является по-настоящему бесшовным изменением и будет создавать определенные трудности. Вероятно, необходимо будет внести изменения в приложение, чтобы убедиться, что все соответствующие состояния (кроме состояния сеанса) распределены правильно ко всем экземплярам кластера.

Ответ 2

К сожалению, нет встроенного способа достижения того, чего вы хотите, но структура shoal, которую Glassfish основывает на своей кластеризации, может помочь вам прочь. Вы можете решить проблему либо путем отправки уведомлений членам кластера, чтобы обновлять их кеши, либо путем замены вашего текущего кеша на распределенный.

Ниже приведен пример, использующий сортировку для отправки уведомлений:

@Startup
@Singleton
public class Test {

private String groupName = "mygroup";
private String serverName = System.getProperty("HTTP_LISTENER_PORT");
private GroupManagementService gms;

@PostConstruct
public void init() {
    Runnable gmsRunnable = GMSFactory.startGMSModule(serverName, groupName,
            GroupManagementService.MemberType.CORE, null);
    gms = (GroupManagementService) gmsRunnable;
    try {
        gms.join();
        gms.addActionFactory(new MessageActionFactory() {

            @Override
            public Action produceAction() {
                return new MessageAction() {

                    @Override
                    public void consumeSignal(Signal signal)
                            throws ActionException {
                        // Update your cache here
                    }
                };
            }
        }, groupName);
    } catch (GMSException e) {
        Logger.getAnonymousLogger().severe(e.getMessage());
    }
}

@PreDestroy
public void cleanup() {
    gms.shutdown(GMSConstants.shutdownType.INSTANCE_SHUTDOWN);
}

/**
 * Call this from your button click.
 */
public void updateCache() {
    try {
        byte[] message = new byte[] {};
        gms.getGroupHandle().sendMessage(groupName, message);
    } catch (GMSException e) {
        Logger.getAnonymousLogger().severe(e.getMessage());
    }
}
}

Если вы хотите использовать распределенный кеш:

            DistributedStateCache cache = gms.getGroupHandle().getDistributedStateCache();

Элементы, помещенные в кеш, будут реплицироваться на другие узлы кластера.

Ответ 3

Взгляните на JGroups. Это кадр для надежной многоадресной передачи. В настоящее время механизмы кластеризации JBoss основаны на этом инструменте.

Вы можете проверить пример использования JGroups здесь.