Java消息分发/订阅?

时间:2009-01-29 01:11:42

标签: java

我在Java中创建了一组小部件,用于解码和显示在串行接口上​​接收的消息。

消息类型由唯一标识符定义。 每个小部件仅对特定标识符感兴趣。

如何以一种将消息正确分发到相关小部件的方式对应用程序进行编程?

3 个答案:

答案 0 :(得分:1)

听起来像是一个jms主题/订阅。为什么重新发明轮子?

答案 1 :(得分:1)

如果这是针对单个应用程序(即主线程和几个线程),则JMS过度。

这个基础知识是一个简单的队列(其中Java有几个好的队列,BlockingQueue在那里挥舞着它的手)。

串行端口读取其数据,格式化某个相关的消息对象,并将其转储到中央Message Queue上。这可以像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属性监听器,你也可以利用它们。

这是它的核心。这应该给你足够的绳索让你陷入困境。

答案 2 :(得分:0)

执行此操作的一种简单方法是按ID将每个窗口小部件添加到地图,并通过将每个窗口小部件拉出地图并在其上调用某个方法来向窗口小部件提供每条消息。这意味着每个小部件都必须实现一个可以调用以显示消息的接口。如果窗口小部件不在你的控件中,那么你可以创建一个瘦的包装类(实现一个接口),并将这个包装类 - 一个小部件 - 添加到地图中,每个ID一个实例。