Exemplo de projeto com Spring Boot + JMS + ActiveMQ usando filas e tópicos

Este é um projeto de exemplo criado em Spring Boot que mostra como utilizar JMS com o activeMQ, enviando e recebendo de filas(Queue) e tópicos(Topic)

Wolmir Cezer Garbin por Wolmir Cezer Garbin - - Spring Boot - TUTORIAL

Última atualização em: | 21588 Visualizações

Criando o Projeto

Antes de mais nada, criamos o projeto, para isso crie um projeto em spring boot ou em maven e adicione a dependência do activemq:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

O arquivo pom.xml completo fica da seguinte forma:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.example</groupId>
	<artifactId>demo-jms</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>demo-jms</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.0.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-activemq</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

Agora a classe principal do projeto DemoJmsApplication fica assim:

package com.example.demojms;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoJmsApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoJmsApplication.class, args);
	}
}

Note que o package da aplicação é com.example.demojms.


Usando JMS

Agora já pode criar a classe de configuração em seu projeto. Esta é uma classe pronta que permite utilizar filas e tópicos do activeMQ de maneira muito simples.

import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.core.JmsTemplate;

import javax.jms.ConnectionFactory;


@Configuration
@EnableJms
public class JmsConfig {

    @Value("${spring.activemq.broker-url}")
    private String brokerUrl;

    @Value("${spring.activemq.user}")
    private String user;

    @Value("${spring.activemq.password}")
    private String password;

    @Bean
    public ActiveMQConnectionFactory connectionFactory() {
        if ( "".equals(user) ) {
            return new ActiveMQConnectionFactory(brokerUrl);
        }
        return new ActiveMQConnectionFactory(user, password, brokerUrl);
    }

    @Bean
    public JmsListenerContainerFactory jmsFactoryTopic(ConnectionFactory connectionFactory,
                                                  DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        configurer.configure(factory, connectionFactory);
        factory.setPubSubDomain(true);
        return factory;
    }

    @Bean
    public JmsTemplate jmsTemplate() {
        return new JmsTemplate(connectionFactory());
    }

    @Bean
    public JmsTemplate jmsTemplateTopic() {
        JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory());
        jmsTemplate.setPubSubDomain( true );
        return jmsTemplate;
    }
}

Adicionada a classe ao projeto, adicione as configurações no arquivo application.properties.

spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=
spring.activemq.password=

Agora temos o projeto pronto para começar a enviar e receber mensagens.

Enviando mensagem para fila - Queue

Em sua classe faça a injeção de dependência do JmsTemplate e utilize para enviar as mensagens. Veja:

@Autowired private JmsTemplate jmsTemplate;

[...]

jmsTemplate.convertAndSend("queue.sample", "{user: 'wolmir', usando: 'fila'}");

Enviando mensagem para um tópico - Topic

Em sua classe faça a injeção de dependência do JmsTemplate usando no nome jmsTemplateTopic(para injetar o JmsTemplate a partir do Bean declarado a partir do método jmsTemplateTopic()), e utilize para enviar as mensagens. Veja:

@Autowired private JmsTemplate jmsTemplateTopic;

[...]

jmsTemplateTopic.convertAndSend("topic.sample", "{user: 'wolmir', usando: 'tópico'}");

Ouvindo uma fila (Queue)

@JmsListener(destination = "queue.sample")
public void onReceiverQueue(String str) {
	System.out.println( str );
}

Ouvindo um tópico (Topic)

@JmsListener(destination = "topic.sample", containerFactory = "jmsFactoryTopic")
public void onReceiverTopic(String str) {
	System.out.println( str );
}

A classe completa do componente que envia e recebe as mensagens fica assim:

package com.example.demojms;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;

@Component
public class MessageListenerComponent implements ApplicationRunner {

    @Autowired private JmsTemplate jmsTemplate;
    @Autowired private JmsTemplate jmsTemplateTopic;


    @JmsListener(destination = "queue.sample")
    public void onReceiverQueue(String str) {
        System.out.println( str );
    }

    @JmsListener(destination = "topic.sample", containerFactory = "jmsFactoryTopic")
    public void onReceiverTopic(String str) {
        System.out.println( str );
    }


    @Override
    public void run(ApplicationArguments args) throws Exception {
        jmsTemplate.convertAndSend("queue.sample", "{user: 'wolmir', usando: 'fila'}");
        jmsTemplateTopic.convertAndSend("topic.sample", "{user: 'wolmir', usando: 'tópico'}");
    }

}

O projeto completo esta disponível no github: https://github.com/receitas-de-codigo/demo-jms

Espero que tenham gostado desse exemplo, qualquer dúvida deixe nos comentários.


Não esqueca de deixar suas dúvidas nos comentários e compartilhar este post.


Publique seu post no Receitas de Código

Aguarde, estamos trabalhando para que você possa publicar sua postagem no Receitas de Código!