# FSM
## 依赖
为了使用有限状态机(`Finite State Machine`)Actor,你需要将以下依赖添加到你的项目中:
```xml
com.typesafe.akka
akka-actor_2.12
2.5.21
dependencies {
compile group: 'com.typesafe.akka', name: 'akka-actor_2.12', version: '2.5.21'
}
libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.5.21"
```
## 示例项目
你可以查看「[FSM 示例项目](https://developer.lightbend.com/start/?group=akka&project=akka-samples-fsm-java)」,以了解实际应用中的情况。
## 概述
FSM(有限状态机)是一个抽象的基类,它实现了一个 Akka Actor,并在「[Erlang设 计原则](http://erlang.org/documentation/doc-4.8.2/doc/design_principles/fsm.html)」中得到了最好的描述。
FSM 可以描述为一组形式的关系:
- `State(S) x Event(E) -> Actions (A), State(S’)`
这些关系被解释为如下含义:
- 如果我们处于状态`S`,并且事件`E`发生,那么我们应该执行操作`A`,并向状态`S’`过渡。
## 一个简单的例子
为了演示`AbstractFSM`类的大部分特性,考虑一个 Actor,该 Actor 在消息到达突发(`burst`)时接收和排队消息,并在突发结束或收到刷新(`flush`)请求后发送它们。
首先,考虑使用以下所有导入语句:
```java
import akka.actor.AbstractFSM;
import akka.actor.ActorRef;
import akka.japi.pf.UnitMatch;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.time.Duration;
```
我们的“`Buncher`” Actor 的协议(`contract`)是接受或产生以下信息:
```java
static final class SetTarget {
private final ActorRef ref;
public SetTarget(ActorRef ref) {
this.ref = ref;
}
public ActorRef getRef() {
return ref;
}
@Override
public String toString() {
return "SetTarget{" + "ref=" + ref + '}';
}
}
static final class Queue {
private final Object obj;
public Queue(Object obj) {
this.obj = obj;
}
public Object getObj() {
return obj;
}
@Override
public String toString() {
return "Queue{" + "obj=" + obj + '}';
}
}
static final class Batch {
private final List