java - 想在java中实现简单的面向消息的中间件

标签 java dsl middleware

我的研究工作重点是用于传感器和执行器增强系统的领域特定语言 (DSL)。

我想快速测试我的 DSL(在 Java 中),它使用面向消息的中间件(其任务只是启用 DSL 的软件组件之间的通信)。

通信意味着简单的发布/订阅、事件通知、过程调用。

你能建议我一个用 Java 实现简单中间件的快速方法吗?我只想在我的单台机器上测试我的 DSL。

最佳答案

感谢 StackOverflow 社区帮助我回答问题。 Stackoverflow 真的很棒!! 2个月前,我问过上述问题。现在,我想出了“用于单台 PC 的简单的面向消息的中间件”。我想为这个社区贡献简单的面向消息的中间件。如果您有理解上的困难,请告诉我。

import java.util.HashSet;
import java.util.Hashtable;
import java.util.Map;
import java.util.Set;

public class PubSubMiddleware {

    private Map<String, Set<Subscriber>> subscriberMap = new Hashtable<String, Set<Subscriber>>();
    private Map<String, Set<CommandListener>> registeredInstanceMap = new Hashtable<String, Set<CommandListener>>();


    static PubSubMiddleware singletonInstance;

    public static PubSubMiddleware getInstance() {
        if (singletonInstance == null) {
            singletonInstance = new PubSubMiddleware();
        }
        return singletonInstance;
    }

    public void subscribe(Subscriber s, String eventSignature) {

        registerNewSubscriber(s, eventSignature);
    }

    public void publish(String eventName, Object arg) {

        Set<Subscriber> subscriberEventSet = getSubscribersForEvent(eventName);

        if (subscriberSet != null) {
            for (Subscriber s : subscriberSet) {
                s.notifyReceived(eventName, arg);
            }
        }

    }
    private void registerNewSubscriber(Subscriber s, String eSig) {

    if (subscriberMap.containsKey(eSig)) {

            Set<Subscriber> tempSet = subscriberMap.get(eSig);

            tempSet.add(s);
        } else {
            Set<Subscriber> newSet = new HashSet<Subscriber>();
            newSet.add(s);
            subscriberMap.put(eSig, newSet);
        }
    }

    private Set<Subscriber> getSubscribersForEvent(String eventSignature) {
        return subscriberMap.get(eventSignature);
    }

    // Request-Response

    public Object sendCommand(String methodName, Object arg) {

        Set<CommandListener> registeredInstanceSet = getInstanceForCommand(methodName);

        if (registeredInstanceSet != null) {
            for (CommandListener s : registeredInstanceSet) {
                return s.commandReceived(methodName, arg);
            }
        }
        return null;
    }

    private Set<CommandListener> getInstanceForCommand(String methodName) {
        return registeredInstanceMap.get(methodName);
    }

    private void registerNewInstance(CommandListener s, String listnerSignature) {


        if (registeredInstanceMap.containsKey(listnerSignature)) {
            Set<CommandListener> tempSet = registeredInstanceMap
                    .get(listnerSignature);
            tempSet.add(s);
        } else {
            Set<CommandListener> newSet = new HashSet<CommandListener>();
            newSet.add(s);
            registeredInstanceMap.put(listnerSignature, newSet);
        }
    }

    public void registerInstance(CommandListener s, String listnerSignature) {
        registerNewInstance(s, listnerSignature);
    }

}

关于java - 想在java中实现简单的面向消息的中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9656841/

相关文章:

node.js - reducer 和中间件有什么区别?

python - Django:如果用户没有注销,我如何检查用户的最后事件时间?

java - 在 netbeans 中从数据库创建实体类时如何过滤表?

带 block 的 ruby​​ 哈希树

node.js - Nodejs 模板系统文档

java - 如何通过网络将鼠标/键盘输入发送到另一个对等点?

java - 获取java项目中的包列表

java - TextView 作为属性?

java - Hibernate 事务从另一个事务抛出异常

ruby - 在 REPL 或 irb 中重用 Ruby DSL?