作业控制器可以创建并管理传送邮件的通道作业。这些通道作业在作业控制器内的进程池中运行。可以将池看作是一个运行通道作业的“地方”。池提供了一个计算区域,一组作业可以在其中运行而不与池外的作业竞争资源。(有关作业控制器概念和通道关键字配置的信息,请参阅8.7 作业控制器、12.5.4 用于通道执行作业的处理池和12.5.5 服务作业限制。)
作业控制器文件 job_controller.cnf 用于指定以下通道处理信息:
定义各种池
为所有通道指定主程序名和从程序名(如果适用)
在 imta.cnf 文件中,可以使用 pool 关键字指定进程池(已在 job_controller.cnf 中定义)的名称。例如,以下 job_controller.cnf 样例文件的片段定义池 MY_POOL:
[POOL=MY_POOL] job_limit = 12
以下 imta.cnf 样例文件的片断指定通道块中的池 MY_POOL:
channel_x pool MY_POOL channel_x-daemon
如果要修改与默认池配置关联的参数或添加其他池,则可以通过编辑 job_controller.cnf 文件,然后停止并重新启动作业控制器来实现。
作业控制器配置文件中的第一个池用于不指定池名称的所有请求。在 MTA 配置文件 (imta.cnf) 中定义的 MTA 通道可以通过使用后跟池名称的 pool 通道关键字将它们的处理请求定向到特定的池。池名称必须与作业控制器配置中的池名称匹配。如果作业控制器不能识别请求的池名称,则将忽略请求。
在初始配置中,定义了以下池:DEFAULT、LOCAL_POOL、IMS_POOL、SMTP_POOL。
通常情况下,如果您需要将某些通道的处理与其他通道的处理区分开,则可以在作业控制器配置中添加附加的池定义。您也可以选择使用具有不同特征的池。例如,您可能需要控制某些通道可以处理的同时进行的请求的数量。您可以通过创建具有作业限制的新池来完成此操作,然后使用 pool 通道关键字将这些通道定向到更适合的新池。
除了池定义以外,作业控制器配置文件还包含 MTA 通道表以及作业控制器处理每个通道的请求所必须使用的命令。两类请求分别称为“主”类型和“从”类型。通常情况下,通道的 MTA 邮件队列中存储了邮件时,便会调用通道主程序。主程序会使邮件退出队列。
调用从程序的目的是轮询某通道并选取进入该通道的所有邮件。尽管几乎所有的 MTA 通道都有主程序,但是很多通道却没有或不需要从程序。例如,经过 TCP/IP 处理 SMTP 的通道就不使用从程序,因为网络服务和 SMTP 服务器将根据 SMTP 服务器发出的请求接收外来 SMTP 邮件。SMTP 通道的主程序是 MTA 的 SMTP 客户端。
如果与通道关联的目标系统无法一次处理多个邮件,则需要创建一种新类型的池,其作业限制为一个池:
[POOL=single_job] job_limit=1
反之,如果目标系统具有足够的并行处理能力,则可以将作业限制设置为较高的值。
示例 10–1 显示了样例作业控制器配置文件。表 10–6 显示了可用的选项。
!MTA Job Controller configuration file ! !Global defaults tcp_port=27442 (1) secret=never mind slave_command=NULL (2) max_life_age=3600 (3) ! ! !Pool definitions ! [POOL=DEFAULT] (4) job_limit=10 (5) ! [POOL=LOCAL_POOL] job_limit=10 ! [POOL=IMS_POOL] job_limit=1 ! [POOL=SMTP_POOL] job_limit=1 ! !Channel definitions ! ! [CHANNEL=l] (6) master_command=msg-svr-base/lib/l_master ! [CHANNEL=ims-ms] master_command=msg-svr-base/lib/ims_master ! [CHANNEL=tcp_*] (7) master_command=msg-svr-base/lib/tcp_smtp_client |
前述示例中的关键项(带有编号、括在括号中,且为粗体)为:
此全局选项定义了作业控制器在其上侦听请求的 TCP 端口号。
为后续的 [CHANNEL] 部分设置默认 MAX_LIFE_AGE。
该 [POOL] 部分定义了名为 DEFAULT 的池。
该 [CHANNEL] 部分应用于名为 l 的通道,即 UNIX 本地通道。该部分中所需的唯一定义是 master_command,作业控制器执行该命令来运行此通道。由于通道名称中没有显示通配符,所以通道必须完全匹配。
该 [CHANNEL] 部分应用于名称以 tcp_* 开头的所有通道。由于此通道名称中包含通配符,所以它将与名称以 tcp_ 开头的任何通道相匹配。
作业控制器可以创建并管理传送邮件的通道作业。这些通道作业在作业控制器内的进程池中运行。可以将池看作是一个运行通道作业的“地方”。池提供了一个计算区域,一组作业可以在其中运行而不与池外的作业竞争资源。请注意,在 job_controller 中设置的作业限制是针对每个池的。例如,如果将 SMTP_POOL 的 job_limit 定义为 10,则在任一给定时刻,只能有 10 个 tcp_smtp 客户端进程可以在该池中运行。
某些情况下,可能需要创建附加的 tcp_* 通道(例如,用于特别缓慢的邮件站点的 tcp 通道)。最好是使这些通道在不同的池中运行。这样做的原因在于,如果我们创建了十个不同的 tcp_* 通道,并且它们全在 SMTP_POOL 中运行,则在任一给定时刻,每个 tcp_* 通道上可能只有一个 tcp_smtp 客户端在运行(具体情况取决于是否有目标为所有 tcp_* 通道的邮件,以及是否将 SMTP_POOL 的 job_limit 定义为 10)。假设系统负载很重,并且所有队列中都有邮件等待通过各个 tcp_* 通道发送出去,这样效率就会很低。用户很可能会为附加的 tcp_* 通道定义附加的池,以防止出现争用槽的情况。
例如,假设我们设置了以下 tcp_* 通道:
tcp_yahoo smtp mx pool yahoo_pool keyword keyword keyword tcp-yahoo-daemon tcp_aol smtp mx keyword keyword keyword pool aol_pool tcp-aol-daemon tcp_hotmail smtp mx pool hotmail_pool keyword keyword keyword tcp-hotmail-daemon ... tcp_sun smtp mx pool sun_pool keyword keyword keyword tcp-sun-daemon |
为了使每个新通道有十个 tcp_smtp_client 进程,我们要在 job_controller.cnf 文件中添加以下行:
[POOL=yahoo_pool] job_limit=10 [POOL=aol_pool] job_limit=10 [POOL=hotmail_pool] job_limit=10 ... [POOL=sun_pool] job_limit=10 |
有关池的更多信息,请参见12.5.4 用于通道执行作业的处理池。
表 10–6 作业控制器配置文件选项