您的位置:首页 > 其它

11 时间消息

2010-04-03 15:07 197 查看
时间消息 收藏
时间消息

时间服务通过这两个途径管理消息:

消息仅触发一次
消息根据一个定义的期间和/或者发生的数量重复
如果一个消息必须从一个时间服务触发,这个消息必须添加到时间服务的消息列表.当一个消息添加到时间服务,一个唯一标志数字将被指定到这个消息.

添加时间消息

时间服务维护一个被请求发送的时间消息的内部列表. 可以使用 Timer 类的addNotification方法将消息添加到这个列表.这个addNotification 可以被重载.所有的addNotification方法具有以下消息参数和date对象:

type -- 消息类型的字符串
message -- 消息的字符串消息
userData -- 消息的用户数据对象
date -- 消息发生的时间
public Integer addNotification ( String type, String message, Object userData, Date date ) throws IllegalArgumentException public Integer addNotification ( String type, String message, Object userData, Date date , long period ) throws IllegalArgumentException public Integer addNotification ( String type, String message, Object userData, Date date , long period , long nbOccurences ) throws IllegalArgumentException public Integer addNotification ( String type, String message, Object userData, Date date , long period , long nbOccurences , boolean fireImmediate ) throws IllegalArgumentException

重载的方法,附加到消息参数和 date ,可以是以下可选参数:

period -- 消息发生的间隔,以微秒计.如果这个值为0或者空值,消息将不重复.

nbOccurences -- 消息发生的总次数.如果为0或者空值,而period为非空或者非0,那么消息将不确定发生.

fireImmediate -- 如果这个标志设为true,那么在消息添加到计时器列表时将产生第一次消息.如果这个标志为false,那么消息将在添加到计时器时开始的period值延迟后产生第一次消息.

当date为空值,period或者nbOccurences被指定为一个非法值时,IllegalArgumentException错误被抛出.还有一些指定的情况IllegalArgumentException错误被抛出:

Case 1

如果date少于当前时间,和如果period指定为0或者空值,IllegalArgumentException错误将被抛出.

Case 2

如果date少于当前时间和period非空.如果 nbOccurences 被指定,计时器为每一个nbOccurence更新date值 . 如果date值不能够在指定的nbOccurence数字里超过当前时间 , IllegalArgumentException错误将被抛出.

addNotification方法返回新的计时器消息的标志.这个标志能够用于从计时器取得关于这个消息的信息 或者 从计时器的消息列表移除这个消息.然而,在一个消息被添加到消息列表后,它的相关参数不能被更新.

一个简单的代码片断

以下代码片断用下面所列属性创建一个时间消息:

Timer Type: Register
Timer Message: Testing timer service
Timer Date: Apr 11, 2002
Timer Interval: 5 seconds
No. of Occurrence: 2

import javax.management.timer.Timer; .... ....

Timer timer = new Timer ( );

server.registerMBean ( timer , new ObjectName("Services:type=Timer") ); server.addNotificationListener ( new ObjectName("Services:type=Timer") , notifImpl , null , new Object( ) );

timer.addNotification ( "Register" , "Testing timer service" , new String( ) , new Date( 1029244438000L ) , 5000 , 2 ); timer.setSendPastNotifications ( false ); timer.start ( );

在以上代码片断, notifImpl指定一个 消息监听者(NotificationListener).

在上面的消息被注册后,时间服务从指定的date和time每隔5秒发送两个消息到所有注册的监听者.

接收时间消息

如果一个类必须接收时间消息,它必须注册它自己作为一个监听者到计时器MBean,这个MBean也是一个消息广播者.当计时器是活动的时候,并且计时器消息的date为预期的时候,时间服务广播这个消息到所有注册的监听者.这个广播的消息包含消息类型,消息,用户数据和消息在计时器的标志符.

移除计时器消息

当一个消息不在重复或者当它已经完成它的发生次数时,它被从计时器的消息列表移除. 消息也能够明确的移除,通过调用下面所列的 Timer 类的任意方法移除:

removeNotification(integer) -- 消息标志必须指定.匹配这个标志的消息将被从列表移除.
removeNotifications(type) -- 消息类型必须指定. 所有匹配指定消息类型的消息将被从计时器的消息列表移除.
removeAllNotifications -- 清空计时器的消息列表.
启动和停止时间服务

时间服务用启动(start)方法激活,用停止(stop)方法停止. 当时间服务处于非活动状态或者已经被停止时, 即使指定的日期和时间,也没有消息被触发.设置sendPastNotifications为true,这些丢失的消息能够在时间服务重新启动的时候被触发,当它被激活的时候也一样.

你能够确定是否计时器在运行,通过调用计时器的方法isActive( ).如果它运行,这个方法返回true.

需要记住的几点

用时间服务,消息能够在指定的日期和时间触发.重复消息也能够被触发.
时间服务被实现为标准MBean,能够注册到MBeanServer管理.
在时间服务启动之前和之后,没有消息会被触发.
当时间服务为非活动的时候丢失的消息能够通过设置sendPastNotifications为true来重新获得.

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhangliulin/archive/2008/02/17/2100197.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: