Guia do desenvolvedor do Azure Service Bus JMS 2.0

Este guia contém informações detalhadas para ajudá-lo a ter sucesso na comunicação com o Barramento de Serviço do Azure usando a API do Java Message Service (JMS) 2.0.

Como desenvolvedor Java, se você é novo no Barramento de Serviço do Azure, considere ler os seguintes artigos.

Introdução Conceitos

Modelo de programação Java Message Service (JMS)

O modelo de programação da API do Java Message Service é conforme mostrado nas seguintes seções:

Nota

A camada Premium do Barramento de Serviço do Azure suporta JMS 1.1 e JMS 2.0.

O Barramento de Serviço do Azure - A camada Standard suporta a funcionalidade limitada do JMS 1.1. Para obter mais detalhes, consulte esta documentação.

JMS - Blocos de construção

Os blocos de construção abaixo estão disponíveis para comunicação com o aplicativo JMS.

Nota

O guia abaixo foi adaptado do Oracle Java EE 6 Tutorial for Java Message Service (JMS)

Recomenda-se consultar este tutorial para uma melhor compreensão do Java Message Service (JMS).

Fábrica de conexões

O objeto de fábrica de conexão é usado pelo cliente para se conectar com o provedor JMS. A fábrica de conexões encapsula um conjunto de parâmetros de configuração de conexão que são definidos pelo administrador.

Cada fábrica de conexões é uma instância de ConnectionFactory, QueueConnectionFactoryou TopicConnectionFactory interface.

Para simplificar a conexão com o Barramento de Serviço do Azure, essas interfaces são implementadas por meio do ServiceBusJmsConnectionFactory, ServiceBusJmsQueueConnectionFactoryou ServiceBusJmsTopicConnectionFactory respectivamente.

Importante

Os aplicativos Java que utilizam a API JMS 2.0 podem se conectar ao Barramento de Serviço do Azure usando a cadeia de conexão ou usando um TokenCredential para aproveitar a autenticação apoiada pelo Microsoft Entra. Ao usar a autenticação com backup do Microsoft Entra, certifique-se de atribuir funções e permissões à identidade conforme necessário.

Crie uma identidade gerenciada atribuída ao sistema no Azure e use essa identidade para criar um TokenCredentialarquivo .

TokenCredential tokenCredential = new DefaultAzureCredentialBuilder().build();

A fábrica do Connection pode então ser instanciada com os parâmetros abaixo.

  • Credencial de token - Representa uma credencial capaz de fornecer um token OAuth.
  • Host - o nome do host do namespace da camada Premium do Barramento de Serviço do Azure.
  • Saco de propriedades ServiceBusJmsConnectionFactorySettings, que contém
    • connectionIdleTimeoutMS - tempo limite de conexão ociosa em milissegundos.
    • traceFrames - sinalizador booleano para coletar quadros de rastreamento AMQP para depuração.
    • Outros parâmetros de configuração

A fábrica pode ser criada como mostrado aqui. A credencial de token e o host são parâmetros necessários, mas as outras propriedades são opcionais.

String host = "<YourNamespaceName>.servicebus.windows.net";
ConnectionFactory factory = new ServiceBusJmsConnectionFactory(tokenCredential, host, null); 

Destino JMS

Um destino é o objeto que um cliente usa para especificar o destino das mensagens que produz e a origem das mensagens que consome.

Destinos mapeados para entidades no Barramento de Serviço do Azure - filas (em cenários ponto a ponto) e tópicos (em cenários pub-sub).

Ligações

Uma conexão encapsula uma conexão virtual com um provedor JMS. Com o Barramento de Serviço do Azure, ele representa uma conexão com monitoração de estado entre o aplicativo e o Barramento de Serviço do Azure sobre AMQP.

Uma conexão é criada a partir da fábrica de conexões, conforme mostrado no exemplo a seguir:

Connection connection = factory.createConnection();

Sessões

Uma sessão é um contexto de thread único para produzir e consumir mensagens. Ele pode ser utilizado para criar mensagens, produtores de mensagens e consumidores, mas também fornece um contexto transacional para permitir o agrupamento de envios e recebimentos em uma unidade atômica de trabalho.

Uma sessão pode ser criada a partir do objeto de conexão, conforme mostrado no exemplo a seguir:

Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);

Nota

A API JMS não suporta o recebimento de mensagens de filas de barramento de serviço ou tópicos com sessões de mensagens habilitadas.

Modos de sessão

Uma sessão pode ser criada com qualquer um dos modos abaixo.

Modos de sessão Comportamento
Session.AUTO_ACKNOWLEDGE A sessão confirma automaticamente o recebimento de uma mensagem por um cliente quando a sessão retornou com êxito de uma chamada para receber ou quando o ouvinte de mensagens que a sessão chamou para processar a mensagem retorna com êxito.
Session.CLIENT_ACKNOWLEDGE O cliente reconhece uma mensagem consumida chamando o método de reconhecimento da mensagem.
Session.DUPS_OK_ACKNOWLEDGE Este modo de confirmação instrui a sessão a reconhecer preguiçosamente a entrega de mensagens.
Session.SESSION_TRANSACTED Esse valor pode ser passado como argumento para o método createSession(int sessionMode) no objeto Connection para especificar que a sessão deve usar uma transação local.

Quando o modo de sessão não é especificado, o Session.AUTO_ACKNOWLEDGE é escolhido por padrão.

JMSContext

Nota

JMSContext é definido como parte da especificação JMS 2.0.

JMSContext combina a funcionalidade fornecida pelo objeto de conexão e sessão. Ele pode ser criado a partir do objeto de fábrica de conexão.

JMSContext context = connectionFactory.createContext();

Modos JMSContext

Assim como o objeto Session , o JMSContext pode ser criado com os mesmos modos de reconhecimento mencionados nos modos Session.

JMSContext context = connectionFactory.createContext(JMSContext.AUTO_ACKNOWLEDGE);

Quando o modo não é especificado, o JMSContext.AUTO_ACKNOWLEDGE é escolhido por padrão.

Produtores de mensagens JMS

Um produtor de mensagens é um objeto que é criado usando um JMSContext ou uma sessão e usado para enviar mensagens para um destino.

Ele pode ser criado como um objeto autônomo, conforme mostrado no exemplo a seguir:

JMSProducer producer = context.createProducer();

Ou criado em tempo de execução quando uma mensagem precisa ser enviada.

context.createProducer().send(destination, message);

Consumidores de mensagens JMS

Um consumidor de mensagem é um objeto criado por um JMSContext ou uma Sessão e usado para receber mensagens enviadas para um destino. Ele pode ser criado como mostrado neste exemplo:

JMSConsumer consumer = context.createConsumer(dest);

Recebimento síncrono via método receive()

O consumidor de mensagens fornece uma maneira síncrona de receber mensagens do destino por meio do receive() método.

Se nenhum argumento/tempo limite for especificado ou um tempo limite de '0' for especificado, o consumidor bloqueará indefinidamente, a menos que a mensagem chegue ou a conexão seja interrompida (o que ocorrer primeiro).

Message m = consumer.receive();
Message m = consumer.receive(0);

Quando um argumento positivo diferente de zero é fornecido, o consumidor bloqueia até que o temporizador expire.

Message m = consumer.receive(1000); // time out after one second.

Recebe assíncrono com ouvintes de mensagens JMS

Um ouvinte de mensagens é um objeto usado para manipulação assíncrona de mensagens em um destino. Ele implementa a MessageListener interface, que contém o onMessage método onde a lógica de negócios específica deve viver.

Um objeto de ouvinte de mensagens deve ser instanciado e registrado em relação a um consumidor de mensagem específico usando o setMessageListener método.

Listener myListener = new Listener();
consumer.setMessageListener(myListener);

Consumir a partir de tópicos

Os Consumidores de Mensagens JMS são criados em relação a um destino, que pode ser uma fila ou um tópico.

Os consumidores em filas são simplesmente objetos do lado do cliente que vivem no contexto da Sessão (e Conexão) entre o aplicativo cliente e o Barramento de Serviço do Azure.

Os consumidores sobre temas, no entanto, têm 2 partes -

  • Um objeto do lado do cliente que vive no contexto da sessão (ou JMSContext) e,
  • Uma assinatura que é uma entidade no Barramento de Serviço do Azure.

As subscrições estão documentadas aqui e podem ser uma das seguintes:

  • Subscrições duradouras partilhadas
  • Subscrições partilhadas não duráveis
  • Subscrições duradouras não partilhadas
  • Subscrições não partilhadas não duradouras

Navegadores de fila JMS

A API JMS fornece um QueueBrowser objeto que permite que o aplicativo procure as mensagens na fila e exiba os valores de cabeçalho para cada mensagem.

Um navegador de fila pode ser criado usando o JMSContext como no exemplo a seguir:

QueueBrowser browser = context.createBrowser(queue);

Nota

A API JMS não fornece uma API para navegar em um tópico.

Isso ocorre porque o tópico em si não armazena as mensagens. Assim que a mensagem é enviada para o tópico, ela é encaminhada para as assinaturas apropriadas.

Seletores de mensagens JMS

Os seletores de mensagens podem ser usados recebendo aplicativos para filtrar as mensagens recebidas. Com seletores de mensagens, o aplicativo de recebimento descarrega o trabalho de filtragem de mensagens para o provedor JMS (neste caso, o Barramento de Serviço do Azure) em vez de assumir essa responsabilidade em si.

Os seletores podem ser utilizados ao criar qualquer um dos consumidores abaixo -

  • Subscrição duradoura partilhada
  • Subscrição duradoura não partilhada
  • Subscrição partilhada não durável
  • Subscrição não partilhada não duradoura
  • Navegador de filas

Disposição AMQP e mapeamento da operação do Service Bus

Veja como uma disposição AMQP se traduz em uma operação do Service Bus:

ACCEPTED = 1; -> Complete()
REJECTED = 2; -> DeadLetter()
RELEASED = 3; (just unlock the message in service bus, will then get redelivered)
MODIFIED_FAILED = 4; -> Abandon() which increases delivery count
MODIFIED_FAILED_UNDELIVERABLE = 5; -> Defer()

Resumo

Este guia do desenvolvedor mostrou como os aplicativos cliente Java que usam o Java Message Service (JMS) podem se conectar ao Barramento de Serviço do Azure.

Próximos passos

Para obter mais informações sobre o Barramento de Serviço do Azure e detalhes sobre entidades Java Message Service (JMS), consulte os seguintes artigos: