Migrar aplicativos Java Message Service (JMS) 2.0 existentes do Apache ActiveMQ para o Barramento de Serviço do Azure

Este artigo discute como modificar um aplicativo Java Message Service (JMS) 2.0 existente que interage com um agente JMS para que passe a interagir com o Barramento de Serviço do Azure em vez disso. Em particular, o artigo aborda a migração do Apache ActiveMQ ou do Amazon MQ.

O Barramento de Serviço do Azure dá suporte a cargas de trabalho de Java 2 Platform, Enterprise Edition e Spring que usam a API do JMS 2.0 no Advanced Message Queueing Protocol (AMQP).

Antes de começar

Diferenças entre o Barramento de Serviço do Azure e o Apache ActiveMQ

O Barramento de Serviço do Azure e o Apache ActiveMQ são agentes de mensagens, que funcionam como provedores JMS para que os aplicativos cliente enviem e recebam mensagens. Ambos habilitam a semântica ponto a ponto com filas e semântica de publicação/assinatura com tópicos e assinaturas.

Mesmo assim, há algumas diferenças entre os dois, como mostra a tabela a seguir:

Category ActiveMQ Barramento de Serviço do Azure
Camada de aplicativo Monolítico clusterizado Duas camadas
(gateway + back-end)
Suporte a protocolo
  • AMQP
  • STOMP
  • OpenWire
AMQP
Modo de provisionamento
  • IaaS (Infraestrutura como serviço), local
  • Amazon MQ (plataforma como serviço gerenciada)
Plataforma como serviço gerenciada (PaaS)
Tamanho da mensagem Configurável pelo cliente 100 MB (camada Premium)
Alta disponibilidade Gerenciado pelo cliente Gerenciada pela plataforma
Recuperação de desastre Gerenciado pelo cliente Gerenciada pela plataforma

Recursos atuais com e sem suporte

A tabela a seguir lista os recursos do JMS (Java Message Service) que o Barramento de Serviço do Azure suporta atualmente. Ele também mostra recursos sem suporte.

Recurso API Status
Filas
  • JMSContext.createQueue( String queueName)
Com suporte
Tópicos
  • JMSContext.createTopic( String topicName)
Com suporte
Filas temporárias
  • JMSContext.createTemporaryQueue()
Com suporte
Tópicos temporários
  • JMSContext.createTemporaryTopic()
Com suporte
Produtor de mensagem/
JMSProducer
  • JMSContext.createProducer()
Com suporte
Navegadores de fila
  • JMSContext.createBrowser(Queue queue)
  • JMSContext.createBrowser(Queue queue, String messageSelector)
Com suporte
Consumidor de mensagens/
JMSConsumer
  • JMSContext.createConsumer( Destination destination)
  • JMSContext.createConsumer( Destination destination, String messageSelector)
  • JMSContext.createConsumer( Destination destination, String messageSelector, boolean noLocal)

No momento, não há suporte para o noLocal
Com suporte
Assinaturas duráveis compartilhadas
  • JMSContext.createSharedDurableConsumer(Topic topic, String name)
  • JMSContext.createSharedDurableConsumer(Topic topic, String name, String messageSelector)
Com suporte
Assinaturas duráveis não compartilhadas
  • JMSContext.createDurableConsumer(Topic topic, String name)
  • createDurableConsumer(Topic topic, String name, String messageSelector, boolean noLocal)

noLocal não tem suporte no momento e deve ser definido como false
Com suporte
Assinaturas não duráveis compartilhadas
  • JMSContext.createSharedConsumer(Topic topic, String sharedSubscriptionName)
  • JMSContext.createSharedConsumer(Topic topic, String sharedSubscriptionName, String messageSelector)
Com suporte
Assinaturas não duráveis não compartilhadas
  • JMSContext.createConsumer(Destination destination)
  • JMSContext.createConsumer( Destination destination, String messageSelector)
  • JMSContext.createConsumer( Destination destination, String messageSelector, boolean noLocal)

noLocal não tem suporte no momento e deve ser definido como false
Com suporte
Seletores de mensagens depende do consumidor criado Com suporte
Atraso de entrega (mensagens agendadas)
  • JMSProducer.setDeliveryDelay( longo deliveryDelay)
Com suporte
Mensagem criada
  • JMSContext.createMessage()
  • JMSContext.createBytesMessage()
  • JMSContext.createMapMessage()
  • JMSContext.createObjectMessage( Serializable object)
  • JMSContext.createStreamMessage()
  • JMSContext.createTextMessage()
  • JMSContext.createTextMessage( String text)
Com suporte
Transações entre entidades
  • Connection.createSession(true, Session.SESSION_TRANSACTED)
Com suporte
Transações distribuídas Sem suporte

Considerações

A natureza de duas camadas do Barramento de Serviço do Azure proporciona vários recursos de continuidade de negócios (alta disponibilidade e recuperação de desastre). No entanto, há algumas considerações quando você está usando recursos JMS.

Atualizações de serviço

No caso de atualizações e reinicializações do barramento de serviço, as filas ou os tópicos temporários são excluídos. Se o aplicativo for sensível à perda de dados em filas ou tópicos temporários, não use filas nem tópicos temporários. Em vez disso, use filas, tópicos e assinaturas duráveis.

Migração de dados

Como parte da migração e modificação dos aplicativos cliente para interagir com o Barramento de Serviço do Azure, os dados mantidos no ActiveMQ não são migrados para o Barramento de Serviço. Talvez seja necessário um aplicativo personalizado para esvaziar as filas, os tópicos e as assinaturas do ActiveMQ e, em seguida, reproduzir as mensagens para as filas, os tópicos e as assinaturas do Barramento de Serviço.

Autenticação e autorização

O controle de acesso baseado em função (RBAC) do Azure, com suporte do Microsoft Entra ID, é o mecanismo de autenticação preferencial para o Barramento de Serviço. Para habilitar o controle de acesso baseado em função, siga as etapas no guia do desenvolvedor do Barramento de Serviço do Azure JMS 2.0.

Pré-migração

Verificação de versão

Os seguintes componentes e versões são usados ao gravar os aplicativos JMS:

Componente Versão
API do Java Message Service (JMS) 1.1 ou mais recente
Protocolo AMQP 1.0

Verifique se as portas AMQP estão abertas

O Barramento de Serviço dá suporte à comunicação por meio do protocolo AMQP. Para essa finalidade, habilite a comunicação pelas portas 5671 (AMQP) e 443 (TCP). Dependendo de onde os aplicativos cliente estejam hospedados, talvez seja necessário um tíquete de suporte para permitir a comunicação por essas portas.

Importante

O Barramento de Serviço dá suporte apenas ao protocolo AMQP 1.0.

Definir as configurações corporativas

O Barramento de Serviço habilita vários recursos de segurança e alta disponibilidade corporativos. Para obter mais informações, consulte:

Monitoramento, alertas e rastreamento

Para cada namespace do Barramento de Serviço, são publicadas métricas no Azure Monitor. Você pode usar essas métricas para alertas e dimensionamento dinâmico de recursos alocados para o namespace.

Para obter mais informações sobre as diferentes métricas e como configurar alertas nelas, veja Métricas do Barramento de Serviço no Azure Monitor. Você também pode saber mais sobre o rastreamento do lado do cliente para operações de dados e o log operacional/de diagnóstico para operações de gerenciamento.

Métricas – New Relic

Você pode correlacionar métricas do mapa do ActiveMQ com métricas no Barramento de Serviço do Azure. Veja o seguinte no site do New Relic:

Observação

Atualmente, o New Relic não tem integração direta e contínua com o ActiveMQ, mas tem métricas disponíveis para o Amazon MQ. Como o Amazon MQ é derivado do ActiveMQ, a tabela a seguir mapeia as métricas do New Relic do Amazon MQ para o Barramento de Serviço do Azure.

Agrupamento de métricas Métrica do Amazon MQ/ActiveMQ Métrica do Barramento de Serviço do Azure
Agente CpuUtilization CPUXNS
Agente MemoryUsage WSXNS
Agente CurrentConnectionsCount activeConnections
Agente EstablishedConnectionsCount activeConnections + connectionsClosed
Agente InactiveDurableTopicSubscribersCount Usar métricas de assinatura
Agente TotalMessageCount Usar nível de fila/tópico/assinatura activeMessages
Fila/tópico EnqueueCount incomingMessages
Fila/tópico DequeueCount outgoingMessages
Fila QueueSize sizeBytes

Migração

Para migrar o aplicativo JMS 2.0 existente para interagir com o Barramento de Serviço, siga as etapas nas várias seções a seguir.

Exportar a topologia do ActiveMQ e criar as entidades no Barramento de Serviço (opcional)

Para garantir que os aplicativos cliente possam se conectar continuamente com o Barramento de Serviço, migre a topologia (incluindo filas, tópicos e assinaturas) do Apache ActiveMQ para o Barramento de Serviço.

Observação

Para aplicativos JMS, são criados tópicos, filas e assinaturas como uma operação de tempo de execução. A maioria dos provedores JMS (agentes de mensagem) oferece a capacidade de criá-los no tempo de execução. É por isso que essa etapa de exportação é considerada opcional. Para garantir que o aplicativo tenha as permissões para criar a topologia no tempo de execução, use a cadeia de conexão com permissões Manage de SAS.

Para fazer isso:

  1. Use as ferramentas de linha de comando do ActiveMQ para exportar a topologia.
  2. Recrie a mesma topologia usando ummodelo do Azure Resource Manager.
  3. Execute o modelo do Azure Resource Manager.

Importar a dependência do Maven para implementação JMS do Barramento de Serviço

Para garantir a conectividade contínua com o Barramento de Serviço, adicione o pacote azure-servicebus-jms como uma dependência ao arquivo pom.xml do Maven, da seguinte maneira:

<dependencies>
...
    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-servicebus-jms</artifactId>
    </dependency>
...
</dependencies>

Alterações da configuração do servidor de aplicativos

Esta parte é personalizada para o servidor de aplicativos que está hospedando os aplicativos cliente que se conectam ao ActiveMQ.

Aplicativos Spring

Atualize o arquivo application.properties

Se você estiver usando um aplicativo de inicialização Spring para se conectar ao ActiveMQ, será aconselhável remover as propriedades específicas do ActiveMQ do arquivo application.properties.

spring.activemq.broker-url=<ACTIVEMQ BROKER URL>
spring.activemq.user=<ACTIVEMQ USERNAME>
spring.activemq.password=<ACTIVEMQ PASSWORD>

Em seguida, adicione as propriedades específicas do Barramento de Serviço ao arquivo application.properties.

azure.servicebus.connection-string=Endpoint=myEndpoint;SharedAccessKeyName=mySharedAccessKeyName;SharedAccessKey=mySharedAccessKey
Substitua ActiveMQConnectionFactory por ServiceBusJmsConnectionFactory

A próxima etapa é substituir a instância de ActiveMQConnectionFactory por ServiceBusJmsConnectionFactory.

Observação

As alterações de código reais são específicas ao aplicativo e a como as dependências são gerenciadas, mas o exemplo a seguir fornece a orientação sobre o que deve ser alterado.

Anteriormente, você pode ter criado uma instância de um objeto de ActiveMQConnectionFactory, da seguinte maneira:


String BROKER_URL = "<URL of the hosted ActiveMQ broker>";
ConnectionFactory factory = new ActiveMQConnectionFactory(BROKER_URL);

Connection connection = factory.createConnection();
connection.start();

Agora, você está alterando isso para criar uma instância de um objeto de ServiceBusJmsConnectionFactory, da seguinte maneira:


ServiceBusJmsConnectionFactorySettings settings = new ServiceBusJmsConnectionFactorySettings();
String SERVICE_BUS_CONNECTION_STRING = "<Service Bus Connection string>";

ConnectionFactory factory = new ServiceBusJmsConnectionFactory(SERVICE_BUS_CONNECTION_STRING, settings);

Connection connection = factory.createConnection();
connection.start();

Pós-migração

Agora que você modificou o aplicativo para começar a enviar e receber mensagens do Barramento de Serviço, você deve verificar se ele funciona conforme o esperado. Quando isso tiver sido feito, você poderá continuar refinando e modernizando a pilha de aplicativos.

Próximas etapas

Use o Iniciador do Spring Boot para o JMS do Barramento de Serviço do Azure para obter integração contínua com o Barramento de Serviço.

Para saber mais sobre o JMS e as mensagens do Barramento de Serviço, veja: