我的应用程序需要根据发生的某些特定活动触发事件。我正在尝试确定是否应该使用类似于Java AWT的自定义侦听器使用Java EventObject创建自己的事件处理系统,还是应该使用JMS实现?我正在考虑apache的Qpid或ActiveMQ解决方案。我正在探索这些选项,并想知道是否有人有Qpid或ActiveMQ的经验,并可以提供一些建议(例如,专业人士,缺点考虑等)此外,如果有人有任何建议一个简单的事件处理系统的建议...如果在基于JMS的解决方案中考虑这一点,甚至是值得的。
答案 0 :(得分:2)
简单事件侦听器(在Java AWT中使用)要求事件在同一个虚拟机中立即处理,并且通常在同一个线程内。
JMS(例如使用ActiveMQ)允许稍后处理事件(可选地缓冲持久存储中的消息),以及其他虚拟机/线程中的事件。这种灵活性是以额外的复杂性和低效率为代价的。
答案 1 :(得分:1)
您没有对应用程序说太多,但如果您需要一个简单的事件处理系统,请查看EventBus。
答案 2 :(得分:1)
2016年更新
Altho java事件是在2006年添加的,这个问题是从2010年开始的,这些仍然是Java API中的某些“隐藏”功能,阅读这个问题我相信一个替代方案可以完全满足你想要的Java事件,但是不是AWT Java 6事件中的那些事件,它允许你解耦你的项目模块并且没有服务器就具有类似JML的功能,与JMS相比,事件的唯一缺点是监听器必须正在运行,否则消息将是失去了遗忘。
来自:https://dzone.com/articles/java-ee6-events-lightweight
哟创建一条消息:
public class LogMessage implements Serializable {
private final String message;
private final Level level;
LogMessage(String message, Level level) {
this.message = message;
this.level = level;
}
public String getMessage() {
return message;
}
public Level getLevel() {
return level;
}
}
您创建了一个制作人:
@Inject Event<LogMessage> event;
event.fire(new LogMessage("Log it baby!", Level.INFO));
最后,您创建了一个消费者:
public class LogListener {
private static final Logger LOGGER = Logger.getAnonymousLogger();
public void process(@Observes LogMessage message){
LOGGER.log(message.getLevel(), message.getMessage());
}
}
查看@Observes注释。
所有这些都是同步完成的,以便更多jms / like你想以异步方式进行这个过程,为此只需添加:
@Stateless
@Asynchronous
public class LogListener {
private static final Logger LOGGER = Logger.getAnonymousLogger();
public void process(@Observes LogMessage message){
LOGGER.log(message.getLevel(), message.getMessage());
}
}
答案 3 :(得分:0)
您是否希望在JVM实例死亡的情况下保留任何尚未处理的消息/事件?如果是这样,您将需要一个外部消息队列。是否有任何其他应用程序需要发布/使用与此应用程序相同的消息?同样的事情。