我創建了這個完全沒有用的示例,但是它的簡單性幫助我專注于重要的內容。 我將從后備操作中觸發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