通过jolt连接Tuxedo服务的方法

时间:2023-01-23 12:19:15
Bea Jolt的配置与编程(By Star_CHL)
 Date:2006-01-19
Email:Star_CHL@sina.com
目的: 实现对现有Tuxedo 8.1业务逻辑处理服务通过Java程序进行调度,以方便以后通过B/S方式实现客户同tuxedo服务的直接交互。
试验环境: Tuxedo服务器主机 (主机名:ht-dev): 操作系统:Red Hat Linux Advanced Server release 2.1AS/i686
应用服务:Bea Tuxedo 8.1
IP
地址:192.168.0.208
TUXEDO安装路径:/home/tuxedo/tuxedo8.1/
测试用tuxedo服务:/home/mtps/bin/ApSmokeSvr
(测试FML32方式)
/home/mtps/bin/simpserv
(测试String方式)
测试用户:mtps
客户开发主机 (主机名:Star_CHL): 操作系统:Windows XP Bea 套间:安装Bea Tuxedo 8.1,(安装Bea tuxedo jolt) 开发环境:j2sdk1.4.2 ( 通过jolt连接Tuxedo服务的方法http://java.sun.com)
ultraedit32 IP 地址:192.168.0.8
试验环境搭建: 一、ht-dev tuxedo应用服务器 (粗体为需要敲入得Linux命令)
1>以root用户注册,新建tuxedo用户 #useradd tuxedo (增加用户,默认其组为tuxedo,其户主目录为/home/tuxedo,默认shell为bash) #passwd tuxedo (更改tuxedo用户口令,以便tuxedo进行登陆)
2>以tuxedo用户注册,从  通过jolt连接Tuxedo服务的方法http://www.bea.com  下载tuxedo8.1到 ${HOME}目录中
3>安装tuxedo
/home/tuxedo>vi .bash_profile (在环境配置文件中加入一下环境变量) 
export TUXDIR=/home/tuxedo/tuxedo8.1 
export PATH=$TUXDIR/bin:$PATH 
export COBCPY=:$TUXDIR/cobinclude 
export COBOPT="-C ANS85 -C ALIGN=8 -C NOIBMCOMP -C TRUNC=ANSI -C OSEXT=cbl" 
export SHLIB_PATH=$TUXDIR/lib:$SHLIB_PATH 
export LIBPATH=$TUXDIR/lib:$LIBPATH 
export LD_LIBRARY_PATH=$TUXDIR/lib:$LD_LIBRARY_PATH
如果在图形模式下,运行: /home/tuxedo>./server812_linux32.bin 
否则运行: /home/tuxedo>./server812_linux32.bin -i console

4>更改/home/tuxedo目录属性,以方便试验用户mtps对tuxedo文件进行访问 /home/tuxedo>su -#cd /home #chmod -R 775 ./tuxedo (为了便于对jrepository的修改,此处权限为775)
5>建立试验用户(避免用tuxedo用户进行开发,防止其目录下文件混乱) 
#useradd mtps -g tuxedo 
#passwd mtps
#cp /home/tuxedo/.bash_profile /home/mtps/ 
#chown mtps:tuxedo /home/mtps/.bash_profile #exit

6>用mtps用户注册,编写服务程序 
/home/mtps>vi .bash_profile (在文件后面添加如下环境变量)
export TUXCONFIG="/home/mtps/etc/tuxconfig" 
/home/mtps>mkdir etc /home/mtps>mkdir bin 
/home/mtps>mkdir src 
/home/mtps>mkdir log 
/home/mtps>cd src 
/home/mtps/src>cp /home/tuxedo/tuxedo8.1/samples/atmi/simpapp/*.c . 

/home/mtps/src>buildserver -s TOUPPER -o /home/mtps/bin/simpserv -f simpserv.c 
/home/mtps/src>buildclient -o /home/mtps/bin/simpcl simpcl.c

/home/mtps/src>vi testfml32.tbl (加入以下内容)
*base 4100 SENDSTR 1 string RECVSTR 2 string

/home/mtps/src>mkfldhdr32 testfml32.tbl (默认将生成testfml32.tbl.h)
/home/mtps/src>vi ApSmokeSvr.c (加入以下内容) 
#include <stdio.h> 
#include "atmi.h" 
#include "fml32.h" 
tpsvrinit (argc, argv)
int
argc;
char
*argv[];
{
fprintf(stdout,"The Server is begining.. ../n");
return(0);
}
int nSmokeSvs( rqs )
TPSVCINFO *rqs;
{ FBFR32 *RcvBuf;
  FBFR32 *RtnBuf;
 char sRcvBuf[1024];

RcvBuf = (FBFR32 *)rqs->data; 
memset(sRcvBuf,0x00,sizeof(sRcvBuf)); 
if( Fget32( RcvBuf, SENDSTR, 0, sRcvBuf, 0 ) < 0 ) {
if( Ferror32 != 4 )
{ fprintf(stderr,"变量接收失败!/n"); 
return( -1);


fprintf(stdout,"接收变量SENDBUF is [%s]/n",sRcvBuf);
if( ( RtnBuf = (FBFR32 *)tpalloc( "FML32", NULL, strlen(sRcvBuf)+1 ) ) == NULL )
{ fprintf(stderr,"分配缓冲区RtnBuf失败!/n"); return( -1);
}

Fchg32( RtnBuf, RECVSTR, 0, sRcvBuf, 0 );
tpfree ((char *)RcvBuf );
tpreturn( TPSUCCESS, 0, (char *)RtnBuf, 0L, 0 );

}
void tpsvrdone() { 
fprintf(stdout,"Server done !" 

/home/mtps/src>buildserver -s nSmokeSvs -o /home/mtps/bin/ApSmokeSvr -f ApSmokeSvr.c

7>配置tuxedo server的运行UBB文件 (注意主机名、IP、以及用于jolt通讯的JSL、JREPSVR服务的配置) 
/home/mtps>src>cd ../etc 
/home/mtps/etc>vi TESTJOLT.ubb (加入以下内容)

*RESOURCES
S IPCKEY 210000
0
DOMAINID MTPS
S MASTER MTPS
S MAXACCESSERS 1200
0 MAXSERVERS 300
0 MAXSERVICES 1200
MODEL
SHM
LDBAL
Y
SCANUNIT
50
SANITYSCAN
5
BLOCKTIME
9
*MACHINES
DEFAULT:
APPDIR="/home/mtps/bin"
TUXCONFIG="/home/mtps/etc/tuxconfig"
TUXDIR="/home/tuxedo/tuxedo8.1"
ULOGPFX="/home/mtps/log/ULOG"
"ht-dev" LMID=MTPS
MAXWSCLIENTS=100 *GROUPS GROUP1
LMID=MTPS GRPNO=3 OPENINFO=NONE JREPGRP
LMID=MTPS GRPNO=7 OPENINFO=NONE JSLGRP
LMID=MTPS GRPNO=8 OPENINFO=NONE

*SERVERS DEFAULT:
CLOPT="-A -t" WSL SRVGRP=GROUP1 SRVID=200
CLOPT="-t -A -- -n//192.168.0.208:8000"

JSL SRVGRP=JSLGRP SRVID=203 CLOPT="-A -- -n//192.168.0.208:18000 -m5 -M 10 -x 5" 
JREPSVR SRVGRP=JREPGRP SRVID=204 CLOPT="-A -- -W -P /home/tuxedo/tuxedo8.1/udataobj/jolt/repository/ jrepository"
ApSmokeSvr SRVGRP=GROUP1 SRVID=103 MIN=1 MAX=1 RESTART=N MAXGEN=255 
simpserv SRVGRP=GROUP1 SRVID=104 MIN=1 MAX=1 RESTART=N MAXGEN=255 
*SERVICES

/home/mtps/etc>tmloadcf -y TESTJOLT.ubb
8>配置用于jolt通讯的事项
/home/mtps/etc>cd ${HOME}
/home/mtps>vi .bash_profile (添加如下变量)
export FIELDTBLS32=testfml32.tbl
export FLDTBLDIR32=/home/mtps/src 
/home/mtps>. .bash_profile 
/home/mtps>tmboot -y

二、客户端开发环境的建立 
1>安装j2sdk1.4.2、安装bea tuxedo jolt 
2>设置java的环境变量,包括PATH、JAVA_HOME、LIB、CLASSPATH(因为这些内容随安装环境的不同而不
同,请参阅相关资料)

三、jrepository的配置
比如E:/bea/tuxedo8.1目录中,则用IE打开E:/bea/tuxedo8.1/udataobj/jolt/RE.html文件(注意:尽量不要用其他第三方的浏览 器,否则容易出现莫名奇妙的can not open socket错误)。在"bea joltrepository editor" applet 中填入192.168.0.208,端口写服务器ubb文件中JSL监听的端口 18000 ,输入完端口后,按回车键,下面三个按钮应该变为有效,否则的化查看后台服务日志,看 服务是否正常启动。单击services按钮可以看到TOUPPER已经被tuxedo默认添加到了jrepository中,不需要再进行改动。需要增加nSmokeSvs服务,以及nSmokeSvs所需变量"SENDSTR"和"RECVSTR",并设置RCVSTR类型为FML32/output,SEND为FML32/input 。
   保存后,参看tuxedo服务器的/home/tuxedo/tuxedo8.1/udataobj/jolt/repository/jepository,注意将其新添加的关于“SENDSTR/RCVSTR"对应记录的pf值改成/home/mtps/src/testfml32.tbl.h"中对应的数值(虽然BEA不建议这么做,但还是感觉直接 改来得方便)。

四、客户端编写JAVA程序testFml.java和testString.java并进行测试,需要注意的只有注意中文的转换和编译这两个java程序需要 指定CLASSPATH包含 E:/bea/tuxedo8.1/udataobj/jolt/jolt.jar和E:/bea/tuxedo8.1/udataobj/jolt/joltjse.jar(不确定,懒得试 验) testFml.java :

import bea.jolt.JoltRemoteService; 
import bea.jolt.JoltSession; 
import bea.jolt.JoltSessionAttributes;
import java.lang.*; 
import java.text.*; 
import sun.io.*;
public class testFml { public static void main(String[] args) {
JoltSession
session;
JoltSessionAttributes
sattr;
JoltRemoteService
passFml;
byte[] byteArr=new byte[2000];
String outputString; 
int outputInt; 
float outputFloat;
String userName="Star_CHL";
 String userPassword=null;
 String appPassword=null;
 String userRole="Star_CHL windows PC";
 String sendStr=new String("0081760001|0| |0|0|TERM1998|测试汉字|6013010100112345678|AB-11|
|1000| | |");
sattr=new JoltSessionAttributes(); 
sattr.setString(JoltSessionAttributes.APPADDRESS, "//192.168.0.208:18000"); 
sattr.setInt(JoltSessionAttributes.IDLETIMEOUT, 300); //sattr.getStringDef("")
session = new JoltSession(sattr,userName,userRole,userPassword,appPassword);
passFml = new JoltRemoteService("760000",session);
sendStr=GBK(sendStr);
 passFml.setString("SENDSTR", sendStr);
 
passFml.call(null);
 outputString = passFml.getStringDef("RECVSTR", null);
 System.out.print("String =" + AsciiToChineseString(outputString));
 passFml.clear();
 session.endSession();
 
}
}


public static String AsciiToChineseString(String s) {
{ char[] orig =s.toCharArray();
;
byte[] dest =new byte[orig.length];
for(int i=0;i<orig.length;i++)
) dest[i] =(byte)(orig[i]&0xFF);
; try{
{
ByteToCharConverter toChar =ByteToCharConverter.getConverter("gb2312"); 
return new String(toChar.convertAll(dest)); }
catch(Exception e){} return s;
}
public static String GBK(String action){
try{
{ byte[] b =action.getBytes("GB2312");
String convert =new String(b,"8859_1");
return convert;
}catch(Exception e){ } return new String("AA");

} }
====================================================================
testString.java: import bea.jolt.*; public class testString {
public static void main (String[] args) {
JoltSession session;
JoltSessionAttributes sattr;
JoltRemoteService toupper;
JoltTransaction trans;
String userName=null;
String userPassword=null;
String appPassword=null;
String userRole="myapp";
String outstr;
sattr = new JoltSessionAttributes();
sattr.setString(sattr.APPADDRESS, "//192.168.0.208:18000");
sattr.setInt(sattr.IDLETIMEOUT, 300);
session = new JoltSession(sattr, userName, userRole, userPassword, appPassword);
toupper = new JoltRemoteService ("TOUPPER", session);
toupper.setString("STRING", "hello world");
toupper.call(null);
outstr = toupper.getStringDef("STRING", null);
if (outstr != null)
System.out.println(outstr);
session.endSession(); System.exit(0); } }