Java Message Distribution / Subscription? - PullRequest
0 голосов
/ 29 января 2009

Я создаю набор виджетов в Java, который декодирует и отображает сообщения, полученные через последовательный интерфейс.

Тип сообщения определяется уникальным идентификатором. Каждый виджет интересуется только определенным идентификатором.

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

Ответы [ 3 ]

1 голос
/ 29 января 2009

Если это для одного приложения (то есть основного и нескольких потоков), JMS является излишним.

Основой этого является простая очередь (из которых у Java есть несколько хороших, BlockingQueue машет рукой туда сзади).

Последовательный порт считывает свои данные, форматирует некоторый соответствующий объект сообщения и выгружает его в центральную очередь сообщений. Это может быть так же просто, как синглтоном BlockingQueue.

Далее вам понадобится прослушиватель / диспетчер очереди.

Это отдельный поток, который находится в очереди и ожидает сообщений.

Получив сообщение, он отправляет его ожидающим «виджетам».

Как он «знает», какие виджеты получают, что решать вам.

Это может быть простая схема регистрации:

String messageType = "XYZ";
MyMessageListener listener = new MyMessageListener();
EventQueueFactory.registerListener(messageType, listener);

Тогда вы можете сделать что-то вроде:

public void registerListener(String type, MessageListener listener) {
    List<MessageListener> listeners = registrationMap.get(type);
    if (listeners == null) {
        listeneres = new ArrayList<MessageListener>();
        registrationMap.put(type, listeners);
    }
    listeners.add(listener);
}

public void dispatchMessage(Message msg) {
    List<MessageListener> listeners = registrationMap.get(type);
    if (listeners != null) {
        for(MessageListener listener : listeners) {
            listener.send(msg);
        }
    }
}

Кроме того, если вы используете Swing, у него есть целый набор слушателей свойств Java Bean, а также то, что вы не могли бы использовать.

В этом суть. Это должно дать вам достаточно веревки, чтобы держать вас в беде.

1 голос
/ 29 января 2009

звучит как тема / подписка jms. зачем изобретать велосипед?

0 голосов
/ 29 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...