初探TUXEDO中間件

這次項目碰到了oracle的tuxedo中間件通訊開發,比較鬱悶的是公司和網上這傢伙的開發資料都比較匱乏,爲免以後遺忘,這次先寫下來,後面再整理整理:)
TUXEDO:Transaction for UNIX has been Extended for Distributed Operation,即被分佈式操作擴展之後的UNIX事務系統  
個人評語:一個讓C程序員爽,讓JAVA程序員心煩的東西。作爲一箇中間件最最關鍵的是它不爽了你不知道它哪裏不舒服。

  • TUXEDO客戶端環境變量

安裝TUXEDO客戶端後使用tuxedo需要下列環境變量,不要採用在程序設置環境變量,血的教訓啊,宕機!
TUXDIR=/home/admin/tuxedo10g
export TUXDIR
WSNADDR=//[ip]:[port]

export WSNADDR
WSINTOPPRE71=yes
export WSINTOPPRE71
PATH=$TUXDIR/bin:$PATH:$HOME/bin
export PATH
#找到動態鏈接庫的路徑
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TUXDIR/lib
export LD_LIBRARY_PATH

  • C編程中的TUXEDO

如果要教程,請去CSDN下載頻道下載,我的積分不夠了http://download.csdn.net/source/2067895
簡單的來說,要用tuxedo編程只需要進行下面的步驟:
1.tpinit();//連接服務器,獲取應用上下文
2.tpalloc();//申請用於通訊的空間地址
3.tpcall();//進行SOCKET連接,並同步獲取返回信息
4.tpfree();//釋放由tpalloc申請的內存地址
5.tpterm();//斷開服務器連接
建議看oracle英文原版的函數說明,裏面有很多特殊用法、調用注意事項和優化方案.http://download.oracle.com/docs/cd/E13203_01/tuxedo/tux80/atmi/rf3c53.htm

  • 編譯TUXEDO的C程序

C程序寫好了,當然還需要編譯。如果是單純C語言寫的tuxedo客戶端,編譯的時候只需要libwsc.so,libbuft.so,libgpnet.so,libfml.so,libfml32.so,libengine.so,libdl.so,libpthread.so這些動態庫文件在${TUXDIR}/lib目錄下,頭文件在${TUXDIR}/include目錄下。
另外,linux系統還需要鏈接/usr/lib/libcrypt.a加密靜態庫
以pbctuxedosend.c文件爲例我們的gcc腳本就可以寫成
gcc -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -I$TUXDIR/include -c -L${TUXDIR}/lib pbctuxedosend.c
gcc --kill-at -shared -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -I$TUXDIR/include -L$TUXDIR/lib  -lwsc -lbuft -lwsc  -lgpnet -lfml -lfml32 -lengine -ldl -lpthread /usr/lib/libcrypt.a -Wl,-soname,libpbctuxedosend.so.1 -o libpbctuxedosend.so.1.0 pbctuxedosend.o
結果就是得到我們jni調用所需要的動態庫文件libpbctuxedosend.so.1.0將它拷貝成libpbctuxedosend.so就得到我們jni調用所需要的動態庫。

  • 實例演練C

Pbctuxedosend.c
頭文件,必須包含
#include <atmi.h>        /* TUXEDO  Header File */
//申請了tpinit結構對象
TPCONTEXT_T  ctxt;
TPINIT *tpinitbuf = (TPINIT* )tpalloc((char*)"TPINIT",NULL,TPINITNEED(0));
//設置爲多會話模式
tpinitbuf->flags = TPMULTICONTEXTS;
//加入服務器多會話上下文
tpinit((TPINIT *)tpinitbuf)
//申請通訊用內存地址
sendbuf = (char *) tpalloc("CARRAY",NULL, sendlen+1)
rcvbuf = (char *) tpalloc(“CARRAY”,NULL, sendlen+1)
//使用內存拷貝將發送報文置入發送內存
(void) memcpy(sendbuf,strSendContext,sendlen);
//調用tpcall與服務器進行同步通訊
ret = tpcall(strServiceName, (char *)sendbuf, 0, (char **)&rcvbuf, &rcvlen, TPNOBLOCK);
//釋放資源
tpfree(sendbuf);
tpfree(rcvbuf);
tpfree((char *)tpinitbuf);
//斷開連接
tpterm();
(需要C完整源文件請聯繫我,這邊發不了附件,上傳不了圖像。。。不知道爲什麼)

  • 實例演練JNI

 /**

 * 調用封裝的Tuxedo庫函數類,演示用
 * @author jun.lijun
 * @version $Id: PbcInvokeTuxedo.java,v 0.1 2010-3-12 下午08:16:02 jun.lijun Exp $
 */
public class PbcInvokeTuxedo {
    static {
        try {
            System.loadLibrary("pbctuxedosend");
        } catch (Exception e) {
        }
    }

    public native static byte[] sendByTuxedoTpCall(String wsnaddr, String serviceName,
                                                   String sendContext);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章