在这个系列的第一部分中,我们讨论过iRules的众多组成部分,特别是我们如何在TCL语言中如何应用Event这一概念。“When”命令是用来定义一些关联到给定事件的代码,在本文中会讲一些该命令的使用以及可选参数
 
摘要
 
when EVENT_NAME ?options? {body}
 
描述
 
When命令是用来定义一组当特定状态发生时执行的代码,由event_name指定,在连接的数据包穿越BIG-IP的时候执行。我们使用”Event” 来表示这些“状态”。一个iRules必须由一个或多个的When命令组成。
 
EVENT_NAME
 
可用的事件命令列表可以在iRules文档中的事件参考部分中找到(http://devcentral.f5.com/wiki/default.aspx/iRules.Events)。一些事件,比如CLIENT_ACCEPTED 和CLIENT_CLOSED事件适用于所有的Virtual Server的配置,而其它的一些事件,就像HTTP_REQUEST 和CLIENTSSL_CLIENTCERT只适用于Virtual Server中配置了相应的Profile(Http和Clientssl Profile)。RULE_INIT事件比较特殊,只在配置运行期间,和连接没有关系。在RULE_INIT事件中创建的所有变量都是全局变量(不同于基于连接的变量)。
 
当前支持如下的选项:
priority nnn
优先级是一个可以关联到任意iRule事件的可选属性。当iRules (一个或者多个)装载到一个给定Virtual Server的iRules引擎中,他们存储在一个有事件名称和优先级(默认值为500)的表中。当某一特定情况发生并触发了事件,这个引擎就会从按优先级从低到高的传递控制权,优先级相同的多个事件会按他们插入到表中的顺序来执行。优先级可以为0到1000范围内的任意值。将你的逻辑分段成多个“类”事件组的主要功能是允许在多Virtual Server之间重复使用某段代码。优先级属性的默认值是500。
 
timing <on|off>
Timing命令可以用来启用iRule计时统计。当每次特定的iRules执行的时候就会收集时间信息。用“b rule <name> show all”命令或者iRules编辑器的统计里可以看到时间的统计信息。您可能经常希望看到iRule执行平均的、最小的到最大的时间,用来优化iRule的性能,打开timing命令也会消耗系统的性能,但是几乎可以忽略不计。默认的timing属性是关闭的。Timing命令的参数也是一个特殊的命令,可以放在iRule最开始的位置,在所有的when命令前。使用的方法也是一样的,被放在iRule的最前面,开启或者关闭取决于被指定。
 
内容
内容就是一组TCL代码包含TCL命令同时也包含F5的开发的iRule TCL命令。所有的适用的命令,请参考命令iRule wiki 上的命令手册 (http://devcentral.f5.com/wiki/default.aspx/iRules.Commands)
例子 

when RULE_INIT {
  # this is a global variable
  set ::TRACE 1
  # this is a global variable as well
  set DEBUG 1
}

when HTTP_REQUEST priority 100 {
  # With the lowest priority, the event code will get executed first
  # Timing is not specified, so it is off as it's default.

  # the following variables are connection based, not global.
  # To make them global, prefix them with double colons ("::").
  if { [HTTP::uri] starts_with "/login" } {
    set ATTEMPTING_TO_LOGIN 1
  } else {
    set ATTEMPTING_TO_LOGIN 0
  }
}

when HTTP_REQUEST priority 200 timing on {
  # This will get executed second when a HTTP request state is entered
  # CPU Metric timing is also enabled for this iRule event block
  log local0. "Request Event 2 - login state: '$ATTEMPTING_TO_LOGIN'"
}

when HTTP_REQUEST timing on {
  # The priority is not specified so it defaults to 500 and this will get executed last.
  # CPU metric timing is also enabled for this iRule event block
  unset ATTEMPTING_TO_LOGIN
}
timing on

when HTTP_REQUEST {
  log local0. "Timing is on due to global default set to on".
}

when HTTP_RESPONSE timing off {
  log local0. "Timing is turned off for this event block.
}

总结
 
当你看到一段iRules的时候,毫无疑问,你将会看到When命令在行动。当了解了有多少个“类”事件组可以按优先次序排列,从而允许iRules模块化开发,以及了解timing命令是如何工作的,当您需要从iRule上压榨每一位的性能时,它将会使您更加轻松的评估您的iRules。