23.5. 消息的详细控制

上面已经用@RaiseEvent和@EventListener完成了消息的广播和监听。实际上我们还可以对消息进行更详细的控制。

程序员申请费用,现在项目经理和部门经理都通过事件机制知道此事了。我们希望在同一个方法中,对事件进行分类: 如果费用小于 等于100,那么,就发送一个 applyLittleFee 的事件,如果费用大于100,则发送一个 applyMuchFee 的事件;项目经理关注 applyLittleFee 事件,而部门经理关注 applyMuchFee 的事件。ApplyBean修订如下:

public class ApplyBean {
  @Bind
  private int money;
  @Inject
  private EventBroadcaster event;

  @Action	
  public void apply(){
    System.out.println("I'm a programmer, I apply " + money + " money");
    if(money <=100) 
      event.broadcast(this, "applyLittleFee", money);
    else 
      event.broadcast(this, "applyMuchFee", money);
  }
}

此处的EventBroadcaster(事件发送对象)被注入,通过此对象,你对“发送什么事件”、“何时发送事件”都能够进行详细的控制。

这样项目经理和部门经理就可以分别监听applyLittleFee和applyMuchFee消息了。ProjectManagerBean与DepartManagerBean修订如下:

@ManagedBean(name="projectManagerBean", scope=ManagedBeanScope.SESSION)
public class ProjectManagerBean {
  @EventListener("applyLittleFee")
  private void applyFeeListener(int money) {
    System.out.println("I'm your project manager, you apply " + money + " money.");
  }
}
@ManagedBean(name="departManagerBean", scope=ManagedBeanScope.SESSION)
public class DepartManagerBean {
  @EventListener("applyMuchFee")
  private void applyFeeListener(int money) {
    System.out.println("I'm your department manager, you apply " + money + " money.");
  }
}

请注意,ProjectManagerBean及DepartManagerBean所感兴趣的事件也做了相应的修订,再次运行程序,分别输入100和1000,程序运行输出如下:

2008-03-01 15:10:10 信息 [con.out] I'm a programmer, I apply 100 money
2008-03-01 15:10:11 信息 [con.out] I'm your project manager, you apply 100 money.
2008-03-01 15:10:14 信息 [con.out] I'm a programmer, I apply 1000 money
2008-03-01 15:10:14 信息 [con.out] I'm your department manager, you apply 1000 money.