簡體   English   中英

想在java中實現簡單的面向消息的中間件

[英]want to implement simple message oriented middleware in java

我的研究工作主要集中在用於傳感器和執行器增強系統的領域特定語言(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中存在的任何開源MOM,例如mom4jOpen Message QueueActiveMQ (以及其他)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM