public function run($handler, $data = null, array $options = []) {
		$this->_handler = Handlers::get($handler);
		$this->_data = $data === null ? $this->_data : $data;

		$options += $this->_handler->options() + [
			'queue' => 'default',
			'priority' => static::PRIORITY_NORMAL,
			'wait' => false,
			'fallback' => false,
			'ttr' => 600
		];

		if (!$this->_connection->online()) {
			if (!$options['fallback']) {
				throw new Exception('Connection offline; not allowed to fallback.');
			}
			$this->_log->notice("Connection offline; performing job `{$this}` inline.");
			$this->perform();
			return;
		}

		$body = $this->_serialize([
			'handler' => $this->_handler->name(),
			'data' => $data
		]);

		$this->_id = $this->_connection->enqueue($options['queue'], $body, [
			'priority' => $options['priority'],
			'ttr' => $options['ttr'],
			'delay' => 0
		]);

		if ($options['wait']) {
			$this->_connection->wait([$this->_id], $options['ttr']);
		}
	}