[英]Custom Java events with listeners vs. a JMS based implementation?
我的应用程序要求根据发生的某些特定活动触发事件。 我正在尝试确定是否应该使用类似于Java AWT的自定义侦听器使用Java EventObject创建自己的事件处理系统,还是应该使用JMS实现? 我正在考虑apache的Qpid或ActiveMQ解决方案。 我正在探索这些选项,并想知道是否有人有Qpid或ActiveMQ的经验,并可以提供一些建议(例如,专业人士,缺点考虑等)此外,如果有人有任何建议一个简单的事件处理系统的建议...如果在基于JMS的解决方案中考虑这一点,甚至是值得的。
简单事件侦听器(在Java AWT中使用)要求事件在同一虚拟机内立即处理,并且通常在同一线程内。
JMS(例如使用ActiveMQ)允许稍后处理事件(可选地缓冲持久存储中的消息),以及其他虚拟机/线程中的事件。 这种灵活性是以额外的复杂性和低效率为代价的。
您没有多说您的应用程序,但如果您需要一个简单的事件处理系统用于单个虚拟机,请查看EventBus 。
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());
}
}
您是否希望在JVM实例死亡时保留任何尚未处理的消息/事件? 如果是这样,您将需要一个外部消息队列。 是否有任何其他应用程序需要发布/使用与此应用程序相同的消息? 一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.