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

时间:2010-04-08 22:56:39

标签: java event-handling jms

我的应用程序需要根据发生的某些特定活动触发事件。我正在尝试确定是否应该使用类似于Java AWT的自定义侦听器使用Java EventObject创建自己的事件处理系统,还是应该使用JMS实现?我正在考虑apache的Qpid或ActiveMQ解决方案。我正在探索这些选项,并想知道是否有人有Qpid或ActiveMQ的经验,并可以提供一些建议(例如,专业人士,缺点考虑等)此外,如果有人有任何建议一个简单的事件处理系统的建议...如果在基于JMS的解决方案中考虑这一点,甚至是值得的。

4 个答案:

答案 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实例死亡的情况下保留任何尚未处理的消息/事件?如果是这样,您将需要一个外部消息队列。是否有任何其他应用程序需要发布/使用与此应用程序相同的消息?同样的事情。

相关问题