At first, let's define the Supervisor:

class Supervisor extends Actor {

  override val supervisorStrategy =
    OneForOneStrategy() {
      case _: IllegalStateException =>
        Restart
      case _: Exception => Stop
    }

  override def receive: Receive = {
    case op: Operation => context.actorOf(Props(classOf[Worker], op))
  }
}

I chose OneForOneStrategy which restarts or stops an actor in case of specified exception. It is worth noting that the operation is passed by the constructor of the newly created actor.

Secondly, let's take a look at Worker, which handles the operation:

class Worker(op: Operation) extends Actor {

  override def preStart(): Unit = {
    self ! op
  }

  override def receive: Receive = {
    case op: Operation => op.execute()
  }
}

As you can see, the operation is sent to the worker itself in the preStart method. This enables simple restarting or other supervision strategies to be done.

Any better solutions would be appreciated.