Ecology通用短信接口实现方式及使用说明
考虑到目前短信设备供应商多如牛毛,我们不可能和每个供应商做集成开发,因此设计了这个短信通用接口。
接口的原理很简单,就是ecology只负责把需要发送的短信数据放到中间表里,由短信设备供应商或客户自己把中间表里的数据发送出去。实际上大多数短信设备供应商已经实现了通过中间表方式发送短信。
接口对中间表的存放的位置、中间表名及字段名没有要求,因为往中间表插入数据的sql是在配置文件中指定的,但是有两点要注意
1. 必须使用sql server或oracle数据库,其他的数据库暂时不支持。
2. 必须有用于存放短信内容、短信接受人的字段。
使用说明:
在理解了上面的原理之后,我们可以继续了解配置使用接口的方法。
1. 找到ecoloyg/WEB-INF/service/sms.xml,打开这个文件,里面的内容如下:
<module id=”sms” version=”1.0.0″>
<service-point id=”smssender” interface=”weaver.sms.SmsService”>
<invoke-factory>
<construct class=”weaver.sms.JdbcSmsService”>
<set property=”type” value=”sqlserver”/>
<set property=”host” value=”192.168.0.204″/>
<set property=”port” value=”1433″/>
<set property=”dbname” value=”ecology3802″/>
<set property=”username” value=”sa”/>
<set property=”password” value=”123″/>
<set property=”sql” value=”insert into OutBox(ReceiverMobileNo,Msg,SendTime,IsChinese,ExpressLevel,Sender) values(?,?,getDate(),1,1,1)”/>
</construct>
</invoke-factory>
</service-point>
</module>
我们需要关注的是红色部分的内容。我逐一讲解一下.
<set property=”type” value=”sqlserver”/>: 指定中间表所在数据库的类型,如果是oracle的话就改为value=”oracle”
<set property=”host” value=”192.168.0.204″/>: 指定中间表所在数据库服务器的ip
<set property=”port” value=”1433″/>: 指定中间表所在数据库的端口,如果是oracle的话应改为1521
<set property=”dbname” value=”ecology3802″/>: 指定中间表所在数据库名
<set property=”username” value=”sa”/>: 指定中间表所在数据库帐号
<set property=”password” value=”123″/>:指定中间表所在数据库密码
以上的配置和weaver.properties中的参数差不多,应该不难理解。
<set property=”sql” value=”insert into OutBox(ReceiverMobileNo,Msg,SendTime,IsChinese,ExpressLevel,Sender) values(?,?,getDate(),1,1,1)”/>: 指定往中间表插入数据使用的sql语句。例子中的这条sql是我给一个客户写的,客户提供的中间表结构是:
表名:OutBox
字段:ReceiverMobileNo, —————-接受人
Msg, —————-短信内容
SendTime, —————–发送时间
IsChinese, —————–是否中文
ExpressLevel, —————–紧急程度
Sender —————-发送人
实际上我们只需要用到接受人和短信内容两个字段,这两个字段的值不是固定的,由我们的接口负责把数据传过来,因此用?号表示他们的值。其他字段的值我们不关心,可以随便写死一些数据,这个例子里我全部写的1,发送时间是用sql server自带的函数getDate()获取的。
我们可以这样理解,最简单的中间表可以是这样子的:
表名:someTable
字段:MobileNo,
messageBody
2. 修改ecology/WEB-INF/prop/weaver_rtx.properties中的内容为:
#config file
#Fri Aug 13 11:30:56 CST 2004
IsInitRTXOrg=true
IsDownLineNotify=true
#CurSmsServer=rtx
CurSmsServerIsValid=true
RTXServerPort=8036
RTXServerIP=
RTXServerOutIP=
也就是说只要把CurSmsServer=rtx用#号注释掉就可以了。(相信大家都清楚CurSmsServer参数是用来指定当前短信发送设备的)
下面我提供两个建中间表的sql脚本供客户参考:
1. for sqlserver
CREATE TABLE outbox (
ID int IDENTITY (1, 1) ,
ExpressLevel int ,
Sender varchar (50) ,
ReceiverMobileNo varchar (50),
Msg varchar (500) ,
SendTime datetime,
IsChinese bit
)
3. for oracle
create table OUTBOX
(
ID NUMBER not null,
EXPRESSLEVEL NUMBER,
SENDER VARCHAR2(50),
RECEIVERMOBILENO VARCHAR2(50) not null,
MSG VARCHAR2(500),
SENDTIME DATE not null,
ISCHINESE NUMBER not null
);
create sequence OUTBOX_ID_SEQ
minvalue 1
maxvalue 999999999
start with 141
increment by 1
cache 20;
CREATE OR REPLACE TRIGGER “SET_OUTBOX_ID” BEFORE
INSERT ON “OUTBOX”
FOR EACH ROW
DECLARE
NEXT_OUTBOX_ID NUMBER;
BEGIN
SELECT OUTBOX_ID_SEQ.NEXTVAL INTO NEXT_OUTBOX_ID FROM DUAL;
:NEW.ID := NEXT_OUTBOX_ID;
END;
oracle下对应的sms.xml文件内容为:
<module id=”sms” version=”1.0.0″>
<service-point id=”smssender” interface=”weaver.sms.SmsService”>
<invoke-factory>
<construct class=”weaver.sms.JdbcSmsService”>
<set property=”type” value=”oracle”/>
<set property=”host” value=”192.168.0.204″/>
<set property=”port” value=”1521″/>
<set property=”dbname” value=”weaver1″/>
<set property=”username” value=”ecology40002″/>
<set property=”password” value=”ecology”/>
<set property=”sql” value=”insert into OutBox(ReceiverMobileNo,Msg,SendTime,IsChinese,ExpressLevel,Sender) values(?,?,(select sysdate from dual),1,1,’1′)”/>
</construct>
</invoke-factory>
</service-point>
</module>
实际上使用中间表来和短信供应商集成只是我们通用接口的一部分,这种实现方式的缺点是短信供应商通常以定时扫描中间表的方式来把短信数据发送出去,短信发送的时间取决于扫描的频度,实时性稍差。
如果客户不喜欢中间表的方式,他还可以选择自己去实现发送短信的方法,当然,必须使用java编程语言。当他把自己写的发送方法部署到系统中之后,ecology在发送短信的时候就会调用客户的实现。部署的方法也很简单,复杂的是只有java程序员才看的懂,具体操作起来可以向泛微开发人员咨询:
1. 编写客户自己的实现。只需要实现我们提供的SMSService接口:
public interface SmsService {
public boolean sendSMS(String smsId,String number,String msg);
}
假定客户是这样实现的:
public class TestService implements SmsService{
public boolean sendSMS(String smsId,String number,String msg){
System.out.println(“接受人:”+number);
System.out.println(“测试短信:”+msg);
return true;
}
}
那么ecology系统在发送短信时将会调用TestService中的sendSMS方法。
2. 把客户的实现部署到ecology中。修改sms.xml就可以了,我还是用上面的客户实现为例:
<module id=”sms” version=”1.0.0″>
<service-point id=”smssender” interface=”weaver.sms.SmsService”>
<invoke-factory>
<construct class=”weaver.sms.TestService”>
</construct>
</invoke-factory>
</service-point>
</module>
红色部分表示ecology在发送短信是将调用TestService实现。
转载请注明:赫非域 » Ecology通用短信接口实现方式及使用说明