没有合适的资源?快使用搜索试试~ 我知道了~
Mina状态机介绍和实例
4星 · 超过85%的资源 需积分: 10 56 下载量 138 浏览量
2010-02-26
16:48:13
上传
评论
收藏 287KB PDF 举报
温馨提示
试读
15页
MINA(Multipurpose Infrastructure for Network Applications)是用于开发高性能和高可用性的网络应用程序的基础框架。通过使用MINA框架可以可以省下处理底层I/O和线程并发等复杂工作,开发人员能够把更多的精力投入到业务设计和开发当中。MINA框架的应用比较广泛,应用的开源项目有Apache Directory、AsyncWeb、Apache Qpid、QuickFIX/J、Openfire、SubEthaSTMP、red5等。MINA框架当前稳定版本是1.1.6,最新的2.0版本目前已经发布了M1版本
资源详情
资源评论
资源推荐
Mina 状态机介绍 Translator: 中國壹石頭
--------------------------------------------- ------- ------------------------------------------------------------------
What we call human nature
is
actually human habbit .
Mina 状态机介绍
(
Introduction
to
mina-statemachine
)
如果你使用 Mina 开发一个复杂的网络应用时,你可能在某些地方会遇到那个古老而又好 用
的状态模式,来使用这个模式解决你的复杂应用。然而, 在你做这个决定之前,你或许想 检
出 Mina 的状态机的代码,它会根据当前对象的状态来返回对接收到的简短的数据的处理 信
息。
注意:现在正式发布 Mina 的状态机。因此你要自己在 Mina 的 SVN
服务器上检出该代码,
并自己编译,请参考开发指南, 来获取更多的关于检出和编译 Mina 源码的信息。 Mina 的 状
态机可以和所有已经发布的版本 Mina 配合使用 (1.0.x, 1.1.x 和 当前发布的版本 ) 。
一个简单的例子
一个简单的例子
一个简单的例子
一个简单的例子
让我们使用一个简单的例子来展示一下 Mina 的状态机是如何工作的。下面的图片展示了 一
个录音机的状态机。 其中的椭圆是状态, 箭头表示事务。每个事务都有一个事件的名字来 标
记该事务。
初始化时,录音机的状态是空的。当磁带放如录音机的时候, 加载的事件被触发,录音 机
进入到加载状态。 在加载的状态下,退出的事件会使录音机进入到空的状态, 播放的事件 会
使加载的状态进入到播放状态。等等 ...... 我想你可以推断后后面的结果 :)
现在让我们写一些代码。外部 ( 录音机中使用该代码的地方 ) 只能看到录音机的接口:
----------------------START ----------------------
public interface
TapeDeck
{
void load(String nameOfTape);
void eject();
void start();
void pause();
void stop();
}
-----------------------END------------------------
下面我们开始编写真正执行的代码, 这些代码在一个事务被触发时,会在状态机中执行。 首
先我们定义一个状态。这些状态都使用字符串常量来定义,并且使用 @state 标记来声明。
----------------------START ----------------------
public class TapeDeckHandl er {
Mina 状态机介绍 Translator: 中國壹石頭
--------------------------------------------- ------- ------------------------------------------------------------------
What we call human nature
is
actually human habbit .
@State public static final String EMPTY = "Empty";
@State public static final String LOADED = "Loaded";
@State public static final String PLAYING = "Playing";
@State public static final String PAUSED = "Paused";
}
-----------------------END------------------------
现在我们已经定义了录音机中的所有状态, 我们可以根据每个事务来创建相应的代码。 每 个
事务都和一个 TapeDeckHandl er 的方法对应。每个事务的方法都使用 @T ranstrati on 标签 来
声明,这个标签定义了事件的 ID ,该 ID 会触发事务的执行。事务开始时的状态使用 start
,
事务结束使用 next ,事务正在运行使用 on 。
----------------------START ----------------------
public class TapeDeckHandl er {
@State public static final String EMPTY = "Empty";
@State public static final String LOADED = "Loaded";
@State public static final String PLAYING = "Playing";
@State public static final String PAUSED = "Paused";
@T ransition(on = "load",
in
=
EMPTY ,
next = LOADED)
public void loadTape(String nameOfTape) {
System.out.println("Tape '" + nameOfTape + "' loaded");
}
@T ransitions({
@T ransition(on = "play",
in
= LOADED, next = PLAYING),
@T ransition(on = "play",
in
= PAUSED, next = PLAYING)
})
public void playTape() {
System.out.println("Playing tape");
}
@T ransition(on = "pause",
in
= PLAYING, next = PAUSED)
public void
pauseTape()
{
System.out.println("Tape paused");
}
@T ransition(on = "stop",
in
= PLAYING, next = LOADED)
public void stopTape() {
System.out.println("Tape stopped");
}
@T ransition(on = "eject",
in
= LOADED, next = EMPTY)
public void
ejectTape()
{
System.out.println("Tape ejected");
}
Mina 状态机介绍 Translator: 中國壹石頭
--------------------------------------------- ------- ------------------------------------------------------------------
What we call human nature
is
actually human habbit .
}
-----------------------END------------------------
请注意, TapeDeckHandler 类没有实现
TapeDeck
,呵呵,这是故意的。
现在让我们亲密接触一下这个代码。在 loadTape 方法上的 @T ransition 标签:
----------------------START ----------------------
@T ransition(on = "load",
in
=
EMPTY ,
next = LOADED)
public void loadTape(String nameOfTape) {}
-----------------------END-----------------------
指定了这个状态后,当录音机处于空状态时,磁带装载事件启动后会触发 loadTape
方法,
并且录音机状态将会变换到 Loaded 状态。 @T ransition 标签中关于
pauseT ape,stopTape,ejectTape 的方法就不需要在多介绍了。 关于 playTape 的标签和其他 的
标签看起来不太一样。 从上面的图中我们可以知道, 当录音机的状态在 Loaded 或者 Pause d
时, play 事件都会播放磁带。当多个事务同时条用同一个方法时, @T ransition 标签需要按
下面的方法使用:
----------------------START ----------------------
@T ransitions({
@T ransition(on = "play",
in
= LOADED, next = PLAYING),
@T ransition(on = "play",
in
= PAUSED, next = PLAYING)
})
public void playTape(){}
-----------------------END-----------------------
@T ransition 标签清晰的列出了声明的方法被多个事务调用的情况。
######################################################
要点: 更多关于 @Transition 标签的参数
( 1 )如果你省略了 on 参数,系统会将该值默认为 “ *
”
,这样任何事件都可以触发该方法。
( 2 )如果你省略了 next 参数,系统会将默认值改为 “ _self_
”
,这个是和当前的状态相关的,
如果你要实现一个循环的事务,你所需要做的就是省略状态机中的 next 参数。
( 3 ) weight 参数用于定义事务的查询顺序,一般的状态的事务是根据 weight 的值
按升序排列的, weight 默认的是 0.
######################################################
现在最后一步就是使用声明类创建一个状态机的对象, 并且使用这个状态机的实例创建一 个
代理对象,该代理对象实现了 TapeDeck 接口
:
----------------------START ----------------------
public static void main(String[] args) {
// 创建录音机事件的句柄
TapeDeckHandler handler = new TapeDeckHandler();
// 创建录音机的状态机
StateMachine sm =
StateMachineFactory.getInstance(Transition.class).create(TapeDeckHandler.EMPTY,
handler);
// 使用上面的状态机,通过一个代理创建一个 TapeDeck 的实例
TapeDeck
deck = new StateMachineProxyBuilder().create(TapeDeck.class, sm);
剩余14页未读,继续阅读
家庭_煮男
- 粉丝: 5
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- mosquitto-2.018-install-windows-x64
- FTPServer FTP 服务器,绿色免安装,单文件
- 梦畅语音点名软件,上课点名
- 利用ADNI数据集和标签,在tensorflow框架上使用tensorlayer接口,通过架构u-net实现海马体的分割
- Kutools for Word v9.0 office word 插件
- 修复Windows 10 LTSC 2021资源占用率高
- Hash工具,小巧绿色hash校验工具,免费hash工具
- 重启进行BIOS快捷方式,不需要开机按BIOS键
- 鸭子开车记(儿童绘本)
- 威纶通触摸屏编程软件Easy builder pro V6.09.01.556安装包(2024.04).txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论3