Fonctions avancées d'ActiveMQ Livraison asynchrone et rappel du signe de confirmation

Livraison asynchrone et rappel de réception de confirmation

  • ActiveMQ prend en charge les modes d'envoi synchrone et asynchrone pour envoyer des messages au courtier. Le choix du mode a un impact énorme sur le délai d'envoi. Le taux de sortie que le producteur peut atteindre (taux de rendement = données totales envoyées / temps) est principalement affecté par le délai de transmission. L'utilisation de la transmission asynchrone peut améliorer considérablement les performances de la transmission.
  •     ActiveMQ utilise le mode d'envoi asynchrone par défaut: sauf si vous spécifiez explicitement l'utilisation de l'envoi synchrone ou l'envoi de messages persistants sans utiliser de transactions, les deux cas sont envoyés de manière synchrone.
  •     Si vous n'utilisez pas de transactions et que vous envoyez des messages persistants, chaque envoi est envoyé de manière synchrone et bloquera le producteur jusqu'à ce que le courtier renvoie un accusé de réception, indiquant que le message a été conservé en toute sécurité sur le disque. Le mécanisme de confirmation fournit une garantie pour la sécurité des messages, mais en même temps, il bloquera le client et causera beaucoup de retard.
  •     De nombreuses applications hautes performances permettent une petite quantité de perte de données en cas de panne. Si votre application répond à cette fonctionnalité, vous pouvez utiliser l'envoi asynchrone pour augmenter la productivité, même si vous envoyez des messages persistants.

    La livraison asynchrone peut maximiser l'efficacité de l'envoi du côté producteur. Nous utilisons généralement l'envoi asynchrone lorsque le volume d'envoi de messages est relativement intense, ce qui peut grandement améliorer les performances du producteur;

    Cependant, cela entraîne également des problèmes supplémentaires, c'est-à-dire qu'il doit consommer plus de mémoire côté client et entraîne également une augmentation de la consommation de performances côté courtier; en outre, il ne peut pas garantir efficacement que le message est envoyé avec succès.

  Dans le cas de useAsyncSend = true , le client doit tolérer la possibilité de perte de message.

 

Comment confirmer le succès de la transmission asynchrone?

   Le scénario d'envoi asynchrone d'un message perdu est le suivant: le producteur définit UseAsyncSend = true et utilise Producer.send (msg) pour envoyer le message

    Étant donné que le message n'est pas bloqué, le producteur pensera que tous les messages envoyés ont été correctement envoyés à MQ. Si MQ tombe soudainement en panne, tous les messages qui n'ont pas été envoyés à MQ dans la mémoire du producteur seront perdus.

    Par conséquent, la méthode asynchrone correcte doit recevoir des rappels

    C'est la différence entre l'envoi synchrone et l'envoi asynchrone. L'envoi synchrone et les autres envois ne sont pas bloqués, ce qui signifie que l'envoi doit être réussi. L'envoi asynchrone doit recevoir un accusé de réception et le client jugera si l'envoi est à nouveau réussi.

Dans les projets non SpringBoot

 //使用连接URI配置异步发送
cf = new ActiveMQConnectionFactory("tcp://locahost:61616?jms.useAsyncSend=true"); 

 

//在ConnectionFactory 级别配置异步发送
((ActiveMQConnectionFactory)connectionFactory).setUseAsyncSend(true);



//在连接级别配置异步发送
((ActiveMQConnection)connection).setUseAsyncSend(true); 

1) Dans le projet SpringBoot:

@Component
public class QueueProducer {

    @Autowired
    private JmsMessagingTemplate template;

    @Autowired
    private Queue queue;

    @Autowired
    private ActiveMQConnection connection;

    /**
     * 消息同步发送: 在消息发送成功到MQ中之前,Producer端一直处于阻塞状态,消息的发送成功与否可从阻塞为阻塞看出
     *         1.强制要求同步发送 2.事务持久化发送时
     * 消息异步发送: 消息发出后,MQ中未收到消息之前宕机了,但Producer没有显示发送成功与否,会认为发送成功
     *        此时,为避免这种情况-->有异步发送的回调机制,发送成功或失败后会给Producer回调结果
     */
    public void produceMessage() {

        //template.getConnectionFactory().createConnection().createSession();
        /*进行复杂应用设置时,可从template中获取connection,进行原始的操作,但此时使用了pool的session缓存spring.jms.cache.enable默认为true,
      返回的Connection为CacheConnectionFactory,无法生成ActiveMQMessageProducer,无法进行send方法的AsyncCallback回调
      ,所以此时需要创建一个ActiveMQMessageConnection的配置类以支持异步的调用并成功回调*/
        try {
            connection.start();
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            ActiveMQMessageProducer producer = (ActiveMQMessageProducer) session.createProducer(queue);
            ObjectMessage message = session.createObjectMessage();
            message.setStringProperty("msgId", "001");
            message.setObject(new User(1, "小明"));

            producer.send(message, new AsyncCallback() {
                @Override
                public void onSuccess() {
                    try {
                        System.out.println("消息发送成功:" + message.getStringProperty("msgId"));
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }

                }

                @Override
                public void onException(JMSException e) {
                    try {
                        System.out.println("出现异常:" + message.getStringProperty("msgId"));
                    } catch (JMSException je) {
                        je.printStackTrace();
                    }
                }
            });
        } catch (JMSException e) {
            e.printStackTrace();
        }
        //template.convertAndSend(queue,"message:"+new Date().toLocaleString());

    }
public class ActiveMQConnectionConfig {
    @Value("${spring.activemq.broker-url}")
    private String brokerUrl;

    @Bean
    public ActiveMQConnection activeMQConnection() throws JMSException {
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(brokerUrl);
        //启用异步发送消息
        activeMQConnectionFactory.setUseAsyncSend(true);
        ActiveMQConnection connection =
                (ActiveMQConnection) activeMQConnectionFactory.createConnection();
        return connection;

 

 

 

 

 

Je suppose que tu aimes

Origine blog.csdn.net/m0_46405589/article/details/115179991
conseillé
Classement