Configurações persistentes de assinatura do ActiveMQ Ao definir o modo de entrega PERSISTENT para o editor, você pode usar assinaturas persistentes para assinantes, o que garante que o programa Pub/Sub receba todas as mensagens publicadas. As assinaturas de mensagens são divididas em assinaturas não duráveis e assinaturas duradouras, e assinaturas não duráveis só podem receber mensagens enviadas a um tópico quando o cliente está ativo, ou seja, quando o cliente está offline, mensagens enviadas ao tema durante esse período serão perdidas e nunca recebidas. Quando o cliente está offline, o ActiveMQ salva todas as mensagens enviadas ao sujeito de acordo com seu ID, e quando o cliente se conecta novamente ao ActiveMQ, recebe todas as mensagens enviadas ao sujeito quando estiver offline. Assinaturas persistentes aumentam a sobrecarga e têm apenas um usuário ativo em uma assinatura persistente por vez. Passos para estabelecer uma assinatura persistente: 1. Configurar um ID de cliente para a conexão; 2. Especifique um nome de assinatura para o tema da assinatura; A combinação acima deve ser única. O código implementa assinaturas persistentes
(1) Ao usar fila, ou seja, ao entrar na fila, há apenas um consumidor por mensagem, então a persistência é muito simples, basta salvar no banco de dados
。 Depois, qualquer consumidor pode pegá-lo e descartá-lo. Não importa se o consumidor desliga por um tempo.
(2) Ao usar o tópico, ou seja, ao se inscrever, cada mensagem pode ter múltiplos consumidores, o que é mais problemático.
Primeiro, assumindo que os consumidores são consumidores comuns, ------------------------ Após o lançamento do <1> activemq, a News 1 foi lançada, mas infelizmente, nenhum consumidor está começando agora, ou seja, nenhum consumidor assinou. Então
, a notícia foi abandonada.
<2> O Consumidor 1 iniciou, conectou ao activemq, assinou e esperou uma mensagem~~
ActiveMQ posta a mensagem 2, OK, o consumidor 1 recebe e processa. Abandono da mensagem.
<3> O Consumer 2 também foi lançado, conectado ao activemq, assinado e aguardando uma mensagem~~
ActiveMQ publica a mensagem 3, OK, consumidor 1, consumidor 2 são todos recebidos e processados. Abandono da mensagem.
<4> Consumidor 1 está desligado.
Activemq posta a mensagem 4, OK, consumidor 2 recebe e processa. Abandono da mensagem.
<5> Consumidor 1 começou novamente.
O activemq publica as mensagens 5, OK, Consumidor 1 e Consumidor 2 que recebem e processam. Abandono da mensagem. ----------------------------- Para resumir: O Activemq simplesmente envia mensagens para o consumidor atualmente lançado. Consumidores que desligarem vão perder muitas mensagens e não conseguirão recebê-las novamente.
Se a mensagem enviada for um dado importante de sincronização do usuário e não o conseguir, os dados do usuário não são sincronizados.
Então, como fazer com que os consumidores recebam mensagens perdidas quando reiniciam?
A resposta é uma assinatura persistente. -----------------------------
Assinaturas comuns, sem distinção entre consumidores, se houver algumas pessoas no local, jogam alguns pãezinhos no vapor. Para assinaturas persistentes, você precisa registrar o nome do consumidor. Zhang San disse: Eu sou Zhang San, tem pãezinhos no vapor para mim, vou voltar para buscá-los. Li Si disse: Eu sou Li Si, tem pãezinhos no vapor para mim, vou voltar para buscá-los. activemq anotou os nomes de Zhang San e Li Si.
Então, ao dividir pãezinhos no vapor, uma cabeça ainda dá um pão cozido no vapor. Depois da divisão, quando viu que Zhang San não falava, significava que ele não estava lá, então deixe-o um. Li Si falou, então não havia necessidade de ficar.
Zhang San voltou, procurou o Activemq e deu uma olhada, esse não é Zhang San, traga os pãezinhos no vapor dele rápido. Pode ser um pão cozido no vapor, ou pode ser 100 pãezinhos cozidos no vapor, depende de quantos pães Zhang San dividiu desde que saiu por um tempo.
activemq distingue consumidores por clienteID e nome do assinante. ----------------------------- Crie uma conexão conexão = conexãoFábrica.criarConexão(); connection.setClientID("bbb"); Assinaturas persistentes exigem a configuração disso. conexão.start();
Crie uma sessão Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Criar um destino Tema tópico = sessão.createTopic("userSyncTopic"); Nome do tema
MensagemConsumidor = sessão.criarConsumidor(tópico); Assinatura regular MessageConsumer consumer = session.createDurableSubscriber(topic,"bbb"); Assinaturas persistentes
Outro ponto é que o produtor da mensagem usa o modo persistente ao enviar mensagens MensagemProdutor produtor = ...; producer.setDeliveryMode(DeliveryMode.PERSISTENT); Se não, ela é persistente por padrão
(5) Se o mesmo "clienteID" for usado, ele é considerado o mesmo consumidor. Se dois programas usarem o mesmo "clientID", apenas um pode se conectar ao activemq ao mesmo tempo, e a segunda conexão reportará um erro.
(6) As configurações do activemq estão em conf/activemq.xml, e as mensagens padrão são salvas em data/kahadb, e as mensagens não serão perdidas ao reiniciar o activemq.
Você pode acessar http://localhost:8161/admin/index.jsp: ver informações sobre filas atuais, tópicos e assinantes persistentes, enviar mensagens e muito mais.
Você pode copiar o conteúdo do activemq-jdbc.xml e modificá-lo, e salvar a mensagem em outros bancos de dados. |