我正在用Java创建一组小部件,用于解码和显示从串行接口接收到的消息。
消息类型由唯一标识符定义。每个小部件只对一个特定的标识符感兴趣。
如何对应用程序进行编程,以便将消息正确地分发到相关的小部件?
发布于 2009-01-29 01:32:47
如果这是针对单个应用程序(例如,一个主线程和几个线程),那么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属性侦听器,您也可以利用它们。
这就是它的核心。这应该会给你足够的绳子来让你陷入麻烦。
发布于 2009-01-29 01:15:05
听起来像是jms主题/订阅。为什么要重新发明轮子呢?
发布于 2009-01-29 01:28:37
要做到这一点,一种简单的方法是通过ID将每个小部件添加到地图中,并通过从地图中提取消息并对其调用某些方法来向小部件提供每条消息。这意味着每个小部件都必须实现一个接口,您可以调用该接口来显示消息。如果小部件不在您的控制范围内,那么您可以创建一个瘦包装器类(实现一个接口),并将这个包装器类(带有一个小部件)添加到映射中,每个ID一个实例。
https://stackoverflow.com/questions/490134
复制相似问题