【发布时间】:2012-03-11 16:45:24
【问题描述】:
我的研究工作专注于传感器和执行器增强系统的领域特定语言 (DSL)。
我想快速测试我的 DSL(在 Java 中),它使用面向消息的中间件(其任务是启用 DSL 的软件组件之间的通信)。
通信意味着简单的发布/订阅、事件通知、过程调用。
您能否建议我一种快速实现Java 中的简单中间件 的方法?我只想在我的单台机器上测试我的 DSL。
【问题讨论】:
标签: java dsl middleware
我的研究工作专注于传感器和执行器增强系统的领域特定语言 (DSL)。
我想快速测试我的 DSL(在 Java 中),它使用面向消息的中间件(其任务是启用 DSL 的软件组件之间的通信)。
通信意味着简单的发布/订阅、事件通知、过程调用。
您能否建议我一种快速实现Java 中的简单中间件 的方法?我只想在我的单台机器上测试我的 DSL。
【问题讨论】:
标签: java dsl middleware
感谢 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,例如 mom4j、Open Message Queue 或 ActiveMQ(等等)。
【讨论】: