- 浏览: 444430 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
进退取舍:
谢谢,这个用上了!!
Java 一个线程池的示例 -
pb_water:
感谢楼主,打算买楼主的书,支持一下,楼主功德无量
JavaScript内核系列第0版整理稿下载 -
lancezhcj:
有图会直观的多呢,再摸索摸索
有限自动机与建模 -
hsmsyy:
这里应该是原创了吧,楼主我觉得闭包的作用:实现面向对象。有待商 ...
JavaScript内核系列 第7章 闭包 -
wll52:
在应用退出之前,需要释放连接 con.disconnect() ...
使用smack与GTalk通信
前言
异步事件的通知机制在比较有规模的软件设计中必然会有涉及,比如GUI程序中的事件监听器,应用程序模块之间的通信,以及分布式应用中的消息机制等。如果使用语言原生的对象注册通信,则耦合度不可避免的会增大,也就是说,当时间发生时,A要通知B,则A必须知道B的存在。耦合度的增大在一定程度上必然会影响灵活性。所以,另一种模式就是今天要说的总线模式(BUS Based),即所有的监听器将自己挂在总线上,这些监听器互相之间是无法直接通信的,它们可以向总线上push消息,或者从总线上得到消息,从而实现相互间的通信,当然,这种模式会在性能上有一定的额外开销。
BBMS的主页在google code上:http://code.google.com/p/bbms/
总线机制
bbms的客户端程序通过将自己注册在BUS Server上来等待异步事件,这个过程可以是本地的,也可以是远程的。本地的BUS可以作为GUI框架中的事件分发者(dispatcher).JMS(Java Message Service)提供企业级的软件模块之间的通信机制,可以使得多个不同的应用集成为一个大型的应用。通过使用BBMS的远程接口,同样可以达到这样的效果。
BBMS的API
*
* @author juntao.qiu
*
*/
public class Test{
public static void main(String[] args) throws RemoteException{
/*
* create a notifiable entry, declare that it's care of
* TIMEOUT, CLOSE, and READY event.
*/
Configuration config = new RMIServerConfiguration(null, 0);
CommonNotifiableEntry entry1 =
new CommonNotifiableEntry(config, "client1",
MessageTypes.MESSAGE_TIMEOUT |
MessageTypes.MESSAGE_CLOSE |
MessageTypes.MESSAGE_READY);
/*
* create another notifiable entry, declare that it's care of
* OPEN, CLOSE, and TIMEOUT event.
*/
CommonNotifiableEntry entry2 =
new CommonNotifiableEntry(config, "client2",
MessageTypes.MESSAGE_OPEN |
MessageTypes.MESSAGE_CLOSE |
MessageTypes.MESSAGE_TIMEOUT);
// register them to the remote Message BUS to listener events
entry1.register();
entry2.register();
// new a message, of type MESSAGE_OPEN.
Message msg = new CommonMessage(
entry1.getId(),
entry2.getId(),
MessageTypes.MESSAGE_OPEN,
"busying now");
// deliver it to entry2, which is from entry1
entry1.post(msg);
// create a message, of type MESSAGE_CLICKED, the entry2
// does not handle this type, it'll not be deliver to entry2
Message msgCannotBeReceived = new CommonMessage(
entry1.getId(),
entry2.getId(),
MessageTypes.MESSAGE_CLICKED,
"cliked evnet");
entry1.post(msgCannotBeReceived);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// re use the message object to send another message entry
msg.setSource(entry2.getId());
msg.setTarget(entry1.getId());
msg.setType(MessageTypes.MESSAGE_READY);
msg.setBody("okay now");
entry2.post(msg);
// unregister self when all works are done or
// don't want to listen any more
entry1.unregister();
entry2.unregister();
}
}
This is client1, get message from : client2, it said that : okay now
这个是MS运行的一个简单流程图。
BUS的实现
BUS接口的定义,可以向BUS上注册一个notifiableEntry(可被通知的对象),或者卸载这个对象,同时,可以向BUS中post一条消息。
/**
* @author juntao.qiu
*/
public interface Bus extends java.rmi.Remote{
/**
* mount an notifiable entry on bus
* @param entry
*/
public void mount(NotifiableEntry entry) throws java.rmi.RemoteException;
/**
* unmount the notifiable entry on bus
* @param entry
*/
public void unmount(NotifiableEntry entry) throws java.rmi.RemoteException;
/**
* post a new message to Message Bus
* @param message
*/
public void post(Message message) throws java.rmi.RemoteException;
}
*
* @author juntao.qiu
* worker thread, dispatch message to appropriate listener
*
*/
private class Daemon implements Runnable{
private boolean loop = true;
public void run(){
while(loop){
if(messages.size() == 0){
synchronized(messages){
try {messages.wait();}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
processIncomingMessage();
}
}
}
listeners = new LinkedList<NotifiableEntry>();
messages = new LinkedList<Message>();
Daemon daemon = new Daemon();
daemonThread = new Thread(daemon);
daemonThread.setPriority(Thread.NORM_PRIORITY + 3);
daemonThread.setDaemon(true);
daemonThread.start();
while(!daemonThread.isAlive());
}
消息的定义
public int getType();
public void setType(int type);
public String getTarget();
public void setTarget(String target);
public String getSource();
public void setSource(String source);
public Object getBody();
public void setBody(Object body);
}
* 0x8000 = 1000 0000 0000 0000
* 0x4000 = 0100 0000 0000 0000
* 0x2000 = 0010 0000 0000 0000
* 0x1000 = 0001 0000 0000 0000
*
* it's very useful when you want to combine some messages
* together, and the user can simply determine what exactly
* what you want. Refer the implementation of MessageBus.java
* for more details.
*/
public static final int MESSAGE_TIMEOUT = 0x8000;
public static final int MESSAGE_CLICKED = 0x4000;
public static final int MESSAGE_CLOSE = 0x2000;
public static final int MESSAGE_OPEN = 0x1000;
public static final int MESSAGE_READY = 0x0800;
public static final int MESSAGE_BUSY = 0x0400;
public static final int MESSAGE_WAIT = 0x0200;
public static final int MESSAGE_OKAY = 0x0100;
总结
BBMS如果进行适当的扩展,可以完全实现JMS规范中涉及到的所有主题,如订阅模式(BBMS现在的实现中只有PTP模式,及点对点的模式,发送消息和接受消息的实体都必须同时在线)。BBMS主要面向的是轻量级的消息传递,比如GUI,分布式的GUI等。如果有兴趣,可以到BBMS的页面上看一看:http://code.google.com/p/bbms/
发表评论
-
JavaScript内核系列 第15章 服务器端的JavaScript
2012-02-12 21:39 2206第15章已经在icodeit上发布,这一章分为上/下两篇,请朋 ... -
使用vim开发python及graphviz绘图
2011-12-23 14:49 6328基本需求 使用vim中的autocmd命令可以很容易的将正在 ... -
Java脚本技术应用实例
2011-01-22 11:24 4074前言 一直以来都很喜欢可以自由扩展的软件,这一点应该已经在很 ... -
可编程计算器(phoc)的设计与实现
2011-01-17 11:34 1855前言 借助JavaScript脚本 ... -
函数式编程(javascirpt)
2009-04-18 22:18 1208前言 Javascript,有人称 ... -
C和指针
2009-05-21 23:15 1052前言 指针是C的灵魂,正是指针使得C存在了这么多年,而且将长 ... -
C和指针(续)
2009-05-25 23:41 1307前言 上一篇《C和指针》可能对关于C和指针的有些内容没有说透 ... -
有限自动机与建模
2009-06-06 10:48 1640前言 在学校学程序设计语言的时候,能接触到的所有例子没有一个 ... -
事件和监听器
2009-06-21 22:06 1360前言 事件监听器是经 ... -
JavaScript内核系列 第9章 函数式的Javascript
2010-05-13 19:20 3702第九章 函数式的Javascript 要说Ja ... -
JavaScript内核系列 第8章 面向对象的JavaScript(下)
2010-05-06 09:40 3587接上篇:JavaScript内核系列 第8章 面向对象的Jav ... -
JavaScript内核系列 第8章 面向对象的JavaScript(上)
2010-05-06 09:26 2841第八章 面向对象的 Javascript ... -
JavaScript内核系列 第7章 闭包
2010-05-04 08:48 3768第七章 闭包 闭包向来给包括JavaScript程序 ... -
JavaScript内核系列 第6章 正则表达式
2010-04-27 19:44 3931第六章 正则表达式 正则表达式是对字符串的结构 ... -
JavaScript内核系列 第5章 数组
2010-04-24 15:17 4354第五章 数组 JavaScript的数组也是一个比较 ... -
Swing小应用(Todo-List)之三
2010-04-22 20:47 2058前言 去年9月份开发的那个小工具sTodo,只是做到了能用, ... -
JavaScript内核系列 第4章 函数
2010-04-18 17:31 4946第四章 函数 函数,在C语言之类的过程式语言中 ... -
JavaScript内核系列 第3章 对象与JSON
2010-04-12 09:12 6006第三章 对象与JSON JavaScript对象与传 ... -
JavaScript内核系列 第2章 基本概念
2010-04-03 19:44 5496第二章 基本概念 ... -
JavaScript内核系列 第1章 前言及概述
2010-04-01 23:15 9811前言 从2006年第一次接触JavaScript至今,算来也 ...
相关推荐
BBMS功能介绍、业务流程.pptx
bbms-ui 基于骨干木偶SASS Browserify的UI组件库
bbms样板骨干,木偶,SASS,基于Browserify的样板项目
bbms 图书借阅管理系统
血库管理系统是在Visual Basic 6.0(VB6)中作为前端开发的,而后端数据库是在MS-SQL 2005中开发的,该数据库提供了用于维护血库记录的员工登录信息。 前端– VB6(框架2.0)。 后端– MS-SQL 2005。
血库管理系统血库管理系统是所有献血问题的解决方案,该系统的访问权限仅授予管理员和用户,它为用户提供了非常友好的用户界面。... 用户的功能是注册,查看他的捐赠详细信息(即他先前何时何地献血)以及查看他的请求...
它不应与任何特定的编程语言或数据存储紧密结合。 将BioSCOOP功能集成到现有BBMS中应该很容易。 BioSCOOP分为三个部分:数据格式定义,数据操作定义,数据查询格式。 数据格式定义 数据操作定义 词汇表 BBMS-...
该程序采用ALSA框架,实现Liunx下音频设备操作,实现麦克风输入音频,音响同步实现播放,采用UDP协议进行传输,本程序为本地IP通信,可以实现语音对讲