Archive

Archive for the ‘Java’ Category

Dica: Como configurar SSL Sharepoint num servidor Alfresco 5.0

O protocolo Sharepoint (VTI) já vem instalado no Alfresco 5.0 Community por default.

Assim quando acessar um documento é possível clicar na opção “Editar Online” para abrir o documento diretamente do servidor no Office.

ScreenHunter_01 Nov. 10 17.50

Entretanto sem a configuração correta ocorre um erro no Office informando que não é possível abrir o documento pois o servidor não tem um protocolo seguro.

Isso ocorre pois o servidor VTI não está com o SSL habilitado e o Office por default não aceita protocolos não seguros.

A melhor maneira de corrigir isso é configurar o servidor do alfresco.

Primeiro crie o arquivo /opt/alfresco-5.0.d/tomcat/shared/classes/alfresco/extension/vti-custom-context.xml

<?xml version=’1.0′ encoding=’UTF-8′?>
<!DOCTYPE beans PUBLIC ‘-//SPRING//DTD BEAN//EN’ ‘http://www.springframework.org/dtd/spring-beans.dtd’&gt;
<beans>
<!–
<bean id=”vtiServerConnector”
class=”org.mortbay.jetty.bio.SocketConnector”>
<property name=”port”>
<value>${vti.server.port}</value>
</property>
<property name=”headerBufferSize”>
<value>32768</value>
</property>
</bean>
–>
<!– Use this Connector instead for SSL communications –>
<!– You will need to set the location of the KeyStore holding your –>
<!– server certificate, along with the KeyStore password –>
<!– You should also update the vti.server.protocol property to https
–>
<bean id=”vtiServerConnector” class=”org.mortbay.jetty.security.SslSocketConnector”>
<property name=”port”>
<value>${vti.server.port}</value>
</property>
<property name=”headerBufferSize”>
<value>32768</value>
</property>
<property name=”maxIdleTime”>
<value>30000</value>
</property>
<property name=”keystore”>
<value>${vti.server.ssl.keystore}</value>
</property>
<property name=”keyPassword”>
<value>${vti.server.ssl.password}</value>
</property>
<property name=”password”>
<value>${vti.server.ssl.password}</value>
</property>

<property name=”keystoreType”>
<value>JCEKS</value>
</property>
</bean>
</beans>

Em seguida configura o arquivo /opt/alfresco-5.0.d/tomcat/shared/classes/alfresco/extension/custom-vti.properties

vti.server.port=7070
vti.server.protocol=https
vti.server.ssl.keystore=/opt/alfresco-5.0.d/alf_data/keystore/ssl.keystore
vti.server.ssl.password=kT9X6oe68t
vti.server.url.path.prefix=/alfresco
vti.server.external.host=sahsadvesb003
vti.server.external.port=7070
vti.server.external.protocol=https
vti.server.external.contextPath=/alfresco

Agora que as chaves estão configuradas é melhorar gerar chaves novas executando o script /opt/alfresco-5.0.d/alf_data/keystore/generate_keystores.sh

É necessário configurar os caminhos dentro do script generate_keystores.sh e em seguida executa-lo. O resultado deve ser parecido com o seguinte:

keystore]# ./generate_keystores.sh
/opt/alfresco-5.0.d/tomcat/scripts/ctl.sh : tomcat not running
/opt/alfresco-5.0.d/postgresql/scripts/ctl.sh : postgresql not running
Certificate stored in file </root/ssl.repo.crt>
Certificate stored in file </root/ssl.repo.client.crt>
Certificate was added to keystore
Certificate was added to keystore
Certificate was added to keystore
cp: cannot stat ‘/opt/alfresco/solr4/templates/store/conf/ssl.repo.client.keystore’: No such file or directory
cp: cannot stat ‘/opt/alfresco/solr4/templates/store/conf/ssl.repo.client.truststore’: No such file or directory
cp: cannot create regular file ‘/opt/alfresco/solr4/templates/store/conf/ssl.repo.client.keystore’: No such file or directory
cp: cannot create regular file ‘/opt/alfresco/solr4/templates/store/conf/ssl.repo.client.truststore’: No such file or directory
Certificate update complete
Please ensure that you set dir.keystore=/opt/alfresco/alf_data/keystore in alfresco-global.properties

Depois de reiniciar o servidor com os novos certificados o Office vai funcionar normalmente quando abrir um documento clicando no Editar Online.

Referências: http://docs.alfresco.com/5.0/concepts/configure-ssl-intro.html

Categories: Java Tags: , , , ,

Dica: Weblogic com chamadas paradas em RandomIO.readFully

Problema

 

Ao acessar o servidor Weblogic  as chamadas ficam travadas e o servidor não respondem as requisições. Analisando o thread dump vemos stack do seguinte tipo:

“[ACTIVE] ExecuteThread: ‘1’ for queue: ‘weblogic.kernel.Default (self-tuning)'” id=21 idx=0x50 tid=8305 prio=5 alive, in native, daemon
at jrockit/io/FileNativeIO.readBytesPinned(Ljava/io/FileDescriptor;[BII)I(Native Method)
at jrockit/io/FileNativeIO.readBytes(FileNativeIO.java:32)
at java/io/FileInputStream.readBytes([BII)I(FileInputStream.java)
at java/io/FileInputStream.read(FileInputStream.java:220)
at sun/security/provider/NativePRNG$RandomIO.readFully(NativePRNG.java:185)
at sun/security/provider/NativePRNG$RandomIO.implGenerateSeed(NativePRNG.java:202)
^– Holding lock: java/lang/Object@0xd33fc478[biased lock]
at sun/security/provider/NativePRNG$RandomIO.access$300(NativePRNG.java:108)
at sun/security/provider/NativePRNG.engineGenerateSeed(NativePRNG.java:102)
at java/security/SecureRandom.generateSeed(SecureRandom.java:495)
at com/bea/security/utils/random/AbstractRandomData.ensureInittedAndSeeded(AbstractRandomData.java:91)
^– Holding lock: com/bea/security/utils/random/SecureRandomData@0xc1d78a28[recursive]
at com/bea/security/utils/random/AbstractRandomData.getRandomBytes(AbstractRandomData.java:105)
^– Holding lock: com/bea/security/utils/random/SecureRandomData@0xc1d78a28[biased lock]
at com/bea/security/utils/random/AbstractRandomData.getRandomBytes(AbstractRandomData.java:100)
at com/bea/console/utils/CSRFUtils.getSecret(CSRFUtils.java:56)
at jsp_servlet/_jsp/_changemgmt/__changemanager._jspService(__changemanager.java:156)
at weblogic/servlet/jsp/JspBase.service(JspBase.java:34)
at weblogic/servlet/internal/StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic/servlet/internal/StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic/servlet/internal/ServletStubImpl.execute(ServletStubImpl.java:301)
at weblogic/servlet/internal/ServletStubImpl.onAddToMapException(ServletStubImpl.java:416)
at weblogic/servlet/internal/ServletStubImpl.execute(ServletStubImpl.java:327)
at weblogic/servlet/internal/ServletStubImpl.execute(ServletStubImpl.java:184)
at weblogic/servlet/internal/RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:526)
at weblogic/servlet/internal/RequestDispatcherImpl.include(RequestDispatcherImpl.java:447)
at org/apache/beehive/netui/pageflow/scoping/internal/ScopedRequestDispatcher.include(ScopedRequestDispatcher.java:119)
at com/bea/netuix/servlets/controls/content/JspContent.beginRender(JspContent.java:552)
at com/bea/netuix/servlets/controls/content/NetuiContent.beginRender(NetuiContent.java:365)
at com/bea/netuix/nf/ControlLifecycle$7.visit(ControlLifecycle.java:485)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:518)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
at com/bea/netuix/nf/ControlTreeWalker.walk(ControlTreeWalker.java:220)
at com/bea/netuix/nf/Lifecycle.processLifecycles(Lifecycle.java:395)
at com/bea/netuix/nf/Lifecycle.processLifecycles(Lifecycle.java:361)
at com/bea/netuix/nf/Lifecycle.processLifecycles(Lifecycle.java:352)
at com/bea/netuix/nf/Lifecycle.run(Lifecycle.java:326)
at com/bea/netuix/nf/UIControl.render(UIControl.java:582)
at com/bea/netuix/servlets/controls/PresentationContext.render(PresentationContext.java:486)
at com/bea/netuix/servlets/util/RenderToolkit.renderChild(RenderToolkit.java:146)
at com/bea/netuix/servlets/jsp/taglib/skeleton/Child.doTag(Child.java:63)
at jsp_servlet/_framework/_skeletons/_wlsconsole/__nolayout._jspService(__nolayout.java:119)
at weblogic/servlet/jsp/JspBase.service(JspBase.java:34)
at weblogic/servlet/internal/StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic/servlet/internal/StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic/servlet/internal/ServletStubImpl.execute(ServletStubImpl.java:301)
at weblogic/servlet/internal/ServletStubImpl.execute(ServletStubImpl.java:184)
at weblogic/servlet/internal/RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:529)
at weblogic/servlet/internal/RequestDispatcherImpl.include(RequestDispatcherImpl.java:447)
at com/bea/netuix/servlets/controls/application/laf/JspTools.renderJsp(JspTools.java:130)
at com/bea/netuix/servlets/controls/application/laf/JspControlRenderer.beginRender(JspControlRenderer.java:72)
at com/bea/netuix/servlets/controls/application/laf/PresentationControlRenderer.beginRender(PresentationControlRenderer.java:65)
at com/bea/netuix/nf/ControlLifecycle$7.visit(ControlLifecycle.java:481)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:518)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
at com/bea/netuix/nf/ControlTreeWalker.walk(ControlTreeWalker.java:220)
at com/bea/netuix/nf/Lifecycle.processLifecycles(Lifecycle.java:395)
at com/bea/netuix/nf/Lifecycle.processLifecycles(Lifecycle.java:361)
at com/bea/netuix/nf/Lifecycle.processLifecycles(Lifecycle.java:352)
at com/bea/netuix/nf/Lifecycle.run(Lifecycle.java:326)
at com/bea/netuix/nf/UIControl.render(UIControl.java:582)
at com/bea/netuix/servlets/controls/PresentationContext.render(PresentationContext.java:486)
at com/bea/netuix/servlets/util/RenderToolkit.renderChild(RenderToolkit.java:146)
at com/bea/netuix/servlets/jsp/taglib/skeleton/Child.doTag(Child.java:63)
at jsp_servlet/_framework/_skeletons/_wlsconsole/__twocollayout._jspService(__twocollayout.java:246)
at weblogic/servlet/jsp/JspBase.service(JspBase.java:34)
at weblogic/servlet/internal/StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic/servlet/internal/StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic/servlet/internal/ServletStubImpl.execute(ServletStubImpl.java:301)
at weblogic/servlet/internal/ServletStubImpl.onAddToMapException(ServletStubImpl.java:416)
at weblogic/servlet/internal/ServletStubImpl.execute(ServletStubImpl.java:327)
at weblogic/servlet/internal/ServletStubImpl.execute(ServletStubImpl.java:184)
at weblogic/servlet/internal/RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:529)
at weblogic/servlet/internal/RequestDispatcherImpl.include(RequestDispatcherImpl.java:447)
at com/bea/netuix/servlets/controls/application/laf/JspTools.renderJsp(JspTools.java:130)
at com/bea/netuix/servlets/controls/application/laf/JspControlRenderer.beginRender(JspControlRenderer.java:72)
at com/bea/netuix/servlets/controls/application/laf/PresentationControlRenderer.beginRender(PresentationControlRenderer.java:65)
at com/bea/netuix/nf/ControlLifecycle$7.visit(ControlLifecycle.java:481)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:518)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
at com/bea/netuix/nf/ControlTreeWalker.walkRecursiveRender(ControlTreeWalker.java:529)
at com/bea/netuix/nf/ControlTreeWalker.walk(ControlTreeWalker.java:220)
at com/bea/netuix/nf/Lifecycle.processLifecycles(Lifecycle.java:395)
at com/bea/netuix/nf/Lifecycle.processLifecycles(Lifecycle.java:361)
at com/bea/netuix/nf/Lifecycle.runOutbound(Lifecycle.java:208)
at com/bea/netuix/nf/Lifecycle.run(Lifecycle.java:162)
at com/bea/netuix/servlets/manager/UIServlet.runLifecycle(UIServlet.java:388)
at com/bea/netuix/servlets/manager/UIServlet.doPost(UIServlet.java:258)
at com/bea/netuix/servlets/manager/UIServlet.doGet(UIServlet.java:211)
at com/bea/netuix/servlets/manager/UIServlet.service(UIServlet.java:196)
at com/bea/netuix/servlets/manager/SingleFileServlet.service(SingleFileServlet.java:251)
at javax/servlet/http/HttpServlet.service(HttpServlet.java:820)
at com/bea/console/utils/MBeanUtilsInitSingleFileServlet.service(MBeanUtilsInitSingleFileServlet.java:64)
at weblogic/servlet/AsyncInitServlet.service(AsyncInitServlet.java:130)
at weblogic/servlet/internal/StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic/servlet/internal/StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic/servlet/internal/ServletStubImpl.execute(ServletStubImpl.java:301)
at weblogic/servlet/internal/TailFilter.doFilter(TailFilter.java:26)
at weblogic/servlet/internal/FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic/servlet/internal/RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
at weblogic/servlet/internal/FilterChainImpl.doFilter(FilterChainImpl.java:56)
at weblogic/servlet/internal/WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3730)
at weblogic/servlet/internal/WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3696)
at weblogic/security/acl/internal/AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic/security/service/SecurityManager.runAs(SecurityManager.java:120)
at weblogic/servlet/internal/WebAppServletContext.securedExecute(WebAppServletContext.java:2273)
at weblogic/servlet/internal/WebAppServletContext.execute(WebAppServletContext.java:2179)
at weblogic/servlet/internal/ServletRequestImpl.run(ServletRequestImpl.java:1490)
at weblogic/work/ExecuteThread.execute(ExecuteThread.java:256)
at weblogic/work/ExecuteThread.run(ExecuteThread.java:221)
at jrockit/vm/RNI.c2java(JJJJJ)V(Native Method)
— end of trace

 

Solução

 

Isso ocorre porque o comando random não está conseguindo gerar entropia suficiente, isso deixa as requisições esperando. Para corrigir basta trocar a geração para utilizar urrando, para isso basta passar o seguinte parâmetro para a JVM do servidor:

-Djava.security.egd=file:///dev/urandom

Referência

 

http://weblogic-wonders.com/weblogic/2010/11/10/issues-relating-to-urandomrandom-on-weblogic-server-in-linux-environment/

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6366924

Categories: Java, Oracle Tags: , , ,

Dica: Importar repositório com library support para Android com maven

Problema

 

Se você estiver utilizando maven no seu projeto Android e precisa de uma classe contida nas bibliotecas de suporte, como por exemplo a classe android.support.v7.app.ActionBarActivity

Esses jars não estão disponíveis para download nos repositórios públicos maven.

 

Solução

 

É possível gerar essas bibliotecas manualmente e instalar no repositório local, mas a opcao mais simples é utilizando o projeto maven-android-sdk-deployer:

https://github.com/mosabua/maven-android-sdk-deployer

Primeiro antes de executar o script é necessário configurar a variável ANDROID_HOME.

Em seguida, executar o comando mvn clean install no diretório /maven-android-sdk-deployer/extras/compatibility-v4

Por fim, executar o comando mvn clean install no diretório /maven-android-sdk-deployer/extras/compatibility-v7-appcompat

 

No projeto é necessario apenas adicionar as seguintes dependências no pom.xml:

<dependency>
<groupId>android.support</groupId>
<artifactId>compatibility-v7</artifactId>
<version>19.1.0</version>
<type>apklib</type>
</dependency>

<dependency>
<groupId>android.support</groupId>
<artifactId>compatibility-v7</artifactId>
<version>19.1.0</version>
<type>jar</type>
</dependency>

 

Referência

 

https://github.com/mosabua/maven-android-sdk-deployer

Categories: Android, Java Tags: , , ,

Dica: Conexão JDBC banco de dados sem SID Oracle

Problema

 

Se  o banco de dados Oracle não tiver um SID configurado, a string de conexão na URL JDBC não pode ser o formato convencional. Uma conexão normal JDBC tem o seguinte formato

jdbc:oracle:thin:@host:port:sid

 

Solução

 

O formato que deve ser utilizado para se conectar sem o SID é o seguinte:

jdbc:oracle:thin:@//host:port/servicename

Referência

 

Esse formato é descrito na documentação da oracle http://docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm

Categories: Java Tags: , , ,

Dica JSF: Formulários com campos numéricos preenchidos com zero ao invés de null (Tomcat, JBoss)

Problema

Se temos um formulário JSF com um campo número ou boolean opcional, quando o usuário fizer o submit do formulário os valores no controller vem preenchidos com zero ao invés de null. Esse comportamento também afeta os campos boolean, já que o valor vai para zero e seleciona uma opção do radio ou check box.

Mas então como posso ter valores null em um formulário sem que eles sejam automaticamente preenchidos com “” (string vazia) ou zeros?

Solução

Na verdade isso não é exatamente um problema, trata-se na verdade de um comportamento default chamado “coerce null values”. Para evitar problemas com variáveis primitivas do tipo int, o servidor de aplicação automaticamente preenche os valores null com zero ou vazio.

Mas se nossos controllers trabalham com os tipos corretos (Integer e etc) nos podemos lidar com valores null. Nesse caso temos que alterar uma configuração no servidor, a propriedade abaixo funciona para Tomcat  e JBoss:

-Dorg.apache.el.parser. COERCE_TO_ZERO=false

Também é possível colocar um listener na sua aplicação, assim não precisa contar com a configuração do servidor. Crie um listener da seguinte maneira:

public class CoerceContextListener implements ServletContextListener {

@Override public void contextDestroyed(ServletContextEvent sce) { }

@Override public void contextInitialized(ServletContextEvent sce) { System.getProperties().put(“org.apache.el.parser.COERCE_TO_ZERO”, “false”);

}

}

Depois registra-lo no web.xml

<listener>

<listener-class>meu.pacote.MyServletContextListener</listener-class>

</listener>

Pronto problema resolvido, agora são valores vazio vão ficar null!

Categories: Java Tags: , , , ,

Dica: Erro Got minus one from a read call Oracle e Java (JBoss, Weblogic)

Problema

Se algum se depararem com um erro de I/O conectando no banco de dados Oracle (outros BD) via application server (JBoss, Weblogic):

Java.sql.SQLRecoverableException: Io exception: Got minus one from a read call
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:101)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:173)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:229)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:458)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:411)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:490)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:202)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:33)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:474)
at oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:275)
at oracle.jdbc.xa.client.OracleXADataSource.getPooledConnection(OracleXADataSource.java:454)

Esse erro indica que a conexão foi fechada pelo outro lado da conexão, trata-se de um erro de IO. A questão é porque o banco de dados encerraria as conexões?

Quando estamos trabalhando com o Oracle um dos principais motivos para esse comportamento é a falta de conexões/sessions no Oracle. Para consultar no Oracle o número de sessões disponíveis usar a seguinte query:

SELECT
‘Currently, ‘
|| (SELECT COUNT(*) FROM V$SESSION)
|| ‘ out of ‘
|| VP.VALUE
|| ‘ connections are used.’ AS USAGE_MESSAGE
FROM
V$PARAMETER VP
WHERE VP.NAME = ‘sessions’;

O próximo passo é comparar o tamanho dos Datasources configurados, provavelmente ocorreu pois o número máximo do pool do conexões do datasource é maior do que o número máximo da configuração do Oracle.

Solução

É necessário ajustar as sessões máximas do Oracle ou diminuir o tamanho do pool do Datasource. Veremos abaixo como aumentar o número de sessões no Oracle para 2000.

  1. Acessar o SQLPlus com o usuário sys.
  2. Executar os comandos abaixo:
    SQL> alter system set sessions=5000 scope=spfile;
    System altered 
    SQL> alter system set processes=5000 scope=spfile;
    System altered
  3. Para as alterações fazerem enfeito é necessário reiniciar o banco de dados.
  4. Ainda no SQLPlus executar:
    SQL> shutdown immediate
     Database closed.
     Database dismounted.
     ORACLE instance shut down.
  5. Em seguida reiniciar o banco:SQL> startup ORACLE instance started.
    Total System Global Area 4275781632 bytes 
    Fixed Size 2235208 bytes 
    Variable Size 1862272184 bytes 
    Database Buffers 2382364672 bytes 
    Redo Buffers 28909568 bytes 
    Database mounted. 
    Database opened.

Pronto agora que os valores estão compatíveis esse erro não deve ocorrer mais.

Categories: Java, Oracle Tags: , , ,

Dica: JBoss travamento JMS

Quando o JBoss estiver travando a melhor coisa a se fazer é fazer um dump da Stack da JVM (usando o jstack por exemplo).

Uma dica que descobri hoje é quando na stack existem várias threads bloqueadas como:

EJB default – 1 [BLOCKED] CPU time: 0:01
java.util.concurrent.Semaphore.acquire(int)
org.hornetq.core.client.impl.ClientProducerCreditsImpl.acquireCredits(int)
org.hornetq.core.client.impl.ClientProducerImpl.sendRegularMessage(MessageInternal, boolean, ClientProducerCredits)
org.hornetq.core.client.impl.ClientProducerImpl.doSend(SimpleString, Message)
org.hornetq.core.client.impl.ClientProducerImpl.send(SimpleString, Message)
org.hornetq.jms.client.HornetQMessageProducer.doSend(Message, long, HornetQDestination)
org.hornetq.jms.client.HornetQMessageProducer.send(Message)
org.hornetq.ra.HornetQRAMessageProducer.send(Message)

Um dos motivos para esse problema, pode ser o fato de uma fila (Queue) de mensagens estar cheia. Existem 3 maneiras de lidar com a fila cheia BLOCK, PAGE, DROP. Tem que ver a documentação:

http://docs.jboss.org/hornetq/2.3.0.Alpha/docs/user-manual/html/paging.html#d0e5075

<address-settings>
<address-setting match=”#”>
<dead-letter-address>jms.queue.DLQ</dead-letter-address>
<expiry-address>jms.queue.ExpiryQueue</expiry-address>
<redelivery-delay>0</redelivery-delay>
<max-size-bytes>30485760</max-size-bytes>
<address-full-policy>BLOCK</address-full-policy>
<message-counter-history-day-limit>10</message-counter-history-day-limit>
</address-setting>
</address-settings>

O BLOCK faz com que a chamada do Client Mensagem JMS fique bloqueada enquanto a fila estiver cheia.

A solução ideal é investigar porque a fila está enchendo e ninguém está consumindo, no meu caso isso era esperado (uma fila de integração que em alguns clientes não é utilizada).

Se mudar para DROP o sistema não irá travar, quando a fila encher ela vai começar a jogar os pacotes fora. Isso pode ser especificado por fila:

<address-settings>
<address-setting match=”jms.queue.QueueNaoUtilizada”>
<redelivery-delay>0</redelivery-delay>
<max-size-bytes>10485760</max-size-bytes>
<address-full-policy>DROP</address-full-policy>
</address-setting>
<address-setting match=”#”>
<redelivery-delay>0</redelivery-delay>
<max-size-bytes>10485760</max-size-bytes>
<address-full-policy>BLOCK</address-full-policy>
</address-setting>
</address-settings>

Outra dica é configurar a fila durable como false, assim o JBoss não tem o trabalho de persistir as mensagens:

<jms-queue name=”QueueNaoUtilizada”>
<entry name=”meuapp/QueueNaoUtilizada”/>
<entry name=”java:jboss/exported/meuapp/QueueNaoUtilizada”/>
<durable>false</durable>
</jms-queue>

Categories: Java

Profiler no JBoss AS 7 (EAP 6)

Para configurar o agente de profiler no JBoss não basta apenas configurar o agente no JAVA_OPTS. Para esse exemplo vamos utilizar o profiler chamado YourKit.

O primeiro passo é configurar o agente no arquivo na pasta JBOSS_HOME\bin\standalone.conf, adicione as seguintes linhas no final:

# Enable profiling
JAVA_OPTS=”$JAVA_OPTS -agentpath:/Users/aristides/dev/YourKit_Java_Profiler_9.5.6.app/bin/mac/libyjpagent.jnilib=disablestacktelemetry,disableexceptiontelemetry,builtinprobes=none,delay=10000″

Se pararmos por aqui, ao executar ocorrerá o seguinte erro:

mac:bin aristides$ ./standalone.sh –server-config=standalone-full.xml
=========================================================================

JBoss Bootstrap Environment

JBOSS_HOME: /Users/aristides/dev/jboss-eap-6.1

JAVA: java

JAVA_OPTS: -server -XX:+UseCompressedOops -Xms1303m -Xmx1303m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -agentpath:/Users/aristides/dev/YourKit_Java_Profiler_9.5.6.app/bin/mac/libyjpagent.jnilib=disablestacktelemetry,disableexceptiontelemetry,builtinprobes=none,delay=10000

=========================================================================

[YourKit Java Profiler 9.5.6] Loaded. Log file: /Users/aristides/.yjp/log/20397.log
Exception in thread “main” java.lang.NoClassDefFoundError: com/yourkit/runtime/Callback
at org.jboss.logmanager.LogManager.<init>(LogManager.java)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at java.lang.Class.newInstance0(Class.java:372)
at java.lang.Class.newInstance(Class.java:325)
at java.util.logging.LogManager$1.run(LogManager.java:186)
at java.security.AccessController.doPrivileged(Native Method)
at java.util.logging.LogManager.<clinit>(LogManager.java:175)
at org.jboss.modules.Main.main(Main.java:394)
Caused by: java.lang.ClassNotFoundException: com.yourkit.runtime.Callback from [Module “org.jboss.logmanager:main” from local module loader @1bf75734 (finder: local module finder @b7e2544 (roots: /Users/aristides/dev/jboss-eap-6.1/modules,/Users/aristides/dev/jboss-eap-6.1/modules/system/layers/base))]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:196)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:444)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:432)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:374)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:119)
… 11 more

Isso ocorre por conta do controle de módulos introduzido no JBoss 7, assim é necessário configurar o pacote do profiler YourKit. Voltamos novamente  no arquivo standalone.conf, alteramos a seguinte linha:

De

   JBOSS_MODULES_SYSTEM_PKGS=”org.jboss.byteman”

Para

   JBOSS_MODULES_SYSTEM_PKGS=”org.jboss.byteman,com.yourkit”

 

Pronto problema resolvido e profiler ativado no JBoss.

 

 

 

Categories: Java Tags: , , ,

Erro Datasource Tomcat na Amazon EC2 (Linux)

Hoje em dia está bem comum ter projetos que vão ser executados na Cloud.

O provedor mais comum utilizado hoje para fazer esse tipo de instalação no Amazon EC2. Lá você pode contratar uma instância e recebe um Linux limpo, cabe a você instalar o banco de dados e o servidor de aplicação desejado.

Existem vários tutoriais que ajudam nesse processo de configuração, como esse aqui.

Problema

Um cuidado que deve ser tomado é que sua aplicação pode não funcionar de primeira, por conta de um erro de datasource não encontrado no Tomcat:

Failed to look up JNDI DataSource with name ‘jdbc/TesteDs’; nested exception is javax.naming.NameNotFoundException: Name [jdbc/TesteDs] is not bound in this Context. Unable to find [jdbc].

Quando analisei os log catalina.out, encontrei uma mensagem mais significativa:

Jun 5, 2013 9:23:36 PM org.apache.catalina.core.NamingContextListener addResource
WARNING: Failed to register in JMX: javax.naming.NamingException: Could not create resource factory instance [Root exception is java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory]

Então vi que o Tomcat não estava conseguindo criar o DataSource que defini no context.xml, então fui mais afundo e achei a causa do problema. Ele ocorre pois a instalação do Tomcat a partir dos repositórios linux (yum, apt get) tem de ser gerada a partir do fonte, isso acaba gerando uma diferença nos pacotes apache, isso faz com que a classe default de datasource não seja encontrada. O problema é descrito com mais detalhes nesse bug do Ubuntu.

Solução

A solução mais simples que eu encontrei foi especificar a classe do datasource no arquivo context.xml, isso corrigiu o problema para o deploy:

<Resource name=”jdbc/TesteDS”
auth=”Container”
type=”javax.sql.DataSource”
driverClassName=”com.mysql.jdbc.Driver”
url=”jdbc:mysql://localhost:3306/teste”
username=”username” password=”password”
validationQuery=”SELECT COUNT(*) FROM MY_TABLE”
factory=”org.apache.commons.dbcp.BasicDataSourceFactory” />

Outra alternativo é reinstalar o Tomcat baixando-o direto do site, mas não é tão prático quanto simplesmente fazer um yum install tomcat7 🙂


								
Categories: Java Tags: , , , ,

Intellij no Mac OS

intelliJ

Para quem desenvolve Java, Android, Python, Groovy e etc recomendo experimentar a IDE da JetBrains chamada Intellij. Ela é bem mais leve e estável que o Eclipse, um dos principais diferenciais é que ela suporta nativamente Maven (no eclipse é necessário o plugin m2e que as vezes não é muito bom).

Como tudo que é bom, essa IDE é paga… Mas é possível utilizar a versão Community Edition, que é grátis. Obviamente tem algumas limitações, mas para Java puro e Android estou usando sem problemas. O endereço é:

http://www.jetbrains.com/idea/free_java_ide.html

Para os que estão acostumados ao Eclipse eu recomendo utilizarem o keymap (lista de atalhos do Eclipse). Utilizando esse keymap os atalhos no Intellij vão ficar como no Eclipse, facilitando a adaptação com a ferramenta. Para acessar basta ir em Menu –> Preferences –> Keymap e selecionar Eclipse.

Agora entra a minha dica para usuários Mac, se vocês utilizarem o Keymap do Eclipse no Mac, vão perceber que o mapeamento das teclas é feito com a tecla CTRL (como no windows) ao invés da Command. Para corrigir isso é fácil, basta seguir estes passos:

  1. Fazer o download  do XML no link: https://github.com/thatha/IntelliJ-IDEA-Eclipse-on-Mac-Keymap/blob/master/Eclipse%20on%20Mac.xml
  2. Salvar o arquivo XML no diretório: /Users/aristides/Library/Preferences/IdeaIC12/keymaps
  3. Abrir o Intellij (se estiver aberto, abra e feche novamente) vá para tela Menu –> Preferences –> Keymap e selecionar “Eclipse on Mac”.

Pronto! Agora os atalhos serão os mesmos do Eclipse para Mac, utilizando a tecla Command.

Categories: Android, Java Tags: , , ,