Envie e receba mensagens com o ApsaraMQ for RocketMQ usando o Apache RocketMQ Java SDK. Esta página aborda tanto o SDK do protocolo gRPC (rocketmq-client-java) quanto o SDK do protocolo Remoting (rocketmq-client).
Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância do ApsaraMQ for RocketMQ com tópicos e group IDs criados no console do ApsaraMQ for RocketMQ
O endpoint da instância (por exemplo,
rmq-cn-XXXX.rmq.aliyuncs.com:8080)A dependência necessária do SDK adicionada ao seu projeto. Para detalhes sobre versões, consulte o Guia de versões
Se você utilizar uma instância Serverless, verifique os requisitos de versão do SDK para acesso via rede pública antes de prosseguir.
SDK do protocolo gRPC
O SDK rocketmq-client-java se comunica pelo protocolo gRPC. As tabelas a seguir listam códigos de exemplo para cada tipo de mensagem, hospedados no repositório de clientes do Apache RocketMQ.
Para integração com Spring Boot, consulte rocketmq-v5-client-spring-boot-samples.
Ao enviar mensagens transacionais com o SDK do protocolo gRPC, defina um tópico ao iniciar o producer. Sem um tópico, as verificações de transação sofrem atraso. Se a mensagem não for enviada dentro de quatro horas, a mensagem de meia transação poderá ser descartada.
Enviar mensagens
|
Tipo de mensagem |
Código de exemplo |
|
Mensagem normal (síncrona) |
|
|
Mensagem normal (assíncrona) |
|
|
Mensagem ordenada |
|
|
Mensagem agendada ou atrasada |
|
|
Mensagem transacional |
|
|
Mensagem leve |
Consumir mensagens
|
Tipo de consumer |
Código de exemplo |
|
Push consumer |
|
|
Simple consumer (síncrono) |
|
|
Simple consumer (assíncrono) |
|
|
Lightweight push consumer |
Para mais informações sobre push consumers e simple consumers, consulte Tipos de consumer.
SDK do protocolo Remoting
O SDK rocketmq-client se comunica pelo protocolo Remoting. Esta seção fornece código inline para cada tipo de mensagem.
Para integração com Spring Boot, consulte rocketmq-spring-boot-samples.
Configuração comum
Todos os exemplos do protocolo Remoting compartilham a mesma configuração de autenticação e conexão. Revise esta seção primeiro e depois consulte o código específico para cada tipo de mensagem abaixo.
Autenticação
A forma de inicializar o producer ou consumer depende do método de acesso:
-
Endpoint público -- Passe um
RPCHookcom o nome de usuário e a senha da instância: Obtenha o nome de usuário e a senha da instância na aba Intelligent Identity Recognition do console Resource Access Management. Não utilize o AccessKey ID e o AccessKey secret da sua conta Alibaba Cloud.private static RPCHook getAclRPCHook() { return new AclClientRPCHook(new SessionCredentials("<instance-username>", "<instance-password>")); } // Pass the RPCHook when creating the producer DefaultMQProducer producer = new DefaultMQProducer(getAclRPCHook()); -
Endpoint da VPC -- Nenhum
RPCHooké necessário. O servidor autentica com base na VPC:DefaultMQProducer producer = new DefaultMQProducer(); Instância Serverless -- Passe um
RPCHookpara acesso via rede pública. Se o acesso sem senha pela rede interna estiver ativado, nenhumRPCHookserá necessário.
Conexão
// Group ID created in the ApsaraMQ for RocketMQ console
producer.setProducerGroup("<your-group-id>");
// Endpoint from the ApsaraMQ for RocketMQ console
// Use the domain name and port as shown. Do not add http:// or https://.
// Do not use a resolved IP address.
producer.setNamesrvAddr("<your-access-point>");
Rastreamento de mensagens (opcional)
Para ativar o rastreamento de mensagens em nuvem, defina o canal de acesso e habilite os rastreamentos:
producer.setAccessChannel(AccessChannel.CLOUD);
// Required for SDK v5.3.0 and later, in addition to setAccessChannel
producer.setEnableTrace(true);
Referência de placeholders
Substitua os placeholders a seguir pelos seus valores reais:
|
Placeholder |
Descrição |
Exemplo |
|
|
Nome de usuário da instância obtido no console |
-- |
|
|
Senha da instância obtida no console |
-- |
|
|
Group ID criado no console |
GID_example |
|
|
Endpoint obtido no console |
rmq-cn-XXXX.rmq.aliyuncs.com:8080 |
|
|
Tópico criado no console |
topic_example |
|
|
Tópico para mensagens ordenadas |
order_topic_example |
|
|
Tópico para mensagens transacionais |
transaction_topic_example |
|
|
Group ID dedicado para mensagens transacionais |
GID_transaction_example |
|
|
Tag de mensagem para filtragem |
TagA |
Mensagens normais
Mensagens normais são adequadas para a maioria dos casos de uso que não exigem garantias de ordenação ou transação.
Mensagens ordenadas
Mensagens ordenadas garantem entrega FIFO dentro da mesma chave de sharding. Utilize-as para cenários como processamento sequencial de eventos ou sincronização de dados em tempo real.
Mensagens agendadas e atrasadas
Mensagens agendadas são entregues em um horário específico. Mensagens atrasadas são entregues após um atraso configurável. Ambas utilizam a propriedade de usuário __STARTDELIVERTIME.
Consumir mensagens agendadas e atrasadas
Consuma mensagens agendadas e atrasadas da mesma forma que as mensagens normais. Nenhuma configuração adicional é necessária.
Mensagens transacionais
Mensagens transacionais utilizam um protocolo de commit em duas fases. O producer envia uma mensagem de meia transação, executa uma transação local e então faz o commit ou rollback. O broker verifica periodicamente transações não confirmadas chamando checkLocalTransaction.
O group ID para mensagens transacionais não pode ser compartilhado com outros tipos de mensagem. Crie um group ID dedicado para producers transacionais.
Consumir mensagens transacionais
Consuma mensagens transacionais da mesma forma que as mensagens normais. Nenhuma configuração adicional é necessária.
Acesso via rede pública em instância Serverless
Para acessar uma instância Serverless pela rede pública, seu SDK deve atender a um requisito de versão mínima. Adicione a configuração de namespace mostrada abaixo.
Substitua InstanceId pelo ID real da sua instância.
SDK do protocolo Remoting (rocketmq-client >= 5.2.0)
Adicione o namespace ao producer ou consumer:
// Producer
producer.setNamespaceV2("InstanceId");
// Consumer
consumer.setNamespaceV2("InstanceId");
SDK do protocolo gRPC (rocketmq-client-java >= 5.0.6)
Defina o namespace na ClientConfiguration:
ClientConfiguration clientConfiguration = ClientConfiguration.newBuilder()
.setEndpoints(endpoints)
.setNamespace("InstanceId")
.setCredentialProvider(sessionCredentialsProvider)
.build();