杂记

Cougaar学习笔记之---定制特殊的AspectType和AspectValue
 动机:在Cougaar中,已经提供了一些标准的AspectType和AspectValue。但在实际的应用中,可能需要定制特殊的
AspectType和AspectValue.
  实现步骤:
  1、在Domain类中定义特殊的AspectValue和AspectType相关的信息, 并注册AspectValue相应的Factory
   Domain类要继承DomainAdapter, 核心代码如下:
public class PersistenceDomain extends DomainAdapter {
    //Aspect Type Factories
    /** DbChange Aspect */
    Factory DbChange = new Factory() {
            public int getKey() {return PersistenceDomainUtil.DBCHANGE_ASPECT;}
            public String getName() {return "DBCHANGE";}
            public AspectValue newAspectValue(Object o) {
                return DoubleAspectValue.create(PersistenceDomainUtil.DBCHANGE_ASPECT, o);
            }
        };
    /**
     * Load the domain and custom aspect types used throughout BOL
     */
    public void load() {
        super.load();
        loadCustomAspectTypes();
    }
    /**
     * Load Custom AspectType Factories
     */
    private void loadCustomAspectTypes() {
        if (AspectType.registry.get(PersistenceDomainUtil.DBCHANGE_ASPECT) == null) {
            AspectType.registry.registerFactory(DbChange);
        }

    }
  ....
}

 其中PersistenceDomainUtil.DBCHANGE_ASPECT的值是:
   public static final int DBCHANGE_ASPECT = AspectType.ASPECT_STRINGS.length + 2;
 
  2、注册Domain类
   在LDMDomains.ini文件中增加一项:
PersistenceDomain=com.justep.business.content.model.persistence.domain.PersistenceDomain

--------------
SQL的一些基本操作:
 1. Select
  grammar: SELECT column_name(s) FROM table_name where_clause
 2. Insert
   grammar: INSERT INTO table_name VALUES (value1, value2,....)
        | INSERT INTO table_name (column1, column2,...) VALUES (value1, value2,....)
 
 3. Update
   grammar: UPDATE table_name SET column_name = new_value WHERE column_name = some_value
 
 4. Delete
  grammar: DELETE FROM table_name WHERE column_name = some_value
  
  
-----------------------
Wildfire处理Client消息的基本过程:
 ClientSocketReader.run()----调用其父类SocketReader.run()
  SocketReader.createSession()----调用子类中的createSession()---ClentSocketReader, ServerSocketReader, ComponentSocketReader.---注意:这个Session与当前的消息处理绑定
  SocketReader.readStream()----获取信息内容,并处理----在处理的过程中,依赖了上下文Session
  

router之间的关系
 有三种类型的router: MessageRouter, IQRouter和PresenceRouter. 在运行的过程中,每种类型的Router只有一个实例,存储在XMPPServer中。
真正管理这三个Router是:PacketRouter.

-------------------------
XMPP协议理解之---IQ语义
 参考资料:RFC 3920(XMPP Core), RFC 3921(XMPP IM)
 摘要:介绍XMPP协议中IQ的语义
 具体内容:
 一、来自RFC 3920的说明
 IQ全称Info/Query, 是一种请求/响应机制,类似于HTTP. IQ使得一个entity可以向另一个entity发送请求,
接收的entity根据请求向发送者做出回应.发送和响应的内容由IQ的child element来定义,同时每个IQ
Element必须有一个id属性. 因此,IQ是使用通过的机制来交换信息, 比如:get/result或set/result。
如下图:
Requesting                 Responding
  Entity                     Entity
----------                 ----------
    |                           |
    | <iq type='get' id='1'>    |
    | ------------------------> |
    |                           |
    | <iq type='result' id='1'> |
    | <------------------------ |
    |                           |
    | <iq type='set' id='2'>    |
    | ------------------------> |
    |                           |
    | <iq type='error' id='2'>  |
    | <------------------------ |
    |                           |
 IQ必须遵守以下的规则:
 1. 每个IQ stanzas必须有id属性;
 2. 每个IQ stanzas必须有type属性,它的值可能是
  2.1 get---这个stanzas是一个请求
  2.2 set---这个stanzas为某个数据设置新值,或替换旧值
  2.3 result---这个stanzas是一个请求(get/set)成功的response
  2.4 error---处理set/get请求失败
 3. 一个entity收到一个请求(get/set)之后,必须返回一个响应(result/error), 且响应的id属性
属性于请求的id属性一致;
 4. 一个entity收到一个响应(result/error)之后,不能依此发出一个响应;但它可以发出另一个请求.
 5. 请求(get/set)属性必须而且只能包含一个child element, 用来表示请求或响应的具体语义;
 6. 一个result类型的IQ stanzas可以包含一个或零个child element;
 7. 一个error类型的IQ stanzas必须包含两个子节点,一个来自于请求(get/set)中的child element
另一个是<error/>
  
 二、来自RFC 3921的说明
 IQ的基本机制在RFC 3920中定义,但IQ的具体语义并不在RFC 3920中定义,而是在extended namespace
中定义(jabber:client和jabber:server并没有定义更多的语义),当前有两个地方扩展了IQ的语义: Roster
Management和Blocking Communitication。同样的道理,我们可以自己定义IQ的特殊语义。


----------------------------------------------------
http://blog.csdn.net/kunp/category/19516.aspx
XMPP协议理解之---Presence语义
 presence类似于广播或发布/订阅机制。一般情况下,一个entity可以发两种presence:有to属性的presence和没有to属性的
presence。
 * 对于没有to属性的presence,server将把这个presence发布给所有订阅了此entity的监听者;
 * 对于有to属性的presence,server将把这个presence转发给相应的目标.
 type属性对于persence是可选的.如果没有type属性,向server通知为个entity在线,可以进行通信;如果有type属性,可以表示
请求的功能。type属性的值域为:
 1. unavariable
 2. subscribe
 3. subscribed
 4. unsubscribe
 5. unsubscribed
 6. probe
 7. error


第一种场景:单方面加为好友
1.申请者:
<presence to="hcr@192.168.1.165" type="subscribe" from="test@192.168.1.165/Exodus">
  <priority>0</priority>
</presence>

2.服务端产生
<presence to="hcr@192.168.1.165" type="subscribe" from="test@192.168.1.165">
  <priority>0</priority>
</presence>

3.被申请者:接收到一个请求
<presence to="hcr@192.168.1.165" type="subscribe" from="test@192.168.1.165">
  <priority>0</priority>
</presence>

4.同时发出一个回应(不加对方为好友)
<presence to="test@192.168.1.165" type="subscribed" from="hcr@192.168.1.165/Exodus">
  <priority>0</priority>
</presence>

5.服务端产生:
<presence to="test@192.168.1.165" type="subscribed" from="hcr@192.168.1.165">
  <priority>0</priority>
</presence>

6.申请者:接收到这个请求,界面表现为:在我的好友中的了hcr. 但在hcr中没有申请者,因为hcr没有将申请者加为好友.

第二场景:互加为好友
 若在第4步中指定加对方为好友时,在第4步之后,同时发生一件事: 这个过程类似于之前描述的过程,只不过两个人的角色互换,
且,在第4步中没有选择,只有输出信息

 Jabber的主机由若干个组件构成,它们分别实现Jabber系统所要求的一些基本功能。这些基本功能包括:
Session管理、用户和服务器之间的通讯、服务器之间的通讯、DNS转换、存储用户的个人信息和朋友名单、
保留用户在下线时收到的讯息、用户注册、用户的身份和权限认证、根据用户的要求过滤讯息和系统记录等。
此外,即时讯息系统要实现接近实时的讯息传输,必须随时知道讯息的主机是否在线(presence)。
在服务器和服务器之间的通讯功能里,主机的一个模块专门负责和其他服务器实时交换用户是否在线的信息。


-----------------------------
Jabber学习之--理解JSO
 JSO是JABBER流对象(Stream Objects)的一个Java包.它为Jabber/XMPP协议提供底层支持与一个完全可控制的stream连接接口。
JSO的目的是为构建基于Jabber的客户端/组件/服务器提供一个可定制且非常灵活的平台。
 JSO主要分成两部分内容:对XMPP Core规范的支持,对XMPP Extensions规范的支持。(它主要支持的是数据的流入和流出,以及一些通用
的功能,如验证、Ad-Hoc command等等)
 以下是从代码结构的角度来分析JSO
 1. XMPP Core模块:
  其中的关键概念是Stream和StreamSource,以及它们之间的关系.
  Stream是所有连结的抽象接口,通过这个接口,数据被发送和接收(如packet, extension对象就在这里被创建),同时管理连结的状态
和信息。
  StreamSource是接收和发送XML数据的最后接口,它是所有连结的抽象(如http, socket, component...),它真正管理连接的状态以及
连接之上的操作.
  Stream聚合了一个StreamSource对象,Stream发送和接收的数据都是使用StreamSource来实现的. Stream和StreamSource共同组成了基于
XMPP协议的Client/Server/Application与网络之间的接口。
 2. XMPP Extensions模块:
 
 
----------------------------------------
为您的Java应用程序添加退出事件处理
链接:http://gceclub.sun.com.cn/yuanchuang/2004_Q4/java_exit.html
功能:为应用程序添加退出处理功能
实现:Runtime.getRuntime().addShutdownHook(thread);//thread中的run就是退出时要执行的动作

 


-----------------------------------
eclipse3.1 + tomcat3.1 plugin + sand调试环境建立
  
   环境:
1. jdk1.4(不能用1.5)
2. tomcat5.0 (4.x会有问题)
3. sand 0.9_0_0
4. 基于sand0.9_0_0的简单应用book(其中注释了XHTMLSandUIServlet中initEncryptor中的内容)
5. MySql (用户名:root, 密码:root, 数据库名:taskheap)


   基本步骤:
1. 将MyApp project发布到tomact环境下的工程导入到eclipse下的project下
2. 将ant生成之后的源码(包括apps/basic/src, apps/MyApp/src, apps/ui/src, platform/tools/src, deploy/MyAppDemo/webapp/src)导入到eclipse project中的WEB-INF
3. 引用一些必要的包:jmx.jar, mail.jar, servlet.jar, j2ee.jar
4. 修改其中的一些bug(主是要taskheap相关的)
  
   遇到以下的几个问题:
1. 时间问题
   解决方案:在eclipse的tomcat启动中增加参数:-Duser.language="en"  -Duser.country="US"
2. 断点时,查看变量的值的问题
   解决方案:刚开始调试的时候,找不到源码,lookup source时,一定要通过java project来找source,而不能通过file来找source。
3. jdk版本问题
   project的jdk compliance设置为1.4

   注意事项:
   每次重新启动的时候,要将MySql中taskheap中的内容清空(原因:MySql中将VARCHAR(4096)转换成TEXT存储,有问题)  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值