繁体   English   中英

具有侦听器的自定义Java事件与基于JMS的实现?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM