Introdução ao RabbitMQ
RabbitMQ é um sistema de mensagens corporativas completo e reutilizável baseado no AMQP
MQ é o nome completo da fila de mensagens. Fila de mensagens (MQ) é um método de comunicação entre aplicativos e aplicativos. Os aplicativos se comunicam lendo e escrevendo mensagens na fila (dados para aplicativos) sem uma conexão dedicada para vinculá -los. A entrega de mensagens refere -se à comunicação entre os programas enviando dados em mensagens, e não ligando diretamente, as chamadas diretas geralmente são usadas em técnicas como chamadas de procedimento remoto. A fila refere -se ao aplicativo que se comunica através de uma fila. O uso de filas elimina o requisito de que o aplicativo de recebimento e o envio seja executado simultaneamente.
O AMQP é um protocolo, um protocolo de comunicação de mensagem de camada de abstração de alto nível.
Embora existam muitos padrões públicos no mundo das mensagens síncronas (como Cobar IIOP, SOAP, etc.), esse não é o caso no processamento de mensagens assíncronas. Somente grandes empresas têm algumas implementações comerciais (como o MSMQ da Microsoft, o Websphere MQ da IBM, etc.). Portanto, em junho de 2006, Cisco, Redhat, IMATIX e outros formularam os padrões públicos em conjunto para o AMQP. Em outras palavras, o AMQP é um protocolo para comunicação assíncrona.
Cenários de uso do RabbitMQ
No projeto, algumas operações demoradas que não exigem retorno imediato são extraídas e processadas de forma assíncrona. Esse processamento assíncrono salva bastante o tempo de resposta de solicitação do servidor, melhorando assim a taxa de transferência do sistema. No entanto, a maioria deles não é apenas necessária para retornar instantaneamente, e não importa se a execução é bem -sucedida ou não. Se você precisar de retorno instantâneo, poderá usar o Dubbo. BOOT Spring Integra -se ao Dubbo, você pode assistir à Integração de Botas da Primavera Dubbox
Dependência do rabbitMQ
O RabbitMQ não é um pacote de jar simples (o pacote JAR fornece apenas algumas funções básicas de comunicação com o próprio RabbitMQ). Semelhante ao Dubbo, o RabbitMQ também exige que outro software seja executado. A seguir, é apresentado o software necessário para a execução do RabbitMQ.
1. Erlang
Como o próprio software RabbitMQ é desenvolvido com base em Erlang, se você deseja executar o RabbitMQ, você deve primeiro seguir Erlang
Site oficial de Erlang
Endereço de download de Erlang
RabbitMQ
RabbitMQ é o núcleo da implementação de filas de mensagens
Site oficial do RabbitMQ
Download do RabbitMQ
Configurando o RabbitMQ
Após a conclusão da instalação, você precisa concluir alguma configuração antes de usar o RabbitMQ. Você pode usar diretamente o CMD no diretório SBIN no diretório de instalação do RabbitMQ por meio da configuração de comando, ou pode encontrar diretamente o RabbitMQ Command Prompt (SBIN DIR) no menu Iniciar para executar o SBIN diretamente no diretório de instalação do RabbitMQ. Por conveniência, primeiro ativamos o plug-in de gerenciamento e executamos os comandos.
RabbitMQ-PLUGINS.BAT Ativar rabbitmq_management
É isso mesmo, observe que isso está no Windows. Se for Linux, não há sufixo de morcego. Em seguida, adicionamos um usuário, porque a conexão não pode ser bem -sucedida sem os usuários no ambiente de rede externa. Execute o comando add user
rabbitmqctl.bat add_user springboot senha
Springboot é o nome de usuário e a senha é a senha
Então, para a conveniência da demonstração, damos a Springboot as permissões do administrador para facilitar o login na página de gerenciamento
Rabbitmqctl.bat set_user_tags Administrador de trampolim
Fornecer permissões de conta
rabbitmqctl.bat set_permissions -p / springboot.*.*.*
Em seguida, inicie o serviço RabbitMQ e visite a página de gerenciamento do RabbitMQ http: // localhost: 15672 para ver a página de login. Se não houver usuário criado, você poderá usar o convidado e o hóspedes para fazer login. Se houver um usuário criado, use o usuário criado para fazer login. Se houver um usuário criado, use o usuário criado para fazer login.
Crie o projeto Springboot
Como já mencionei a criação de um projeto de inicialização da primavera no artigo anterior muitas vezes, não vou dizer muito aqui
Adicione dependências relacionadas ao RabbitMQ
<!-rabbitmq-> <pendency> <puerpiD> org.springframework.boot </groupiD> <stifactId> Spring-boot-starter-amqp
É isso mesmo, apenas um pouco de configuração, mas talvez eu não entenda dessa maneira, então é melhor postar todas as configurações
<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> <puperid> wang.raye.rabbitmq </groupid> <TarifactId> Demo1 </ArtifactId> <ugress> 0.1-SNAPSHET> 0.1-SNAPSHET> 0.1-SNAPSHET> 0.1-SNAPSHET> <name> Demo1 </name> <erl> http://maven.apache.org </url> <Perts> <Project.build.sourceEncoding> utf-8 </project.build.sourcencoding> </properties> </groupid> ou oug.springfringfring. <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- Springboot --> <dependency> <GrupID> org.springframework.boot </roupiD> <TRATIFACTID> Spring-boot-Starter-Web </ArtifactId> </Dependency> <!-rabbitmq-> <pendence> <voupid> org.springframework.Boot </GroupId> <Artifactid> Spring-BootStar </dependences> </Project>
Como nenhuma outra operações é realizada, o projeto atualmente depende principalmente de dois módulos, uma bota de sprig e um RabbitMQ
Adicione a classe de configuração
pacote wang.raye.rabbitmq.demo1; importar org.springframework.amqp.core.acknowledgemode; importar org.springframework.amqp.core.binding; importar org.springframework.amqp.core.binding; importar org.springframework.amqp.core.bindingbuilder; importar org.springframework.amqp.core.directExchange; importar org.springframework.amqp.core.message; importar org.springframework.amqp.core.queue; importar org.springframework.amqp.rabbit.connection.cachingConnectionFactory; importar org.springframework.amqp.rabbit.connection.connectionFactory; importar org.springframework.amqp.rabbit.core.channelawaremessagelistener; importar org.springframework.amqp.rabbit.listener.simpleMessaGelistEnerContainer; importar org.springframework.context.annotation.bean; importar org.springframework.context.annotation.configuration;/*** RabbitMQ Configuration Class* @Author Raye* @Sence 12 de outubro de 2016 10:57:44*/ @Configuration Public Classe RabbitMQConfig {/** Nome da mensagem*/Public Static final String = Mysking = mymq mymq mymq mymq mymq mymq mymq mymq mymq mymq mymq mymq mymq mymq mymk; / ** fila key1*/ public static final string roteingKey1 = "QUEUE_ONE_KEY1"; / ** fila key2*/ public static final string roteingKey2 = "QUEUE_ONE_KEY2"; / *** Informações do link de configuração* @return*/ @Bean public ConnectionFactory ConnectionFactory () {CachingConnectionFactory ConnectionFactory = new CachingConnectionFactory ("127.0.1", 5672); ConnectionFactory.setUsername ("Springboot"); ConnectionFactory.SetPassword ("Senha"); ConnectionFactory.SetVirtualHost ("/"); ConnectionFactory.SetPublisherConfirms (true); // Return ConnectionFactory deve ser definido; } / *** Configure o interruptor da mensagem* Configure o fanoutExchange para os consumidores: distribua mensagens para todas as filas ligadas, sem o conceito de roteingkey headerSexchange: corresponde ao DirectExChange adicionando o valor do atributo: Multi-TELLE (@Bean the RetwerChank (@DeeTCHANCHANCENCHANCENCHANCENCIMEX (DIRETHCHANGET (Distribui), que é necessário, o valor do traseiro, que se retex) falso); } / ** * Configurar a fila da mensagem 1 * Configurar para os consumidores * @return * / @Bean public file fileeue () {return new fila ("fileue_one", true); // Quantidade persistente}/*** Ligue a fila de mensagens 1 com o comutador* Configure para os consumidores* @return*/@Bean public encaderning binding () {return bindingbuilder.bind (fileue ()). Para (defaultExchange ()). Com (rabbitmqconfig.outingKey1); } / ** * Configurar a fila da mensagem 2 * Configurar para os consumidores * @return * / @Bean Public file fileeue1 () {return new fila ("Queue_one1", true); // persistência rápida}/*** Ligue a fila de mensagens 2 com o comutador* Configure para os consumidores* @return*/@Bean public binding binding1 () {return bindingbuilder.bind (queue1 ()). Para (defaultExchange ()). Com (rabbitmqconfig.RoutKey2); } / *** Aceite a mensagem escutando, este ouvinte aceitará a mensagem da fila de mensagens 1* Configure para os consumidores* @return* / @Bean public SimpleMessaGelistEnerContainer messagecontainer () {simplemessagelisterContainer container = new SimpleMessessageListEnContAinner (conexão (); container.setQueues (Queue ()); container.setexposelistenerChannel (true); container.setMaxConcurrentConsumers (1); container.setConcurrentConsumers (1); container.setackNowledGemode (reconheceuMode.Manual); // Definir modo de confirmação confirmar manualmente o container.setMessageListener (new ChannelAwaremessageListener () {public void onMessage (mensagem da mensagem, com.rabbitmq.client.Channel Channel) lança exceção {byte [] body.god.getbody (); system.out.println ("Receba:" canal.basicack (message.getMessageProperties (). getDeliveryTag (), false); recipiente de retorno; } / *** Aceite a mensagem escutando, este ouvinte aceitará a mensagem da fila de mensagens 1* Configuração para os consumidores* @return* / @Bean public SimpleMessaGelistEnerContainer MessagEContainer2 () {SimpleMessaGELISTENCONTAINER Container = new SimpleMeSaSageListEnContainer (Conexão); container.setQueues (Queue1 ()); container.setexposelistenerChannel (true); container.setMaxConcurrentConsumers (1); container.setConcurrentConsumers (1); container.setackNowledGemode (reconheceuMode.Manual); // defina o modo de confirmação confirme manualmente o container.setMessaGelistener (novo ChannelAwaremessageListener () {public void onMessage (mensagem da mensagem, com.rabbitmq.client.channel canal) lança exceção {byte [] body = message.getbody (); system.out.Prontln) ("quee1 {byte [] body = message.getbody (); system.out.out.Println (" Quee1; canal.basicack (message.getMessageProperties (). getDeliveryTag (), false); recipiente de retorno; }}Observe que, para demonstrar melhor como configurar, configurei duas filas de mensagens. Exceto onde a configuração do link é configurada, o restante desta classe é direcionado para os consumidores de mensagens. Obviamente, os consumidores de mensagens e os produtores de mensagens precisam configurar informações de link. Por conveniência, os consumidores de mensagens e produtores deste projeto estão neste projeto. Geralmente, o projeto real não estará no mesmo projeto. Como os comentários são muito detalhados, não vou dizer muito.
Envie uma mensagem
Para facilitar o envio de mensagens, escrevi diretamente um controlador para chamar o método de enviar mensagens acessando a interface. Sem mais delongas, adicione o código
pacote wang.raye.rabbitmq.demo1; importar java.util.uuid; importar org.springframework.amqp.rabbit.core.rabbittemplate; importar org.springframework.amqp.rabbit.support.CorrelationData; importar org.springframework.web.bind.annotation.requestmapping; importar org.springframework.web.bind.annotation.restcontroller;/** * Teste o controlador para rabbitmq para enviar mensagens * @author raye * */ @RestControllerpublic Class sendcontroller Rabbitmplate.ConfirmCallback {privatebbitMplate rabbittLate; /*** Configure o Rabbittemplate para enviar mensagens. Por ser um construtor, a primavera será injetada automaticamente sem anotação (deve ser um recurso da nova versão) * @param rabbittemplate */ public sendcontroller (rabitemplate rabbittemplate) {this.rabbittemplate = rabitemplate; // Defina o retorno de chamada de consumo this.rabbittemplate.setConfirmCallback (this); } / ** * Envie uma mensagem para a fila da mensagem 1 * @param msg * @return * / @requestMapping ("send1") public string send1 (string msg) {string uuid = uuid.randomuuid (). Tostring (); CorrelationData correspondênciaDID = new CorrelationData (UUID); rabbittemplate.convertandsend (rabbitmqconfig.exchange, rabbitmqconfig.routingKey1, msg, correspondência); retornar nulo; } / ** * Envie uma mensagem para a fila da mensagem 2 * @param msg * @return * / @requestMapping ("send2") public string send2 (string msg) {string uuid = uuid.randomuuid (). Tostring (); CorrelationData correlacionamento = new CorrelationData (UUID); rabbittemplate.convertandsend (rabbitmqconfig.exchange, rabbitmqconfig.routingKey2, msg, correlação); retornar nulo; } / *** Retorno de chamada de mensagem, implementando principalmente a interface Rabbittemplate.ConfirmCallback* Observe que os retornos de chamada da mensagem podem representar apenas mensagens bem -sucedidas enviadas ao servidor RabbitMQ e não podem representar mensagens bem -sucedidas sendo processadas e aceitas* / public void. if (ack) {System.out.println ("Consumo de mensagem falhou:" + causa + "/n reenvie"); }}}Deve -se notar que os retornos de chamada de mensagem podem representar apenas a mensagem bem -sucedida que está sendo enviada ao servidor RabbitMQ.
Então iniciamos o projeto e visitamos http: // localhost: 8082/send1? Msg = aaaa e você descobrirá que a saída do console é
Mensagem recebida: AAAA
ID do retorno de chamada: correlaçãoData [ID = 37E6E913-835A-4ECA-98D1-807325C5900F]
Consumo bem -sucedido de notícias
Claro que o ID de retorno de chamada pode ser diferente. Se visitarmos http: // localhost: 8082/send2? Msg = bbbb, a saída será
Queue1 Mensagem recebeu: BBBB
ID do retorno: correlaçãoData [id = 0cec7500-3117-4aa2-9ea5-4790879812d4]
Consumo bem -sucedido de notícias
Algumas palavras no final
Como este artigo explica principalmente como integrar o RabbitMQ de zero ao springboot, não há explicação para muitas informações e uso do RabbitMQ. Se você não estiver familiarizado com o próprio RabbitMQ, pode conferir outros artigos sobre o RabbitMQ e anexar a demonstração deste artigo.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.