ActiveMQ Artemis – Configurando acesso externo para seu domínio

Considerando que já temos o Artemis instalado e configurado em nossa maquina, vamos realizar a configuração para liberar seu domínio para ser acessível externamente.

O processo baseia-se em alterar dois arquivos da pasta etc de sua instância, o bootstrap.xml e o jolokia-access.xml.

Caso ainda não tenha o Artemis instalado e configurado acesse a pagina da documentação oficial: https://activemq.apache.org/components/artemis/documentation/ – Em uma outra oportunidade farei um post sobre isso.

Para os próximos passos vamos considerar que estamos no seguinte diretório: {HOME_ARTEMIS}/{SEU_BROKER}/

Edite o arquivo etc/bootstrap.xml e edite a linha aonde se encontra a menção a localhost, substitua-o pelo seu domínio;

<!-- The web server is only bound to localhost by default -->
<web bind="http://artemis.helpdev.com.br:8161" path="web">

O mesmo procedimento deve ser realizado no arquivo etc/jolokia-access.xml:

<!-- Allow cross origin access from localhost ... -->
<allow-origin>*://artemis.helpdev.com.br*</allow-origin>

Reinicie o serviço e seu broker já estará disponível para seu domínio.

[IDEs] [IntelliJ] SonarLint – Mais qualidade em seus códigos

“SonarLint is an IDE extension that helps you detect and fix quality issues as you write code. Like a spell checker, SonarLint squiggles flaws so that they can be fixed before committing code.” – https://www.sonarlint.org

Recentemente conheci um plugin disponível no IntelliJ que está me auxiliando na qualidade de meus códigos. O SonarLint, ajuda a detectar e corrigir problemas de qualidade de código, como um corretor ortográfico, gerando notificações em tempo de desenvolvimento e informando de problemas relacionados em cada commit.

Link: https://www.sonarlint.org

[Docker] [ActiveMQ] Docker-compose do ActiveMQ Artemis

artemis-logo

Apache ActiveMQ é um message brocker de código aberto feito em Java, suporta diferentes tipos de protocolo como AMQP, STOMP, MQTT e JMS.

“Apache ActiveMQ™ is the most popular open source, multi-protocol, Java-based messaging server. It supports industry standard protocols so users get the benefits of client choices across a broad range of languages and platforms. Connectivity from C, C++, Python, .Net, and more is available. Integrate your multi-platform applications using the ubiquitous AMQP protocol. Exchange messages between your web applications using STOMP over websockets. Manage your IoT devices using MQTT. Support your existing JMS infrastructure and beyond. ActiveMQ offers the power and flexibility to support any messaging use-case. There are currently two “flavors” of ActiveMQ available – the “classic” 5.x broker and the “next generation” Artemis broker. Once Artemis reaches a sufficient level of feature parity with the 5.x code-base it will become ActiveMQ 6. Initial migration documentation is available.” http://activemq.apache.org

A nova versão do ActiveMQ Artemis foi disponibilizada recentemente com uma documentação muito boa inclusive com ja com a criação do Docker, veja mais sobre a documentação em:

https://activemq.apache.org/components/artemis/

Sobre o Docker eles disponibilizaram um repositório no GitHub com o Dockerfile e scripts para a criação da imagem:

https://github.com/apache/activemq-artemis/tree/master/artemis-docker

Porém gostei muito da implementação do VROMERO, que encontrei no hub.docker:

https://hub.docker.com/r/vromero/activemq-artemis

Atravéz desses dados gerei um docker-compose para sua inicialização:

version: '3.3'

services:

  amq:
    image: vromero/activemq-artemis:latest-alpine
    container_name: activemq
    environment:
      ARTEMIS_USERNAME: user-amq
      ARTEMIS_PASSWORD: password-amq
    ports:
      - 8161:8161
      - 61616:61616

Vale a pena olhar a implementação do vromero/activemq-artemis em seu repositório para uma customização mais completa do compose:

https://github.com/vromero/activemq-artemis-docker

[Java] Desabilitando paliativamente o SSL de uma conexão com o MySQL para evitar o seguinte erro: Jdbc javax.net.ssl.SSLException: closing inbound before receiving peer’s close_notify

mysql

** BEGIN NESTED EXCEPTION ** 

javax.net.ssl.SSLException
MESSAGE: closing inbound before receiving peer's close_notify

STACKTRACE:

javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify
	at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:133)
	at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
	at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:308)
	at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264)
	at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:255)
	at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:645)
	at java.base/sun.security.ssl.SSLSocketImpl.shutdownInput(SSLSocketImpl.java:624)
	at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:2249)
	at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4221)
	at com.mysql.jdbc.ConnectionImpl.close(ConnectionImpl.java:1464)
	at com.zaxxer.hikari.pool.PoolBase.quietlyCloseConnection(PoolBase.java:135)
	at com.zaxxer.hikari.pool.HikariPool.lambda$closeConnection$1(HikariPool.java:441)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)


** END NESTED EXCEPTION **

Solução paliativa:

Alterar a String de conexão com o banco de dados e adicionar o parametro `useSSL` como false:

spring.datasource.url=jdbc:mysql://localhost:3306/database?useSSL=false

https://stackoverflow.com/a/55193187/10512799

Solução adequada:

A solução adequada seria configurar sua conexão com o banco de dados de forma segura utilizando o SSL, segue alguns links úteis:

https://www.techrunnr.com/connect-mysql-server-from-spring-boot-application-with-ssl/

https://stackoverflow.com/questions/43635449/how-to-configure-spring-boot-application-to-use-ssl-tls-over-mysql?rq=1

 

[Tomcat] [Maven] Maven plugin para deploy no Tomcat 9

TOMCAT-SERVER

Normalmente para realizar o deploy de uma aplicação no Tomcat, temos que entrar em seu painel e realizar o upload manualmente do arquivo .war, esse processo é um pouco custoso e nem sempre temos acesso a esse painel em um ambiente de produção, para isso a própria Apache desenvolveu um plugin para automatizar o processo de deploy.

O plugin que vou apresentar agora é do Tomcat 7 porém consegui utiliza-lo normalmente com o Tomcat 9.

Configurando o Plugin

Segue a configuração do plugin tomcat7-maven-plugin:

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
        <url>http://localhost:8080/manager/text</url>
        <server>TomcatServer</server>
        <path>/${project.artifactId}</path>
    </configuration>
</plugin>

A configuração do plugin é bem simples, porém cabe algumas resalvas a serem esclarecidas, note que temos as seguintes configurações para o plugin: Continue reading

[TomCat] [Spring] Como definir o ‘spring.profiles.active’ de uma aplicação Spring no Tomcat

spring-boot

Quando trabalhamos com aplicações desenvolvidas com o Framework Spring Boot é normal utilizarmos os ‘profiles‘ para definir o ambiente que estamos trabalhando, os profiles são muito utilizados para carregar os resources utilizados na aplicação, permitindo uma variedade de ambientes, como testes, desenvolvimento, produção, etc.

O Spring Boot permite que implementemos uma solução já com um servidor de aplicação embutido, mas também nos permite gerar um .war e subirmos em nosso próprio servidor de aplicação, quando temos um jar, para executarmos a aplicação com um profile especifico, basta inserirmos os argumentos na execução, exemplo:

java -Dspring.profiles.active=prod -jar MyApp.jar

Mas como fazemos isso em um servidor de aplicação? aonde normalmente só realizamos o deploy do .war?. Quando temos esse tipo de ambiente temos que configurar o nosso servidor de aplicação para que ele possua esses argumentos, assim, as devidas váriaveis estaram definidas na VM e a solução terá acesso a elas.

A solução é simples, no caso do Tomcat quem se responsabiliza em gerenciar sua execução é um arquivo chamado catalina.sh armazenado na pasta /bin, todas as configurações do servidor de aplicação devem ser configurados nesse arquivo. Para adicionarmos um VM’args no caso o `spring.profiles.active` vamos editar esse arquivo e adicionar na variável CATALINA_OPTS seu valor.

Segue a alteração que deve ser feita no catalina.sh: Continue reading

[CircleCI] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test

circle-ci

Falha ao executar os testes com o CircleCI:

Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test

org.apache.maven.surefire.booter.SurefireBooterForkException: The forked VM terminated without properly saying goodbye. VM crash or System.exit called

at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:669)

Stack do erro:

[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.569 s
[INFO] Finished at: 2019-05-23T12:49:29Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project music-store-api: There are test failures.
[ERROR] 
[ERROR] Please refer to /home/circleci/repo/target/surefire-reports for the individual test results.
[ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
[ERROR] The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
[ERROR] Command was /bin/sh -c cd /home/circleci/repo && /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -jar /home/circleci/repo/target/surefire/surefirebooter2181446008377863749.jar /home/circleci/repo/target/surefire 2019-05-23T12-49-29_338-jvmRun1 surefire9019672418897110819tmp surefire_06824344050207374070tmp
[ERROR] Error occurred in starting fork, check output in log
[ERROR] Process Exit Code: 1
[ERROR] org.apache.maven.surefire.booter.SurefireBooterForkException: The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
[ERROR] Command was /bin/sh -c cd /home/circleci/repo && /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -jar /home/circleci/repo/target/surefire/surefirebooter2181446008377863749.jar /home/circleci/repo/target/surefire 2019-05-23T12-49-29_338-jvmRun1 surefire9019672418897110819tmp surefire_06824344050207374070tmp
[ERROR] Error occurred in starting fork, check output in log
[ERROR] Process Exit Code: 1
[ERROR] 	at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:669)
[ERROR] 	at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:282)
[ERROR] 	at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:245)
[ERROR] 	at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1183)
[ERROR] 	at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1011)
[ERROR] 	at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:857)
[ERROR] 	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137)
[ERROR] 	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210)
[ERROR] 	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156)
[ERROR] 	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148)
[ERROR] 	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117)
[ERROR] 	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81)
[ERROR] 	at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56)
[ERROR] 	at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
[ERROR] 	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305)
[ERROR] 	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192)
[ERROR] 	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105)
[ERROR] 	at org.apache.maven.cli.MavenCli.execute(MavenCli.java:956)
[ERROR] 	at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
[ERROR] 	at org.apache.maven.cli.MavenCli.main(MavenCli.java:192)
[ERROR] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR] 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[ERROR] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR] 	at java.lang.reflect.Method.invoke(Method.java:498)
[ERROR] 	at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
[ERROR] 	at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
[ERROR] 	at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
[ERROR] 	at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
[ERROR] 
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
Exited with code 1

Para corrigir basta adicionarmos o seguinte plugin no POM do projeto:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <useSystemClassLoader>false</useSystemClassLoader>
    </configuration>
</plugin>

[Python / PyCharm] ModuleNotFoundError: No module named ‘distutils.core’ (Can’t install virtual interpreter in PyCharm in Linux)

pycharm-python-error

Erro ao criar um Projeto com VirtualVenv no PyCharm:

ModuleNotFoundError: No module named ‘distutils.core’

Solução:

$sudo apt-get install python3-distutils

[JAVA / MAVEN] – Projeto de exemplo de um Archetype em Java (How to create archetype – project sample)

add_archetype

Helpdev Archetype

Esse projeto pode ser utilizado como exemplo para criar seu próprio archetype, ele contém configurações de como criar uma classe com nome dinâmico, como criar variáveis para ser substituídas no código, importar README, .gitignore etc.

Especificamente nesse projeto o archetype foi definido para criar uma estrutura de pastas padronizados, criar uma Main class com o nome do projeto tudo dentro do package adequado ( group id + artifact id ), de acordo com necessidades de projetos em produção ele também cria uma pasta externa de properties com um arquivo contendo o artifact id como nome.

https://github.com/gbzarelli/archetype-java

https://github.com/gbzarelli/archetype-spring