【问题标题】:want to implement simple message oriented middleware in java想在java中实现简单的面向消息的中间件
【发布时间】:2012-03-11 16:45:24
【问题描述】:

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

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

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

您能否建议我一种快速实现Java 中的简单中间件 的方法?我只想在我的单台机器上测试我的 DSL

【问题讨论】:

    标签: java dsl middleware


    【解决方案1】:

    感谢 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);
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      尝试使用 Java 中现有的任何开源 MOM,例如 mom4jOpen Message QueueActiveMQ(等等)。

      【讨论】:

      • 感谢奥斯卡的指点。上面列出的中间件不是也有明显的学习曲线和容易出错的吗?
      • @PankeshPatel 没有,他们有很好的文档。实施您自己的消息传递解决方案将具有更陡峭的学习曲线并且更容易出错,所以不要重新发明轮子:)
      猜你喜欢
      • 2018-05-04
      • 2013-05-01
      • 1970-01-01
      • 2012-02-25
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      • 2017-12-04
      相关资源
      最近更新 更多