Подключение нескольких клиентов Flex к одному классу Java - PullRequest
0 голосов
/ 02 декабря 2010

У меня есть многопользовательское приложение, состоящее из Flex-клиента и Blazeds / Spring / Java-бэкэнда - у меня основные элементы работают нормально, т.е. отправка сообщений по назначению, потребления и производства. Клиенты Flex могут отправлять и получать строки из этого класса без проблем. Я хочу, чтобы 2 клиента имели доступ к одной и той же переменной. В этом грубом примере я посылаю guid от каждого SWF-файла, который добавляю к строке _players на стороне сервера. Происходит следующее: когда я запускаю Swf A, он снова получает свой guid, как и Swf B. Затем Swf A получает guid из Swf B, но Swf B не получает Swf A. Кстати, это тот же самый код swf, только что запущенный дважды каждый в другом браузере.

Кто-нибудь может увидеть, где я ошибаюсь или что может быть лучшим решением?

public class GameFeed {

    private static GaneFeedThread thread;

    private final MessageTemplate template;

    public GameFeed(MessageTemplate template) {
        this.template = template;
    }

    public void start() {
        if (thread == null) {
            thread = new GaneFeedThread(this.template);
            thread.start();
        }
    }

    public void stop() {
        thread.running = false;
        thread = null;
    }

    public static class GaneFeedThread extends Thread {

        public boolean running = false;

        private final MessageTemplate template;

        public GaneFeedThread(MessageTemplate template) {
            this.template = template;
        }

        private static String _players;

        public void addPlayer(String name)
        {
            _players += name + ",";
        }
        while (this.running) {


                this.template.send("game-feed", _players);

        }

Ответы [ 3 ]

0 голосов
/ 02 декабря 2010

У вас проблемы с потоками в вашем классе. Не уверен, что это является причиной вашей проблемы - но это может.

Появляется, что вы делитесь данными через переменную _player. Но эта переменная не является потокобезопасной. У него две основные проблемы:

  • выпуск 1: если два клиента вызывают метод addPlayer одновременно - неясно, что происходит с переменной проигрывателя - хотя бы вы могли получить что-то вроде потерянного обновления
  • проблема 2: (возможно, это и есть причина) - Модель памяти Java не гарантирует, что переменная _player обновляется в обоих потоках без надлежащего управления параллелизмом.

Чтобы исправить это, вы должны сделать две вещи:

  • first: wrap _players += name + ","; в синхронизированном блоке (для выпуска 1)
  • секунда: пометить _players как volatile (для выпуска 2)

@ см. http://jeremymanson.blogspot.com/2008/11/what-volatile-means-in-java.html

0 голосов
/ 02 декабря 2010

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

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

0 голосов
/ 02 декабря 2010

Вероятно, это предотвращает сервер. Традиционно данные, которые должны быть разделены между клиентами или сохранены иным образом, записываются в БД или другой источник данных. Вы могли бы преуспеть с базой данных в памяти. На большинстве веб-серверов один из них настроен «из коробки» с использованием HSQLDB или Derby .

...