我创建了这个完全没有用的示例,但是它的简单性帮助我专注于重要的内容。 我将从后备操作中触发LogEvent,该事件将记录到java.util.Logger中。
我需要做的第一件事是创建一个包含我的日志消息和LogLevel的POJO。
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;}
}
现在有了数据包装器,我需要一些东西来触发该事件,并需要一些东西来拾取它。 我创建的第一件事是触发事件的方法。
由于CDI,我可以注入事件。
@Inject Event<LogMessage> event;
所以我们只需要解雇它。
event.fire(new LogMessage("Log it baby!", Level.INFO));
现在触发了该事件,如果没有人注册该事件,该事件将消失,从而创建一个侦听器。 侦听器需要一种具有一个参数的方法,该参数是上一个事件的通用类型。 LogMessage。
public class LogListener {private static final Logger LOGGER = Logger.getAnonymousLogger();public void process(@Observes LogMessage message){LOGGER.log(message.getLevel(), message.getMessage());}
}
@Observes批注使用LogMessage侦听所有事件。 触发事件时,将触发此方法。
这是创建松耦合应用程序的一种非常不错的方法,您可以在这些事件侦听器中分离繁重的操作或封装不太重要的操作。
所有这些都是同步发生的。 当我们想用对记录表的慢速数据库调用来替换log语句时,我们可以使我们的操作比应有的繁重。
我正在寻找的是创建一个异步调用。 只要我们支持EJB,就可以通过在其之上添加@Stateless批注将侦听器转换为EJB。 现在,它是一个无状态的企业bean。 这对我们的同步/异步问题没有任何改变,但是EJB 3.1支持异步操作。 因此,如果我们还在其顶部添加@Asynchronous批注。 它将异步执行我们的日志记录语句。
@Stateless
@Asynchronous
public class LogListener {private static final Logger LOGGER = Logger.getAnonymousLogger();public void process(@Observes LogMessage message){LOGGER.log(message.getLevel(), message.getMessage());}
}
如果我们想将数据库日志记录和控制台日志记录结合起来,我们可以创建多个侦听同一事件的方法。
这是创建具有非常灵活的组件的轻量级应用程序的好方法。 解决此问题的另一种方法是使用JMS,但您不希望为这种松散耦合配置重量级的配置。
参考: Java EE6 Events,这是我们的JCG合作伙伴 Jelle Victoor在Styled Ideas Blog上 对JMS的轻量级替代 。
- Java EE6装饰器:在注入时装饰类
- 基本的EJB参考,注入和查找
- Java EE过去,现在和云7
- JBoss AS 7.0.2“ Arc”发布–使用绑定选项
- Java EE中的配置管理
- Java教程和Android教程列表
翻译自: https://www.javacodegeeks.com/2011/10/java-ee6-events-lightweight-alternative.html