Posted by Clayton Casteli On May - 22 - 2014 0 Comment

Esse post trata da construção de uma aplicação em linguagem de programação C no servidor de Aplicação Oracle Tuxedo 12. Como já falamos antes esse servidor é focado em alta performance, além de possibilitar a externalização de suas aplicações via WebServices.

Pré-Requisitos Instalação do Oracle Tuxedo 12c no Linux Fedora 20

Construção de Aplicação ATMI no Oracle Tuxedo App1

A aplicação construida nesse post vai expor a situação abaixo para uma chamada síncrona para um serviço Oracle Tuxedo 12c.

Esse post trata das seguintes funções da API ATMI do Oracle Tuxedo 12. Link de referência as funções ler o post Configuração e Estruturação de Aplicações Oracle Tuxedo 12.

  • Aplicativo Cliente.
    • tpinit();
    • tpalloc();
    • tpcall();
    • tpfree();
    • tpterm();
  • Aplicativo Servidor.
    • tpsvrinit();
    • tpsvrdone();
    • tpreturn();

1 Crie em um  diretório qualquer uma pasta para sua primeira aplicação Oracle Tuxedo 12. Para esse post foi criada a pasta app1atmi.

/home/clayton/oracle_tuxedo_12c/aplicacoes/app1atmi

2 Com base em nossa pasta de aplicações vamos configurar as seguintes variáveis de ambiente. Pois serão necessárias na criação do arquivo binário tuxconfig. Use o vi, gedit ou um editor de sua preferência.

sudo gedit /etc/profile

Inclua as seguintes variáveis, caso você já tenha incluido substituir as variáveis se estiver com valores diferentes ao seu ambiente. Para esse post segue a configuração usada.

		#Localização da aplicação
		APPDIR="/home/clayton/oracle_tuxedo_12c/aplicacoes/app1atmi"; export APPDIR
		#Localixação do arquivo binário tuxconfig
		TUXCONFIG="/home/clayton/oracle_tuxedo_12c/aplicacoes/app1atmi/tuxconfig"; export TUXCONFIG
		#Localização da instalação do tuxedo
		TUXDIR="/home/clayton/oracle_tuxedo_12c/tuxedo12.1.1.0"; export TUXDIR

Não esqueça de verificar se os valores foram realmente alterados, use o comando echo.

echo $APPDIR
echo $TUXCONFIG
echo $TUXDIR

3 Após a criação da pasta, vamos criar 3 arquivos dentro da pasta app1atmi chamados atmiCliente.c, atmiServidor.c e ubbsimple

atmiCliente.c - cliente tuxedo que chamará o serviço.
atmiServidor.c - servidor tuxedo que terá uma serviço.
ubbsimple - arquivo de configuração do tuxedo que será convertido em sua forma binária.

4 Primeiramente vamos criar e compilar nosso cliente ATMI Tuxedo atmiCliente.c. Vamos usar o comando buildclient para compilar o cliente.

Use o seguinte comando para compilar o cliente:

buildclient -o atmiCliente -f atmiCliente.c

Antes de compilar insira o código do cliente.

#include <stdio.h>
#include <string.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; /*cria um buffer para envio e outro para recebimento de dados*/
	long sendlen, rcvlen;   /*tamanho do buffer de envio e recebimento */
	int ret;		/*indicação do status de envoi ou recebimento erro*/

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

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

	sendlen = strlen(argv[1]);     /*pega o tamanho de mensagem de envio*/

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

	if((sendbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) { /*aloca um buffer do tipo String para envio com o tamanho da string passada*/
		(void) fprintf(stderr,"Erro na alocação do buffer de envio\n");
		tpterm();  /*termina caso haja erro*/
		exit(1);
	}

	if((rcvbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {/*aloca um buffer do tipo String para recebimento com o tamanho da string passada*/
		(void) fprintf(stderr,"Error allocating receive buffer\n");
		tpfree(sendbuf);
		tpterm();
		exit(1);
	}

	(void) strcpy(sendbuf, argv[1]);   /*passa o conteúdo da string passada em linha de comando para sendbuf*/

	/* Request the service TOUPPER, waiting for a reply */
	/*invoca o serviço TOUPPER contido em atmiServidor.c*/
	/*Essa e uma chamada síncrona dessa forma o retorna é esperado e o conteúdo armazenado em rcvbuf, veja que uma referencia foi passada.*/
	ret = tpcall("TOUPPER", (char *)sendbuf, 0, (char **)&rcvbuf, &rcvlen, (long)0); 

	if(ret == -1) { /*verifica erro*/
		(void) fprintf(stderr, "Não foi possível enviar a requisição para o serviço TOUPPER\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 */
	/*liberação do buffer e termino da execução do cliente*/
	tpfree(sendbuf);
	tpfree(rcvbuf);
	tpterm();
	return(0);
}

5 Vamos criar o nosso servidor ATMI Tuxedo atmiServidor.c, esse servidor terá uma serviço chamado TOUPPER. Vamos usar o comando builserver para compilar o servidor.

Use o seguinte comando para compilar o servidor:

buildserver -o atmiServidor -f atmiServidor.c -s TOUPPER

Antes de compilar insira o código do servidor.

#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.tpsvrdone 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("Boot do serviço, seja bem vindo");
	return(0);
}

/* Essa função executa o serviço que é chamada na requisição do cliente.
   O argumento recebido pela função TOUPPER tem várias propriedades entre elas o buffer de envio com a STRING passada e o tamanho do buffer com a STRING.
*/

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

	int i;
	/*recebe a STRING de dados passo no cliente e transforma em maiuscula cada caracter*/
	for(i = 0; i < rqst->len-1; i++)
		rqst->data[i] = toupper(rqst->data[i]);

	/* Devolve o buffer com os caracteres da STRING em maiuscula. e termina o serviço */
	tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);
}

void tpsvrdone()
{

     /* Finalização do Servidor */
    (void)userlog("tpsvrdone: finalização do serviço");
    return;
}

6 Criação do arquivo de configuração binário do Oracle Tuxedo 12 ubbsimple.

Use o seguinte comando para criar o binário tuxconfig:

tmloadcf -y ubbsimple

Antes de compilar o ubbsimple insira os scrip abaixo no ubbsimple. Lembre-se as variáveis de ambiente devem ser as que estão configuradas na sua máquina.

*RESOURCES
#		<Replace with a valid IPC Key>
IPCKEY		123456

DOMAINID	atmiapp
MASTER		simple
MAXACCESSERS	10
MAXSERVERS	5
MAXSERVICES	10
MODEL		SHM
LDBAL		N

*MACHINES
DEFAULT:
		#Localização da aplicação
		APPDIR="/home/clayton/oracle_tuxedo_12c/aplicacoes/app1atmi"
		#Localixação do arquivo binário tuxconfig
		TUXCONFIG="/home/clayton/oracle_tuxedo_12c/aplicacoes/app1atmi/tuxconfig"
		#Localização da instalação do tuxedo
		TUXDIR="/home/clayton/oracle_tuxedo_12c/tuxedo12.1.1.0"

#nome da máquina use o comando hostname no linux para saber qual o nome de sua máquina
"localhost.localdomain"	LMID=simple

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

*SERVERS
DEFAULT:
		CLOPT="-A"

atmiServidor	SRVGRP=GROUP1 SRVID=1

*SERVICES
TOUPPER

7 Boot do servidor

tmboot -y

8 Uso do serviço criado

./atmiCliente "Meu primeiro programa no Oracle TUXEDO em linguagem c"

9 Shutdown no servidor

tmshutdown -y

About the author

Clayton Casteli Atua com desenvolvimento de software, J2EE, C/C++, IBM BPM. É entusiasta de novas tecnologias, principalmente open source. Formado em Engenharia da Computação pela PUCCAMP-SP, Pós-Graduado pela UNICAMP em Engenharia de Software com enfase em SOA e Pós-Graduado em Business Intelligence pelo IBTA.

Be Sociable, Share!

Protected by WP Anti Spam