Compartilhar via


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 Azure Service Bus suporta cargas de trabalho do Java 2 Platform, Enterprise Edition e Spring que utilizam a API JMS 2.0 sobre o Protocolo Avançado de Enfileiramento de Mensagens (AMQP).

Antes de começar

Diferenças entre o Azure Service Bus e o Apache ActiveMQ

Azure Service Bus e Apache ActiveMQ são corretores de mensagens, atuando como provedores JMS para aplicativos cliente enviarem e receberem 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:

Categoria ActiveMQ Barramento de Serviço do Azure
Camada de aplicativo Monólito clusterizado Duas camadas
(gateway + back-end)
Suporte a protocolo
  • AMQP
  • PISOTEAR
  • OpenWire
AMQP
Modo de provisionamento
  • IaaS (infraestrutura como serviço), local
  • Amazon MQ (plataforma gerenciada como serviço)
PaaS (plataforma gerenciada como serviço)
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.

Característica API (Interface de Programação de Aplicativos) Situação
Filas
  • JMSContext.createQueue( String queueName)
Suportado
Tópicos
  • JMSContext.createTopic( String topicName)
Suportado
Filas temporárias
  • JMSContext.createTemporaryQueue()
Suportado
Tópicos temporários
  • JMSContext.createTemporaryTopic()
Suportado
Produtor de mensagem/
JMSProducer
  • JMSContext.createProducer()
Suportado
Navegadores de fila
  • JMSContext.createBrowser(Fila)
  • JMSContext.createBrowser(Fila, String messageSelector)
Suportado
Consumidor de mensagens/
JMSConsumer
  • JMSContext.createConsumer( Destino)
  • JMSContext.createConsumer( Destino de destino, String messageSelector)
  • JMSContext.createConsumer( Destino de destino, String messageSelector, boolean noLocal)

No momento, não há suporte para o noLocal
Suportado
Assinaturas duráveis compartilhadas
  • JMSContext.createSharedDurableConsumer(Tópico, nome da cadeia de caracteres)
  • JMSContext.createSharedDurableConsumer(Tópico, nome da cadeia de caracteres, string messageSelector)
Suportado
Assinaturas duráveis não compartilhadas
  • JMSContext.createDurableConsumer(Tópico, nome da cadeia de caracteres)
  • createDurableConsumer(Tópico, Nome da cadeia de caracteres, string messageSelector, boolean noLocal)

noLocal não tem suporte no momento e deve ser definido como false
Suportado
Assinaturas não duráveis compartilhadas
  • JMSContext.createSharedConsumer(Tópico, String sharedSubscriptionName)
  • JMSContext.createSharedConsumer(Tópico, String sharedSubscriptionName, String messageSelector)
Suportado
Assinaturas não duráveis não compartilhadas
  • JMSContext.createConsumer(Destino)
  • JMSContext.createConsumer( Destino de destino, String messageSelector)
  • JMSContext.createConsumer( Destino de destino, String messageSelector, boolean noLocal)

noLocal não tem suporte no momento e deve ser definido como false
Suportado
Seletores de mensagens Depende do consumidor criado. Os seletores do Barramento de Serviço não dão suporte a palavras-chave SQL "LIKE" e "BETWEEN". Suportado
Atraso de entrega (mensagens agendadas)
  • JMSProducer.setDeliveryDelay( longo deliveryDelay)
Suportado
Mensagem criada
  • JMSContext.createMessage()
  • JMSContext.createBytesMessage()
  • JMSContext.createMapMessage()
  • JMSContext.createObjectMessage( objeto serializável)
  • JMSContext.createStreamMessage()
  • JMSContext.createTextMessage()
  • JMSContext.createTextMessage( Texto da cadeia de caracteres)
Suportado
Transações entre entidades
  • Connection.createSession(true, Session.SESSION_TRANSACTED)
Suportado
Transações distribuídas Sem suporte

Considerações

A natureza em duas camadas do Azure Service Bus garante diversas capacidades de continuidade de negócios, incluindo alta disponibilidade e recuperação de desastres. No entanto, há algumas considerações ao usar recursos do 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 ou 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 de seus 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ções, 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

Você usa os seguintes componentes e versões enquanto escreve os aplicativos JMS:

Componente Versão
API do Java Message Service (JMS) 1.1 ou superior
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

Service Bus oferece suporte somente ao protocolo AMQP 1.0.

Configurar 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 Service Bus, você envia 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 em relação a elas, consulte as 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 – Nova Relíquia

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

Observação

Atualmente, o New Relic não tem uma integração direta e perfeita com o ActiveMQ, mas eles têm 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 Azure Service Bus
Corretor CpuUtilization CPUXNS
Corretor MemoryUsage WSXNS
Corretor CurrentConnectionsCount activeConnections
Corretor EstablishedConnectionsCount activeConnections + connectionsClosed
Corretor InactiveDurableTopicSubscribersCount Usar métricas de assinatura
Corretor 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 seu aplicativo JMS 2.0 existente para interagir com o Service Bus, siga as etapas nas 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 perfeitamente ao 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, você cria filas, tópicos e assinaturas como uma operação de runtime. A maioria dos provedores de JMS (agentes de mensagens) oferece a capacidade de criá-los em runtime. É por isso que essa etapa de exportação é considerada opcional. Para garantir que seu aplicativo tenha as permissões para criar a topologia em runtime, use a cadeia de conexão com permissões SAS Manage .

Para fazer isso:

  1. Use as ferramentas de linha de comando do ActiveMQ para exportar a topologia.
  2. Crie novamente a mesma topologia usando um modelo 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 perfeita e contínua com o Service Bus, adicione o azure-servicebus-jms como pacote de dependência ao arquivo Maven pom.xml, da seguinte maneira:

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

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

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

Aplicativos Spring

Atualizar o application.properties arquivo

Se você estiver usando um aplicativo Spring boot para se conectar ao ActiveMQ, você deseja remover as propriedades específicas do ActiveMQ do application.properties arquivo.

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 para o aplicativo e como as dependências são gerenciadas, mas o exemplo a seguir fornece as diretrizes sobre o que deve ser alterado.

Anteriormente, você poderia ter instanciado 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 instanciar 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 Bus de Serviços, você deve verificar se ele funciona conforme o esperado. Quando isso for concluído, você poderá continuar a refinar e modernizar ainda mais o stack de aplicações.

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: