1. EAS消息中心主动向第三方系统推送消息
使用此功能需要实现一个接口MessageWebServiceDao
接口全路径:com.kingdee.eas.base.message.webservice.MessageWebServiceDao
接口类所在包名:bs_message-server.jar
1.1. 接口方法说明
public boolean addMessage(WSMessage message)
用于在第三方系统中添加消息,其中参数message包含一些消息的信息,这个方法在消息中心获得新的消息的时候会主动调用。
public boolean removeMessage(String ID)
用于EAS消息中心主动删除第三方系统相应的消息记录,参数ID是WSMessage中的MsgID字段的值,这个方法是在消息中心删除消息的时候会调用。
public boolean updateMessage(String ID)
与消息中心消息状态同步接口,参数ID是WSMessage中的MsgID字段的值。这个接口是现实的是当鼠标点击在某条消息上时改变消息状态的情况下被调用。
public boolean updateMessages(String IDs, MsgStatus state)
与消息中心消息状态同步接口,参数IDs是多条消息的MsgID的值的集合,state是要设置消息的状态值,这个接口是在界面上按下“设置消息已读”或“未读”按钮时被调用。
1.2. 配置文件说明
eas\server\deploy\portalconfig\easWebConfig.xml文件中有如下的配置项
<configitem name="otherSystem">
<!--是否启用与第三方系统消息集成-->
<attribute key="toSys" value="true" />
<attribute key="letGet" value="true"/>
</configitem>
配置项的value值是“true”,启用功能。
eas\ server\deploy\portalconfig\WSConfig.xml文件中配置信息。
<?xml version="1.0" encoding="utf-8"?>
<config>
<class>
//EAS portal消息中心的url
<server>http://ip:port/easportal?toPage=SYS_PC</server>
//数据中心编码
<dataCenter>db540</dataCenter>
//实现类的包名加类名
<path>com.kingdee.eas.base.message.webservice.testWebServiceImpl</path>
//任务类型消息是否接受
<task value="true">
//任务类型消息节点下的工作流消息是否接受
<workflow>true</workflow>
</task>
//通知类型消息是否接受
<notice value="true">
//通知类型消息节点下的工作流消息是否接受
<workflow>true</workflow>
//通知类型消息节点下的预警消息是否接受
<forwarn>true</forwarn>
//通知类型消息节点下的催办消息是否接受
<urgent>true</urgent>
</notice>
//即时消息是否接受
<online value="true"></online>
</class>
</config>
配置文件需要注意的是每个节点都需要配置,格式要求比较严格,所以要按照示例格式配置,若有多个第三方系统集成,则配置多个class树即可。
A、<server>节点中的值是对应的EAS消息中心的URL,客户那边只能展现消息,具体的业务逻辑处理还是在EAS的消息中心,如果需要单点登陆,需要在URL串后面加上相应的单点登录信息。
B、<path>节点的值是客户实现类的“包名+类名”,EAS消息中心将用反射机制来调用这个类。将这个类打包后放在sp目录下。
task 、notice、online等节点下的值都为true,来启用相应的任务、通知、即时消息的发送,如果为false则相应类型消息将不会被发送出去。<dataCenter>节点值需要配置为当前使用的数据中心编码,如果不匹配也不会发送消息,修改配置文件后需要重启服务器才能起作用。
1.3. WSMessage 字段说明
//消息ID
private String msgID;
//消息标题
private String title;
//消息内容
private String body;
//优先级
private MsgPriority priority;
//发送时间
private Timestamp sendTime;
//接受时间
private Timestamp receiveTime;
//源业务对象ID
private String sourceID;
//接收者名字
private String receivers;
//消息状态
private MsgStatus state;
//消息类型
private MsgType type;
//业务类型
private MsgBizType bizType;
//发送者名字
private String sender;
//EAS portal消息中心的url
private String url;
//接收人ID
private String recieverID;
//组织ID
private String OrgID;
这里WSMessage消息类对消息中心中的存在的消息类新做了统一的转型处理,在实现类中接收到的WSMessage对象中获得的字段中存在是空值的情况,需要开发人员自行控制。
1.4. 调用示例
public class testWebServiceImpl implements MessageWebServiceDao {
public boolean addMessage(WSMessage message) {
if(message.getReceiveTime() == null){
message.setReceiveTime(new Timestamp(System.currentTimeMillis()));
}
System.out.println( "----------------addMessage------------" );
System.out.println( "msgID:" + message.getMsgID());
System.out.println( "title:" + message.getTitle());
System.out.println( "body:" + message.getBody());
System.out.println( "priority:" + message.getPriority().getAlias());
System.out.println( "sendTime:" + message.getSendTime().toString());
System.out.println( "receiveTime:" + message.getReceiveTime().toString());
System.out.println( "sourceID:" + message.getSourceID());
System.out.println( "receivers:" + message.getReceivers());
System.out.println( "state" + message.getState().toString());
System.out.println( "type:" + message.getType().getAlias());
System.out.println( "bizType:" + message.getBizType().getAlias());
System.out.println( "sender:" + message.getSender());
System.out.println( "url:" + message.getUrl());
System.out.println( "recieverID" + message.getRecieverID());
System.out.println( "OrgID:" + message.getOrgID());
System.out.println( "----------------addMessage------------" );
return false;
}
public boolean removeMessage(String ID) {
System.out.println( "----------------removeMessage------------" );
System.out.println(ID);
System.out.println( "----------------removeMessage------------" );
return false;
}
public boolean updateMessage(String ID) {
System.out.println( "----------------updateMessage------------" );
System.out.println(ID);
System.out.println( "----------------updateMessage------------" );
return false;
}
public boolean updateMessages(String ids, MsgStatus state) {
System.out.println( "----------------updateMessages------------" );
System.out.println(ids);
System.out.println( "----------------updateMessages------------" );
return false;
}
}
最后将写好的类编译,将编译后的class文件打成jar包,注意不要和原来EAS系统中的jar包重名。打完jar包以后,将jar包放置在eas\server\lib\sp\目录下。如果是websphere应用服务器的话,需要重新通过管理控制台进行一次部署。
2. 第三方系统向EAS消息中心来推送消息这个功能需要使用EAS消息中心提供的webservice接口。
首先获取EAS消息中心的webservice接口的WSDL文件,启动Apusic,用浏览器访问
http://ip:port/ormrpc/services获取WSWsMessageCenterFacade的WSDL文件,
还需要EASLogin这个服务(因为首先需要登录EAS,才能访问到元数据)。所以在EASLogin和WSWsMessageCenterFacade服务边上的(wsdl)位置上点右键“另存为”,将得到的文件的后缀名改为wsdl。然后根据wsdl文件生成webservice的客户端代码。
2.1. WSWsMessageCenterFacade服务提供的接口的功能addMessage 外部系统往EAS推消息时,在EAS消息中心添加消息记录参数说明:
userID String 接收者的用户账号
title String 消息的标题
senderID String 发送者的用户账号
priority int 消息优先级 0低 ; 10中;20高
status int 消息状态 0 未读;10已读
body String 消息内容
sourceID String 外部系统的数据ID
type String 消息类型
bizType String 消息业务类型
url String 双击消息进行URL的转跳功能时将使用到这个URL
sysSign String 第三方系统标识
recieveTime String 接收时间
updateMessageStatus 同步消息状态(已读、未读)
参数说明:
msgSourceID String 消息源ID 消息在第三方系统中的ID
state int 状态0 未读;10已读
removeMsgBySID 删除EAS中的消息记录
参数说明:
sourceID String 外部系统的数据ID
2.2. 二次开发注意事项
addMessage接口中涉及到的用户名指的是EAS系统中的用户名,sourceID字段保存的是该消息在第三方系统中对应的ID标识,用来和第三方系统中的数据同步时使用,确保该字段的数据唯一性。
addMessage接口中的sysSign字段是对多个第三方系统的消息进行来区分的标识,需要和EAS中的第三方消息节点的配置进行配合来进行,节点的配置方法见文档附录。
在每次调用EAS的webservice的接口的时候,先要调用EAS的登陆服务,否则将无法使用EAS系统的元数据。调用方法如下:首先,先要对EASLogin这个服务的wsdl文件生成客户端代码。然后,写如下类似代码进行调用
2.3. 代码示例
这里login的方法中的参数依次是“登陆的用户名”,“密码”,“解决方案”(一般为eas即可),“数据帐套编码”,“语言类型”,“数据库类型”( 0 :MS SQL Server 1:DB2 2:Oracle)
public static void login() throws ServiceException, RemoteException {
EASLoginProxyService loginSrv = new EASLoginProxyServiceLocator();
EASLoginProxy loginClient = loginSrv.getEASLogin();
loginClient.login( "popo" , "" , "eas" , "db540" , "L2" , 2);
}
public static void main(String[] args) {
try {
WSWsMessageCenterFacadeSrvProxy client = getClient();
login();
//这里先调用了登录服务
getClient().addMessage(
"linda" ,
"gggggg" ,
"popo" ,0,0,
"123456" ,
"111111" ,
"" ,
"" ,
"http://www.baidu.com" , "454654" , "2007-10-2" );
}
3. 第三方系统从EAS消息中心取消息 此功能也需要调用EAS的webservice的接口,所以前面很大一部分的客户端代码生成和怎么来调用接口的问题就不再赘述了。这里就简单介绍一下这部分功能的接口。(wsdl文件和第一部分是相同的)
3.1. checkMessageCountcheckMessageCount:查询新消息记录条数 在第三方系统主动取EAS系统消息时查询可获取的消息条数(这个数目是用户之间隔离的)
参数说明: userID String 用户名
用法:在每次取数之前调用该方法,返回为0的话说明该用户没有需要更新的数据,就没有必要再去取数
3.2. clearMessageCount
clearMessageCount:消息可获取数清0 在第三方系统主动取EAS系统消息时将可获取的消息条数清零
参数说明: userID String 用户名
用法:在每次取数之后调用该方法,清空待更新消息的数据。
3.3. removeMsgByID
removeMsgByID:根据EAS消息ID删除消息 第三方系统取EAS消息时,同步删除EAS消息中心的
参数说明:messageID String 消息ID
用法:在第三方系统中将消息删除以后,需要调用该方法,来保持数据的一致性。同时要求第三方系统要保存EAS系统消息的ID
3.4. getMessageList
getMessageList:获得消息列表 获取全部待更新的消息
参数说明: userID String 用户名
用法:返回的是一个XML字符串流,格式如下
3.5. 消息流
<?xml version=\"1.0\" encoding=\"GBK\" ?>
<ROWSET>
//每一条消息取出的时候就是一个<ROW>,有多条消息就有多个row
<ROW num=> //数据行数
<ID></ID> // 消息ID(在EAS系统中)
<TYPE></TYPE> // 消息类型
<BIZTYPE></BIZTYPE> // 消息业务类型
<PRIORITY></PRIORITY> // 优先级
<STATUS></STATUS> // 已读未读状态
<TITLE></TITLE> // 消息标题
<BODY></BODY> // 消息内容
<SENDER></SENDER> // 消息发送人
<RTIME></RTIME> // 消息接收时间
</ROW>
</ROWSET>
4. EAS消息中心第三方系统消息节点配置方法
4.1. 配置流程1、用administrator用户登录EAS客户端,进入消息中心,点击“编辑”菜单,然后点击“外部消息分类维护”菜单项
2、在弹出界面上点击“新建”按钮
在此界面中的“外部系统名称”和“外部系统编码”里面的内容是需要通过一个配置文件进行配置的,配置文件的路径是:eas\server\profiles\server1\config\portalConfig\otherSystem.xml
配置文件的和界面显示数据的关系看以下图
界面数据:
4.2. 相关配置文件配置文件数据:
<config>
<system>
<systemID>121212</systemID>
<systemName>Other</systemName>
</system>
<system>
<systemID>888888</systemID>
<systemName>mySystem</systemName>
</system>
<system>
<systemID>454654</systemID>
<systemName>OtherSys</systemName>
</system>
<system>
<systemID>841202</systemID>
<systemName>OA</systemName>
</system>
</config>
这里配置以后的节点是和第三方的系统之间隔离的,所以每个节点下面的数据是来自同一个外部系统的数据。
这里的节点上定义的编码是和webservice的接口addMessage中的参数sysSign 对应的。需要特别注意。