第10章:TUXEDO的可靠消息队列(6)

2019-09-02 17:12

userlog(\

if (tperrno == TPEDIAGNOSTIC) { userlog(\ } }

上面的程序采用全局事务,能够实现所要求的业务,

在ENQ中, 执行tpabort()时,原先tpenqueue()中发送到DEMOQ中的消息会被自动从DEMOQ中删除.

在ENQ中, 执行tpabort()时,原先tpdequeue()从DEMOQ中取出的消息会保留再DEMOQ中,不会被自动删除.

tpeuqueue()的调用说明:

如果调用 tpenqueue()的程序当前处于事务模式,并且tpenqueue()中的FLAGS参数没有设置TPNOTRAN,那么tpenqueue()处于当前事务中,如果该事务成功提交,那么tpenqueue()中发送的消息一定在QUEUE中, 如果该事务回滚,那么tpenqueue()中发送的消息一定不会在QUEUE中

如果调用 tpenqueue()的程序当前不处于事务模式,或者tpenqueue()中的FLAGS参数设置

strcpy(reqstr,tpstrerror(tperrno)); tpreturn( TPFAIL, 0, reqstr, 0, 0 );

}

userlog(\strcpy(c_ename,reqstr);

EXEC SQL INSERT INTO TEST values(:c_ename); if(sqlca.sqlcode !=0) {

userlog(\strcpy(reqstr,(char *)sqlca.sqlerrm.sqlerrmc); if(tpabort(0)==-1) {

userlog(\strcpy(reqstr,tpstrerror(tperrno));

}

tpreturn( TPFAIL, 0, reqstr, 0, 0 );

}

if(tpcommit(0) == -1) { userlog(\}

strcpy(reqstr,\

tpreturn( TPSUCCESS, 0, reqstr, 0, 0 );

了TPNOTRAN,那么tpenqueue()不处于当前的事务中,

如果该事务成功提交,那么tpenqueue()中发送的消息一定在QUEUE中, 如果该事务回滚,tpenqueue()中发送到QUEUE中的消息还会保留在QUEUE中,不会被自动从该QUEUE中删除.

对tpdequeue()也是同样的道理.

如果不采用全局事务,如象下面这样写采用本地事务写DEMO.CPP,那么是达不到要求的. 在ENQ中, 执行EXEC SQL ROLLBACK时,原先tpenqueue()中发送到DEMOQ中的消息不会被自动从DEMOQ中删除.还会保留再DEMOQ中

在ENQ中, 执行EXEC SQL ROLLBACK时,原先tpdequeue()从DEMOQ中取出的消息不会被重新保留在DEMOQ中,会被自动删除.

#include #include #include

EXEC SQL INCLUDE sqlca;

EXEC ORACLE OPTION (RELEASE_CURSOR = YES);

EXEC SQL BEGIN DECLARE SECTION; varchar vc_user[20]; char c_ename[20]; EXEC SQL VAR c_ename EXEC SQL END DECLARE SECTION;

int tpsvrinit(argc, argv) int argc;

char *argv[]; { }

ENQ(TPSVCINFO *rqst) {

//连接数据库

strcpy(vc_user.arr,\vc_user.len=11;

exec sql connect :vc_user; if(sqlca.sqlcode!=0) {

tpreturn(TPFAIL, 0, 0, 0L, 0); }

return 0;

IS STRING(20);

char *reqstr; long len; TPQCTL qctl;

reqstr=rqst->data;

EXEC SQL SELECT ename into :c_ename from EMP where empno=1000; if(sqlca.sqlcode !=0)

{ }

userlog(\strcpy(reqstr,(char *)sqlca.sqlerrm.sqlerrmc); tpreturn( TPFAIL, 0, reqstr, 0, 0 );

qctl.flags = 0;

if (tpenqueue(\{

userlog(\if (tperrno == TPEDIAGNOSTIC) {

printf(\

} strcpy(reqstr,tpstrerror(tperrno)); tpreturn( TPFAIL, 0, reqstr, 0, 0 ); }

EXEC SQL delete from EMP where empno=1000; if(sqlca.sqlcode !=0) { }

EXEC SQL commit release; if(sqlca.sqlcode !=0) {

userlog(\strcpy(reqstr,(char *)sqlca.sqlerrm.sqlerrmc);

userlog(\strcpy(reqstr,(char *)sqlca.sqlerrm.sqlerrmc); exec sql ROLLBACK; if(sqlca.sqlcode !=0) { }

userlog(\strcpy(reqstr,(char *)sqlca.sqlerrm.sqlerrmc);

tpreturn( TPFAIL, 0, reqstr, 0, 0 );

}

tpreturn( TPFAIL, 0, reqstr, 0, 0 );

}

strcpy(reqstr,\

tpreturn( TPSUCCESS, 0, reqstr, 0, 0 );

DEQ(TPSVCINFO *rqst) {

char *reqstr; long len;

TPQCTL qctl;

reqstr=rqst->data;

qctl.flags = 0; if (tpdequeue(\\(TPQCTL *)&qctl, (char **)&reqstr,&len, TPNOTIME) == -1)

{ userlog(\ if (tperrno == TPEDIAGNOSTIC) { userlog(\ }

strcpy(reqstr,tpstrerror(tperrno)); tpreturn( TPFAIL, 0, reqstr, 0, 0 );

}

userlog(\strcpy(c_ename,reqstr);

EXEC SQL INSERT INTO TEST values(:c_ename); if(sqlca.sqlcode !=0) {

userlog(\strcpy(reqstr,(char *)sqlca.sqlerrm.sqlerrmc); exec sql ROLLBACK; if(sqlca.sqlcode !=0) { }

userlog(\strcpy(reqstr,(char *)sqlca.sqlerrm.sqlerrmc);

tpreturn( TPFAIL, 0, reqstr, 0, 0 ); }

EXEC SQL commit release;

}

if(sqlca.sqlcode !=0) {

userlog(\strcpy(reqstr,(char *)sqlca.sqlerrm.sqlerrmc); tpreturn( TPFAIL, 0, reqstr, 0, 0 );

}

strcpy(reqstr,\

tpreturn( TPSUCCESS, 0, reqstr, 0, 0 );

客户端的程序为: #include #include \#include \

int main(int argc, char **argv) { char *reqstr;

long len;

if (tpinit(NULL) == -1) { printf(\ exit(1); }

if ((reqstr = tpalloc(\{ }

printf(\exit(1);

if( (tpcall(\{ }

printf(\tpterm(); exit(1);

printf(\sleep(5);

if( (tpcall(\

}

{ }

printf(\tpterm(); exit(1);

printf(\tpfree(reqstr); tpterm();


第10章:TUXEDO的可靠消息队列(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:高一化学-2013-2014学年高一下学期期中考试化学试题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: