2011年10月22日

用消息队列和消息应用状态表来消除分布式事务

摘要: 用消息队列和消息应用状态表来消除分布式事务by 方刚 由于数据量的巨大,大部分Web应用都需要部署很多个数据库实例。这样,有些用户操作就可能需要去修改多个数据库实例中的数据。传统的解决方法是使用分布式事务保证数据的全局一致性,经典的方法是使用两阶段提交协议。长期以来,分布式事务提供的优雅的全局ACID保证麻醉了应用开发者的心灵,很多人都不敢越雷池一步,想像没有分布式事务的世界会是怎样。如今就如MySQL和PostgreSQL这类面向低端用户的开源数据库都支持分布式事务了,开发者更是沉醉其中,不去考虑分布式事务是否给系统带来了伤害。事实上,有所得必有所失,分布式事务提供的ACID保证是以损害系统 阅读全文

posted @ 2011-10-22 18:43 心笑峰 阅读(3141) 评论(0) 推荐(2) 编辑

2011年10月21日

Openfire 好友状态的发送(用户登录)

摘要: 客户端在登录 Openfire 时都会收到自己订阅的好友状态,那么这个好友状态是怎么下发下去的呢? 用户在登录后会发送一个<presence> 来更新自己的状态,在PresenceRouter 中进行处理。这个presence 交由PresenceUpdateHandler 处理,在判断用户为注册用户后使用RosterManager.getRoster() 来获取所有已经订阅的其他用户。针对每个用户判断关系类型,如果为SUB_FROM,SUB_BOTH 则说明此用户为订阅了自己的。 先向订阅了自己的用户广播状态更新消息。调用initSesion(),从中取出SUB关糸为SUB_TO 阅读全文

posted @ 2011-10-21 18:01 心笑峰 阅读(3638) 评论(0) 推荐(0) 编辑

2011年10月13日

ejabberd分析(五)+订阅/添加好友

摘要: 模块ejabberd_c2s中,状态为session_established2。用户发送iq set 消息到服务器<iq id="M8QF3-52" type="set"><query xmlns="jabber:iq:roster"><item jid="1555215557@kinglong" name="1555215557"><group>Friends</group></item></query>< 阅读全文

posted @ 2011-10-13 12:20 心笑峰 阅读(3046) 评论(0) 推荐(0) 编辑

2011年10月8日

Openfire 的 Cache机制

摘要: Openfire 中多处用到了Cache 来存储那些访问较为频繁的数据,例如userManager中的userCache,rosterManager 中的rosterCache。以下为Openfire中Cache的实现机制:1. Cache 接口:interface Cache<K,V> extends java.util.Map<K,V>提供了基本的Cache接口方法。2. Cacheable 接口:interface Cacheable extends java.io.Serializable继承了序列化接口,如果是自己定义的数据需要存储在Cache中,则需要实现此 阅读全文

posted @ 2011-10-08 22:31 心笑峰 阅读(3851) 评论(0) 推荐(0) 编辑

2011年9月29日

Openfire 用户离线、断线 及心跳检测

摘要: 客户端登出分为正常离线和断线,正常离线会发送presence 消息通知服务器,断线则无通知发送。1. 正常离线:客户端在离线之前发送<presence id='***' type ="unavailable"></presence>由PresenceRouter 路由到PresenceUpdateHandler 中处理。判断Type为unavailable 之后先进行广播,再设置session的状态,再更新presenceManager中用户最后一次的状态。presenceManager中会更新lastActivityCache 中的 阅读全文

posted @ 2011-09-29 18:24 心笑峰 阅读(12589) 评论(1) 推荐(1) 编辑

2011年9月27日

Mysql 数据库热备份

摘要: 主从模式:主服务器server1: 192.168.1.20 Mysql 5.0 需要备份的数据库 mydb从服务器server2: 192.168.1.22 Mysql 6.0 1.备份现有数据:最好先停止mysql service使用[MysqlHome]:\bin\mysqldumple.exe工具 将现有数据备份成一个sql文件:d:\>cd [MysqlHome][MysqlHome]>cd binbin:\>mysqldumple -u root -p mydb> d:\mydb.sql //有自己写的存储过程或函数时加上--routines 选项,否则默认 阅读全文

posted @ 2011-09-27 13:57 心笑峰 阅读(4291) 评论(0) 推荐(0) 编辑

2011年9月15日

ejabberd分析(四) 用户登录

摘要: 仍然看ejabberd_c2s 这个gen_fsm 模块。RECV <stream:stream to="localhost" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0"> SENT <?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="htt 阅读全文

posted @ 2011-09-15 23:02 心笑峰 阅读(2023) 评论(0) 推荐(0) 编辑

ejabberd分析(二) 用户注册

摘要: ejabberd中由ejabberd_c2s处理:ejabberd_c2s模块启动后gen_fsm的状态位于wait_for_stream客户端发送<stream:stream to="localhost" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0">服务器端wait_for_stream 函数中经过 case xml:get_attr_s("xmlns:stream&q 阅读全文

posted @ 2011-09-15 02:13 心笑峰 阅读(2984) 评论(1) 推荐(0) 编辑

2011年9月13日

erlang(2) gen_server

摘要: 通过前面的erlang(1)我们了解到了一个基本的服务器的实现方法。erlang中为我们提供了这样一个服务器的现成的实现,就是gen_server,不用自己去编写服务器程序了。所要做的就是以下几个事:1.确定我们回调模块的名称2.编写接口函数3.实现六个回调方法也就是说我们只需要关注于回调模块的实现就OK了。1: -module(XXXX) 定义模块名称2:接口函数,可供调用的函数。 在这里你可以定义所有需要的方法,作为功能调用的入口。 例如常见的start()、stop()等。他们的作用就是调用gen_server,完成指定功能。3:实现回调函数,一共需要实现六个。 init()/1 --- 阅读全文

posted @ 2011-09-13 21:00 心笑峰 阅读(1201) 评论(0) 推荐(0) 编辑

2011年9月9日

openfire servlet插件

摘要: 项目中需要 openfire 对外提供一个web接口,接受客户端发送过来的http 请求,按照参数处理后返回相应的response。于是考虑使用servlet插件。 实现方法:1.在src/plugins目录下建立如下结构的目录。 2.在java build path 中source 页添加 myservlet/src/java 目录。 3.在org.jivesoftware.openfire.plugin 包下新建class MyservletPlugin 实现Plugin接口;新建org.jivesoftware.openfire.plugin.myservlet包,在包下新建Myse.. 阅读全文

posted @ 2011-09-09 21:56 心笑峰 阅读(1287) 评论(2) 推荐(0) 编辑

2011年9月8日

ejabberd分析(三)启动流程

摘要: ejabberd的启动从ejabberd:start() 开始。application:start(ejabberd).application用来表示一个可以单独启动和停止、并被复用的程序单元。通常一个application都有一个同名的app文件来定义。对于系统工具(systool)直接调用的app文件必须包含以下几项:description, vsn, modules, registered, applications我们查看ejabberd.app可以看到以下内容: {application, ejabberd, [{description, "ejabberd"}, 阅读全文

posted @ 2011-09-08 22:48 心笑峰 阅读(2151) 评论(0) 推荐(0) 编辑

一个java项目的打包与发布

摘要: 自己整了个java项目,里面实现了一些数据库访问、配置文件读取、日志记录的功能,在eclipse上调试运行都OK,但需要发布到服务器上就没辙了。项目的目录如下:查了下资料终于搞定,过程如下:1.将项目调试通过,保证项目本身没有error。2.在项目上右击export --->选java下的JAR file 点next。3.全选整个项目,并在复选框中选"export all output folders for check projects" ,export destination中填要生成的jar名,点next。4.pakeging option 直接点next。5. 阅读全文

posted @ 2011-09-08 12:47 心笑峰 阅读(710) 评论(0) 推荐(0) 编辑

2011年9月5日

erlang(1)

摘要: %%server1.erl: -module(server1) -export([start/2,rpc/2]) start(Name,Mod)-> register(Name,spawn(fun()->loop(Name,Mod,Mod:init())end)). rpc(Name,Request)-> Name!{self(),Request}, receive {Name,Response}->Response end. loop(Name,Mod,State)-> receive {From,Request}-> {Re... 阅读全文

posted @ 2011-09-05 22:53 心笑峰 阅读(834) 评论(1) 推荐(1) 编辑

2011年9月2日

ejabberd分析(一)

摘要: 1.客户端连接服务器,并发送消息给服务器的处理在ejabberd_c2s中。 ejabberd_c2s 是一个gen_fsm 状态机,在 ejabberd启动时装载。 初始状态为 wait_for_stream,接受形为 {xmlstreamstart, _Name, Attrs} 的消息,其他任何消息都会导致stop。 接受到连接请求,发送feature 请求后状态改为wait_for_feature_request 。 接受到feature 再发送challenge 后,状态改为 wait_for_sasl_response。 经过sasl鉴权后,状态改为 wait_for_stream, 阅读全文

posted @ 2011-09-02 13:14 心笑峰 阅读(4684) 评论(0) 推荐(3) 编辑

2011年8月27日

Openfire Cache 大小设置

摘要: Openfire中有一个CacheFactory 工厂类,负责创建各种类型的Cache。从控制台的Server -> System Propertys 里面可以设置各个Cache的大小,格式为 cache.XXXX.size 1024byte具体对应的XXXX 为CacheFactory 下 cacheNames.put(Type,Name) 中Name对应的值。 阅读全文

posted @ 2011-08-27 14:52 心笑峰 阅读(296) 评论(0) 推荐(0) 编辑

2011年8月25日

Openfire + ConnectionManager 连接正常但客户端操作失败

摘要: Connection 对于openfire的消息是透传的,只是在原有的消息外面包上一层<route/> 假如openfire 所在ip 为192.168.1.11 服务器上设置的域为 myserver ConnectionManager 所在ip为192.168.1.12 则ConnectionManager 的配置中 <jive> <xmpp> <domain> </domain> 里面填写IP地址会出现问题 填写IP则最终发送到openfire的消息里的to的值为ip,而不是域。所以出现server.name!=packet.to 阅读全文

posted @ 2011-08-25 20:52 心笑峰 阅读(876) 评论(0) 推荐(0) 编辑

2011年8月9日

Openfire 调试信息

摘要: 如图Openfire一般启动之后如果有收到客户端发送的数据则会在控制台打印出来。根据这些信息我们可以很清晰地了解到服务器的数据交互情况,再结合内部的代码和注释,整个Openfire就比较容易搞懂了。这些信息是由一个叫xmldebugger的插件提供的。RawPrintFilter这个类负责处理指定内容的信息,可通过在数据库表ofproperty中添加plugin.xmldebugger.c2s 的属性设置,来控制打印信息的开关。默认情况下为开启。第二种方法就是直接通过管理控制台来操作:服务器-->服务器设置-->Debugger Properties 将Client(default 阅读全文

posted @ 2011-08-09 11:01 心笑峰 阅读(361) 评论(0) 推荐(0) 编辑

2011年8月5日

XMPP文件传输过程

摘要: 客户端A向B 发送文件的过程:两个XMPP节点之间传输文件一般有三种方式:Out-of-Band Data 具体见XEP-0066:点击打开链接in-band bytestream 适合传输较小的数据,通过直接携带在XML中进行传输 具体见:XEP-0047:点击打开链接socks5 通过服务器代理的方式,实现两个节点之间的直接传输以下为通过socks5 方式传输文件的过程:1.A向B发送请求查询B是否支持字节流。2.B返回应答3.A向服务器发送请求,查询可用的代理4.服务器应答,返回目前disco列表中所有可用的服务项5.A验证服务器中每一项是否是字节流代理6.服务... 阅读全文

posted @ 2011-08-05 11:21 心笑峰 阅读(1052) 评论(0) 推荐(0) 编辑

2011年7月22日

Openfire 离线消息的处理机制

摘要: OfflineMessagetrategy:离线消息的处理策略类。1.静态成员变量type 用来设置消息的处理类型,主要包括: 打回 丢弃 存储,在超限情况下打回 存储,在超限情况下丢弃2.静态成员变量quota 标识最大所能存储的message总和大小默认为100k。3.支持OfflineMessageListener事件监听器,只要实现此接口并加入到监听器列表,则在消息被打回或存储时可扑捉到相应消息。 4.所有离线消息都存储在表ofoffline中。OfflineMessageStore:用来具体处理离线消息的类。1.用addMessage(Message message)来存储一条消.. 阅读全文

posted @ 2011-07-22 19:16 心笑峰 阅读(6117) 评论(0) 推荐(0) 编辑

2011年7月3日

OpenFire SSLSocketFactory 编译报错解决

摘要: 下载了OpenFire 的源码导入后SSLSocketFactory 可能出现编译出错的情况。解决方法:将JVM由JRE改为JDK下的JRE。 阅读全文

posted @ 2011-07-03 11:45 心笑峰 阅读(253) 评论(0) 推荐(0) 编辑

导航