`
yjl49
  • 浏览: 109985 次
社区版块
存档分类
最新评论
文章列表
JAVA里面有时候需要定期地处理某些任务,例如:定期地查询数据库提取数据;定期地清理超时数据;定期地将内存中数据存到数据库。 一种方法是自己写线程,自己控制。另一种方法就是利用java.util.Timer 和 java.util.TimerTask 来实现。 下面就以一个将队列中数据定期存入数据库的例子展示这种用法: import java.util.TimerTask; import java.util.Timer; public class Myservice{ private Queue<String> logs = new LinkedBlocking ...
创建好了Chat room 后就可以通过邀请或用户主动加入的方式添加成员。过程与创建聊天室的相似,不用点在于聊天室已存在,不需要再重新创建,只需将当前用户加入即可。用户发送聊天消息是直接发送给Chat room 的,再由Chat Room转发给所有用户。详细时序图如下:  
用户发送查询iq消息后,再发送presence消息创建聊天室: <presence id="8Li34-12" to="roomname@conference.myserver/clientA"> <x xmlns="http://jabber.org/protocol/muc"></x> </presence> 处理的时序图如下:     1. 用户发送的presence 消息被路由到ChatService中处理。 2.ChatService中保存 ...

JAVA 随机字符串

    博客分类:
  • JAVA
<pre name="code" class="java">public class StringUtils{ private static Random randGen = new Random(); private static char[] letters =("0123456789abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray(); //获取指定长度的随机字符串 ...

erlang debug 调试

 
erlang 提供了一个debugger 调试工具,可以用来单步调试自己的代码。可以在shell 中输入im() 或 debugger:start() 来调出。 首先打开的是一个Monitor 窗口: 在这里可以选择要调试的代码:选择Module--> Interpret。 注意调试的文件必须要通过debug_info 的方式进行编译: c(module.erl,debug_info) 点击后出现第二个窗口IntepretDialog: 可以在Directories中选择调试文件所在目录,在右侧Files中选择要调试的代码文件。 选择后在Monitor 窗口中就会出现 ...
用消息队列和消息应用状态表来消除分布式事务 by 方刚 由于数据量的巨大,大部分Web应用都需要部署很多个数据库实例。这样,有些用户操作就可能需要去修改多个数据库实例中的数据。传统的解决方法是使用分布式事务保证数据的全局一致性,经典的方法是使用两阶段提交协议。 长期以来,分布式事务提供的优雅的全局ACID保证麻醉了应用开发者的心灵,很多人都不敢越雷池一步,想像没有分布式事务的世界会是怎样。如今就如MySQL和PostgreSQL这类面向低端用户的开源数据库都支持分布式事务了,开发者更是沉醉其中,不去考虑分布式事务是否给系统带来了伤害。 事实上,有所得必有所失,分布式事务提供的 ...
客户端在登录 Openfire 时都会收到自己订阅的好友状态,那么这个好友状态是怎么下发下去的呢? 用户在登录后会发送一个<presence> 来更新自己的状态,在PresenceRouter 中进行处理。 这个presence 交由PresenceUpdateHandler 处理,在判断用户为注册用户后使用RosterManager.getRoster() 来获取所有已经订阅的其他用户。 针对每个用户判断关系类型,如果为SUB_FROM,SUB_BOTH 则说明此用户为订阅了自己的。 先向订阅了自己的用户广播状态更新消息。调用initSesion(),从中取出SUB关 ...
  模块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& ...
Openfire 中多处用到了Cache 来存储那些访问较为频繁的数据,例如userManager中的userCache,rosterManager 中的rosterCache。 以下为Openfire中Cache的实现机制: 1. Cache 接口:   interface Cache<K,V> extends java.util.Map<K,V> 提供了基本的Ca ...
客户端登出分为正常离线和断线,正常离线会发送presence 消息通知服务器,断线则无通知发送。   1. 正常离线: 客户端在离线之前发送<presence id='***' type ="unavailable"></presence> 由PresenceRouter 路由到PresenceUpdateHand ...
主从模式: 主服务器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 bin bin:\>mysqldumple -u root -p mydb> d:\mydb.sql //有自己写的存储过程或函 ...
  仍然看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="http://et ...
  ejabberd中由ejabberd_c2s处理: ejabberd_c2s模块启动后gen_fsm的状态位于wait_for_stream 客户端发送 <span style="color: #FF0000;" mce_style="color: #FF0000;"><stream:stream to="localhost" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" ...
通过前面的erlang(1)我们了解到了一个基本的服务器的实现方法。 erlang中为我们提供了这样一个服务器的现成的实现,就是gen_server,不用自己去编写服务器程序了。 所要做的就是以下几个事: 1.确定我们回调模块的名称 2.编写接口函数 3.实现六个回调方法 也就是说我们只需要关注于回调模块的实现就OK了。 1: -module(XXXX) 定义模块名称 2:接口函数,可供调用的函数。 在这里你可以定义所有需要的方法,作为功能调用的入口。 例如常见的start()、stop()等。他们的作用就是调用gen_server,完成指定功能。 3:实现 ...
项目中需要 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.myser ...
Global site tag (gtag.js) - Google Analytics