weblogic 和 tuxedo 之間的調用

      BEA公司的TUXEDO,WEBLOGIC作爲優秀的中間件產品,在銀行、電信、金融等行業廣泛使用,通常採用TUXEDO實現系統的核心業務,用WEBLOGIC做爲系統擴展到INTERNET的平臺,實現電子商務,由WEBLOGIC調用TUXEDO上的服務,所以TUXEDO與WEBLOGIC之間的互連經常遇到。

    因爲在工作中經常用到,先就個人總結和網上收集的資料總結如下,惠人惠己。

目錄:
一.    調用方式    
二.    WTC配置步驟:    
1.    Tuxedo的配置    
2.1.1.    設置環境變量:    
2.1.2.    編寫Tuxedo服務(atmi)    
2.1.3.    配置ubbconfig   
2.1.4.    編譯ubbconfig文件    
2.1.5.    配置domconfig    
2.1.6.    編譯domconfig    
2.    Weblogic配置(7.0以上的版本)    
2.1.7.    配置config.xml    
3.    Weblogic做客戶端,訪問Tuxedo服務    
4.    Tuxedo做客戶端,訪問Weblogic服務    
三.    JOLT配置步驟:    
1.    Tuxedo的配置    
3.1.1.    配置ubbconfig    
3.1.2.    註冊tuxedo service    
2.    Weblogic的配置    
3.1.3.    配置jolt pool    
3.1.4.    配置startup class, shutdown class    
3.    程序調用例子    
四.    CORBA的調用步驟:    
1.    獲得IDL,並且根據IDL生成java class    
2.    配置config.xml文件    
3.    程序調用例子    
-----------------------------------------------正文-------------------------------------------------------------------------

    一.    調用方式
WEBLOGIC與TUXEDO的調用有三種方式
1.    WTC(WEBLOGIC TUXEDO CONNECTOR)
2.    JOLT
3.    CORBA(Common Object Request Broker Architecture)

WTC不僅能讓WEBLOGIC調用TUXEDO中的SERVICE,而且能讓TUXEDO調用WEBLOGIC中的EJB,但是隻能用於WEBLOGIC與TUXEDO之間進行互連。
JOLT只能讓WEBLOGIC調用TUXEDO. 但JOLT可以使TUXEDO與WEBSPERE等其他應用服務器相連。
CORBA是通用對象請求代理體系結構(Common Object Request Broker Architecture) 的英文縮寫,這是標準化組織OMG提出的一種實現分佈式異構環境下面向對象軟件的可重用、可移植、可互操作的體系結構。只要符合CORBA規範的服務器之間都可以互聯。

二.    WTC配置步驟:
1.    Tuxedo的配置
2.1.1.    設置環境變量:
set TUXDIR=C:\bea\tuxedo8.0
set APPDIR=C:\bea\tuxedo8.0\samples\atmi\simpapp
set PATH=%TUXDIR%\bin;%APPDIR%;%PATH%
set TUXCONFIG=%APPDIR%\tuxconfig  編譯之後生成的2進制配置文件. tuxconfig
set BDMCONFIG=%APPDIR%\bdmconfig編譯之後生成的2進制配置文件. bdmconfig
2.1.2.    編寫Tuxedo服務(atmi)
#include <stdio.h>
#include <ctype.h>
#include <atmi.h>    /* TUXEDO Header File */
#include <userlog.h>    /* TUXEDO Header File */

/* tpsvrinit is executed when a server is booted, before it begins
   processing requests.  It is not necessary to have this function.
   Also available is tpsvrdone (not used in this example), which is
   called at server shutdown time.
*/

#if defined(__STDC__) || defined(__cplusplus)
tpsvrinit(int argc, char *argv[])
#else
tpsvrinit(argc, argv)
int argc;
char **argv;
#endif
{
    /* Some compilers warn if argc and argv aren't used. */
    argc = argc;
    argv = argv;

    /* userlog writes to the central TUXEDO message log */
    userlog("Welcome to the simple server");
    return(0);
}

/* This function performs the actual service requested by the client.
   Its argument is a structure containing among other things a pointer
   to the data buffer, and the length of the data buffer.
*/

#ifdef __cplusplus
extern "C"
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
TOUPPER(TPSVCINFO *rqst)
#else
TOUPPER(rqst)
TPSVCINFO *rqst;
#endif
{

    int i;

    for(i = 0; i < rqst->len-1; i++)
        rqst->data[i] = toupper(rqst->data[i]);

    /* Return the transformed buffer to the requestor. */
    tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);
}

 2.1.3.    配置ubbconfig
*RESOURCES
IPCKEY        123456

DOMAINID    simpapp
MASTER        simple
MAXACCESSERS    50
MAXSERVERS    25
MAXSERVICES    50
MODEL        SHM
LDBAL        N

*MACHINES
        "SZ-XJS-DUANW"    
        LMID=simple
        APPDIR="C:/bea/tuxedo8.0/samples/atmi/simpapp"
        TUXCONFIG="C:/bea/tuxedo8.0/samples/atmi/simpapp/tuxconfig"
        TUXDIR="C:/bea/tuxedo8.0"

*GROUPS
GROUP1
    LMID=simple    GRPNO=1    OPENINFO=NONE

GROUP2
    LMID=simple GRPNO=2 OPENINFO=NONE

*SERVERS
simpserv    SRVGRP=GROUP1 SRVID=1
/* simpserv編譯生成的可執行文件名字*/
DMADM       SRVGRP=GROUP2 SRVID=2
/*域間通信的進程:管理域的server,在運行時管理BDMCONFIG,對已登記的gateway group提供支持,在tuxedo系統中,只能有一個DMADM進程,且不能對它採用MSSQ,不能有REPLYQ.*/

GWADM       SRVGRP=GROUP2 SRVID=3 
/*管理域的域網關進程,在運行時可以對某一組域網關進行管理,主要從DMADM那裏取得域的配置信息,並對域網管進程及跨越域的全局事務的LOG文件進行管理.*/

GWTDOMAIN   SRVGRP=GROUP2 SRVID=4
/*處理域之前的互操作,使本地域和調用遠程域可以互相調用彼此的service,其中GMADM和GWTDOMAIN必須在一個組中,一個tuxedo應用可以有多個GWADM,GWTDOMAIN對,一個組只能有一個GMADM,GWTDOMAIN對,但一個tuxedo應用只能有一個DMADM,DMADM可以在如何一個組中,一個本地域可以和多個遠程域實現互操作. */

*SERVICES
TOUPPER
/* TOUPPER是simpserv文件中的函數名字, 該函數就被髮布爲屬於server: simpserv中的一個tuxedo service*/

2.1.4.    編譯ubbconfig文件
Tmloadcf ?y ubbconfig

2.1.5.    配置domconfig
*DM_RESOURCES
VERSION=U22
*DM_LOCAL_DOMAINS
/*DM_LOCAL_DOMAINS定義本地tuxedo域的信息,分別定義該域所在的組,域類型,域的唯一標識,域間通信時日誌的全路徑,其中GWGRP, DOMAINID的值要與ubb文件中的定義匹配.*/
TDOM1     GWGRP=GROUP2
    TYPE=TDOMAIN
    DOMAINID="TDOM1"
    BLOCKTIME=20
    MAXDATALEN=56
    MAXRDOM=89
    DMTLOGDEV="C:/bea/tuxedo8.0/samples/atmi/simpapp/TLOG"
    AUDITLOG="C:/bea/tuxedo8.0/samples/atmi/simpapp/AUDITLOG"
    DMTLOGNAME="DMTLOG_TUXDOM"
    
*DM_REMOTE_DOMAINS
/*DM_REMOTE_DOMAINS定義遠程weblogic域的信息,分別定義域類型,域的唯一性標識,該id標識需要與在weblogic server中的配置名稱吻合,否則通信將會失敗*/
TDOM2     TYPE=TDOMAIN
    DOMAINID="TDOM2"

*DM_TDOMAIN
/*DM_TDOMAIN定義在DM_LOCAL_DOMAIN中已經說明的本地域和在DM_REMOTE_DOMAINS中已經說明的遠程域的具體的通信ip地址以及通信端口,其中NWDEVICE指定tuxedo發佈的server通信進程文件所在的路徑*/
TDOM1    NWADDR="//10.16.73.31:9998"
TDOM2    NWADDR="//10.16.73.31:9999"

*DM_REMOTE_SERVICES
/*DM_REMOTE_SERVICES定義當前域需要調用遠程域的服務名稱*/
TOLOWER RDOM="TDOM2"

*DM_LOCAL_SERVICES
/* DM_LOCAL_SERVICES定義當前域對外發布的tuxedo service名稱,可以通過RNAME重新命名service;該service可以被其他域中的服務調用*/
TOUPPER  RNAME=" TOUPPER " 

2.1.6.    編譯domconfig
dmloadcf -y domconfig

2.    Weblogic配置(7.0以上的版本)
2.1.7.    配置config.xml
   
 <WTCServer Name="MyWTCServer" Targets="myserver">
        <WTCExport EJBName="wtcservice" LocalAccessPoint="TDOM2" Name="WTCExport-1111629542315" ResourceName="TOLOWER"/>
        <WTCImport LocalAccessPoint="TDOM2" Name="WTCImport-1111634013933" RemoteAccessPointList="TDOM1" ResourceName="TOUPPER"/>
        <WTCLocalTuxDom AccessPoint="TDOM2" AccessPointId="TDOM2" NWAddr="//10.16.73.31:9999" Name="WTCLocalTuxDom-1111629491418"/>
        <WTCRemoteTuxDom AccessPoint="TDOM1" AccessPointId="TDOM1" LocalAccessPoint="TDOM2" NWAddr="//10.16.73.31:9998" Name="WTCRemoteTuxDom-1111629517202"/>
    </WTCServer>

 WTCLocalTuxDom中的AccessPointId與在tuxedo dm文件中*DM_REMOTE_DOMAINS節中指定的domainid相同;NWAddr與*DM_TDOMAIN節中相應的NWADDR相同

WTCRemoteTuxDom中的AccessPointId與在tuxedo dm文件中*DM_REMOTE_DOMAINS節中指定的domainid相同;NWAddr與*DM_TDOMAIN節中相應的NWADDR相同

WTCImport中的ResourceName與在tuxedo ubb文件中SERVICES節點中指定的服務名相同;RemoteName與在tuxedo dm文件中* DM_LOCAL_SERVICES節中發佈的服務名相同(可以省略)

WTCImport中的ResourceName與在tuxedo dm文件中DM_REMOTE_SERVICES節點中指定的服務名相同

3.    Weblogic做客戶端,訪問Tuxedo服務
import="weblogic.wtc.jatmi.;
import="weblogic.wtc.gwt.*;
import="javax.naming.*;
import="java.sql.;

try
{    
    //調用接口服務
    Context ctx = new InitialContext();
    TuxedoConnectionFactory cdmaTuxedoFactory = (TuxedoConnectionFactory) ctx.lookup("tuxedo.services.TuxedoConnection");
    TuxedoConnection cdmaTuxedo = cdmaTuxedoFactory.getTuxedoConnection();
    TypedString cdmaData = new TypedString(inStr);
    Reply cdmaRtn = cdmaTuxedo.tpcall("TOUPPER", cdmaData, 0);
    cdmaData = (TypedString) cdmaRtn.getReplyBuffer();
    outStr = cdmaData.toString();
    cdmaTuxedo.tpterm();
}
catch(Exception e)
{
    outStr = e.getMessage();
}
 4.    Tuxedo做客戶端,訪問Weblogic服務
#include <stdio.h>
#include "atmi.h"        /* TUXEDO  Header File */


#if defined(__STDC__) || defined(__cplusplus)
main(int argc, char *argv[])
#else
main(argc, argv)
int argc;
char *argv[];
#endif

{

    char *sendbuf, *rcvbuf;
    long sendlen, rcvlen;
    int ret;

    if(argc != 2) {
        (void) fprintf(stderr, "Usage: simpcl string\n");
        exit(1);
    }

    /* Attach to System/T as a Client Process */
    if (tpinit((TPINIT *) NULL) == -1) {
        (void) fprintf(stderr, "Tpinit failed\n");
        exit(1);
    }
    
    sendlen = strlen(argv[1]);

    /* Allocate STRING buffers for the request and the reply */

    if((sendbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
        (void) fprintf(stderr,"Error allocating send buffer\n");
        tpterm();
        exit(1);
    }

    if((rcvbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
        (void) fprintf(stderr,"Error allocating receive buffer\n");
        tpfree(sendbuf);
        tpterm();
        exit(1);
    }

    (void) strcpy(sendbuf, argv[1]);

    /* Request the service TOUPPER TOLOWER, waiting for a reply */
    ret = tpcall("TOLOWER", (char *)sendbuf, 0, (char **)&rcvbuf, &rcvlen, (long)0);

    if(ret == -1) {
        (void) fprintf(stderr, "Can't send request to service TOLOWER\n");
        (void) fprintf(stderr, "Tperrno = %d\n", tperrno);
        tpfree(sendbuf);
        tpfree(rcvbuf);
        tpterm();
        exit(1);
    }

    (void) fprintf(stdout, "Returned string is: %s\n", rcvbuf);

    /* Free Buffers & Detach from System/T */
    tpfree(sendbuf);
    tpfree(rcvbuf);
    tpterm();
    return(0);
}
 三.    JOLT配置步驟:
1.    Tuxedo的配置
3.1.1.    配置ubbconfig
在ubb文件*GROUPS節點中增加如下2個tuxedo group:
JSLGRP LMID=simple     GRPNO=5 OPENINFO=NONE
JREPGRP LMID=simple     GRPNO=6 OPENINFO=NONE

在ubb文件*SERVERS節點中增加如下2個tuxedo server:
JSL  SRVGRP=JSLGRP     SRVID=22210 CLOPT="-A -- -n //tuxedoserver_ip:port -m 5 -M 10 -x 5"
JREPSVR SRVGRP=JREPGRP SRVID=22220 CLOPT="-A -- -W -P $(TUXDIR)/udataobj/jolt/repository/jrepository"

在ubb文件*MACHINES節點中增加MAXWSCLIENTS=10


*RESOURCES
IPCKEY        123456
DOMAINID    simpapp
MASTER        simple
MAXACCESSERS    50
MAXSERVERS    25
MAXSERVICES    50
MODEL        SHM
LDBAL        N

*MACHINES
        "SZ-XJS-DUANW"    
        LMID=simple
        APPDIR="C:/bea/tuxedo8.0/samples/simpapp"
        TUXCONFIG="C:/bea/tuxedo8.0/samples/simpapp/tuxconfig"
        TUXDIR="C:/bea/tuxedo8.0"
        MAXWSCLIENTS=10

*GROUPS
GROUP1
    LMID=simple    GRPNO=1    OPENINFO=NONE

GROUP2
    LMID=simple GRPNO=2 OPENINFO=NONE

JSLGRP 
    LMID=simple GRPNO=5 OPENINFO=NONE

JREPGRP
    LMID=simple GRPNO=6 OPENINFO=NONE

*SERVERS
simpserv    SRVGRP=GROUP1 SRVID=1
DMADM       SRVGRP=GROUP2 SRVID=2 
GWADM       SRVGRP=GROUP2 SRVID=3 
GWTDOMAIN   SRVGRP=GROUP2 SRVID=4
JSL         SRVGRP=JSLGRP SRVID=10 CLOPT="-A -- -n //10.16.73.31:9000 -m 5 -M 10 -x 5"
JREPSVR     SRVGRP=JREPGRP SRVID=20 CLOPT="-A -- -W -P C:/bea/tuxedo8.0/udataobj/jolt/repository/jrepository"
/**當通過jolt實現tuxedo,weblogic互連時,JSL,JREPSVR是在tuxedo中必鬚髮布啓動的2個server*/

*SERVICES
TOUPPER

3.1.2.    註冊tuxedo service
打開Tuxedo安裝目錄下的udataobj/jolt/子目錄下RE.html文件,其中包含java applet,可通過appletviewer RE.html命令啓動該文件,該applet可以接收用戶輸入,並在jrepository中註冊tuxedo service以及service的輸入輸出參數等等,只有註冊之後才能通過jolt訪問tuxedo service.
2.    Weblogic的配置
3.1.3.    配置jolt pool
    <JoltConnectionPool FailoverAddresses="//10.16.73.31:9000"
        Name="MyJoltPool" PrimaryAddresses="//10.16.73.31:9000" Targets="myserver"/>
/*//10.16.73.31:9000是ubbconfig中JSL指定的地址。
*/
3.1.4.    配置startup class, shutdown class
    <ShutdownClass
        ClassName="bea.jolt.pool.servlet.weblogic.PoolManagerShutDown"
        Name="MyJoltPoolShutdown" Targets="myserver"/>
    <StartupClass
        ClassName="bea.jolt.pool.servlet.weblogic.PoolManagerStartUp"
        Name="MyJoltPoolStart" Targets="myserver"/>
3.    程序調用例子
import bea.jolt.pool.SessionPoolManager;
import bea.jolt.pool.servlet.ServletResult;
import bea.jolt.pool.servlet.ServletSessionPool;
import bea.jolt.pool.ServiceException;
import weblogic.utils.http.QueryParams;
import weblogic.servlet.internal.ServletRequestImpl;
import bea.jolt.pool.ServiceException;
import com.beasys.BootstrapFactory;
import java.util.Properties;
import javax.naming.InitialContext;

String inStr = "dw";
try
{
  SessionPoolManager b_mgr = SessionPoolManager.poolmgr;
  ServletSessionPool servletSessionPool = (ServletSessionPool) b_mgr.getSessionPool("MyJoltPool");

  //構造request
  ServletRequestImpl impl = new ServletRequestImpl();
  QueryParams q = new QueryParams();
  q.put("name", inStr);
  impl.setQueryParams(q);

  ServletResult servletResult = servletSessionPool.call("TOUPPER", impl, null);
  String name = (String) servletResult.getValue("name", 0, "");  
}
catch (Exception e)
{
  e.printStackTrace();
}

 四.    CORBA的調用步驟:
1.    獲得IDL,並且根據IDL生成java class
2.    配置config.xml文件
    <WLECConnectionPool FailoverAddresses="//10.1.10.51:3842"
        MaximumPoolSize="10" Name="Sys97WLEPool"
        PrimaryAddresses="//10.1.10.51:3842" 
Targets="myserver" 
WLEDomain="etelecom_server"/>
3.    程序調用例子
import org.omg.CORBA.*;
import com.beasys.*;
import com.beasys.Tobj.*;

//初始化ORB和BEA的Bootstrap,獲得FactoryFinder的對象引用.
Properties prop = new Properties(System.getProperties());
prop.put("org.omg.CORBA.ORBClass", "com.beasys.CORBA.iiop.ORB");
prop.put("org.omg.CORBA.ORBSingletonClass", "com.beasys.CORBA.idl.ORBSingleton");
String[] args = null;
ORB orb = ORB.init(args, prop);

//爲提高性能,從指定的連接池中獲取Tobj_Bootstrap
Tobj_Bootstrap bootstrap = BootstrapFactory.getClientContext("Sys97WLEPool");

//如果從WLEC連接池獲取Tobj_Bootstrap失敗,則根據指定的確CORBA服務器IP和端口初始化Tobj_Bootstrap
if (bootstrap == null)
Tobj_Bootstrap  bootstrap = new Tobj_Bootstrap(orb, "corbaloc://10.1.10.27:3842");

org.omg.CORBA.Object factory_finder_oref = 
bootstrap.resolve_initial_references("FactoryFinder");
FactoryFinder factory_finder_ref = FactoryFinderHelper.narrow(factory_finder_oref);

//實例化後臺系統的CB_Service操作接口
org.omg.CORBA.Object srv_factory_ref = 
factory_finder_ref.find_one_factory_by_id(FindFactoryHelper.id());

FindFactory find_factory = FindFactoryHelper.narrow(srv_factory_ref);
CB_BondService service = find_factory.find_CB_BondService();
StringHolder outXml = new StringHolder();
String inXml="";
service.businessProcess(inXml,outXml);
System.out.println("outXml:"+outXml.value);
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章