Если это для одного приложения (то есть основного и нескольких потоков), 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, а также то, что вы не могли бы использовать.
В этом суть. Это должно дать вам достаточно веревки, чтобы держать вас в беде.