编程知识 cdmana.com

Disruptor note 6: scénario commun, tutoriel Java de l'introduction à la maîtrise du PDF Baidu Cloud

  • Le code ci - dessus comporte les points suivants à noter:
  1. Pour réécrire le parentinitMéthodes,Principalement l'InstanciationDisruptorQuand,Deux paramètres supplémentaires sont passés:ProducerType.MULTIIndique que le type de production est multiproducteur,BlockingWaitStrategyC'est la stratégie d'attente,Quand nous n'avons pas passé ce paramètre dans le Code précédent,Par défautBlockingWaitStrategy

  2. initLa méthode exécute égalementsetProducer2Méthodes,Définir les variables des membresproducer2

  3. RéécriturepublishWithProducer2Méthodes,Appeler la variable membreproducer2Publier l'événement

  4. RéécrituredisruptorOperateMéthodes,Il y a deux consommateurs indépendants

  • La façon dont le code ci - dessus est vérifié est toujours un test à l'unit é,Ouvre.ConsumeModeServiceTest.java,Ajouter le code suivant,Vous pouvez voir que les deux nouveaux Threads exécutent l'opération publier l'événement en même temps:

@Autowired

@Qualifier(“multiProducerService”)

ConsumeModeService multiProducerService;

@Test

public void testMultiProducerService() throws InterruptedException {

log.info(“start testMultiProducerService”);

CountDownLatch countDownLatch = new CountDownLatch(1);

// Deux producteurs,Chaque production100Événements,Au total, 200 événements ont été produits

// Deux consommateurs indépendants,Consommation par personne200Événements,Donc la consommation totale400Événements

int expectEventCount = EVENT_COUNT*4;

// Dis - le.service,Attendre la consommation400Message (s),ExécutioncountDownLatch.countDownMéthodes

multiProducerService.setCountDown(countDownLatch, expectEventCount);

// Démarrer un thread,Produire des événements avec le premier producteur

new Thread(() -> {

for(int i=0;i<EVENT_COUNT;i++) {

log.info(“publich {}”, i);

multiProducerService.publish(String.valueOf(i));

}

}).start();

// Démarrer un autre thread,Produire des événements avec un deuxième producteur

new Thread(() -> {

for(int i=0;i<EVENT_COUNT;i++) {

log.info(“publishWithProducer2 {}”, i);

try {

multiProducerService.publishWithProducer2(String.valueOf(i));

} catch (Exception e) {

e.printStackTrace();

}

}

}).start();

// Le thread actuel commence à attendre,Devantservice.setCountDownLa méthode a été décriteservice,

// Attendre la consommationexpectEventCountMessage (s),ExécutioncountDownLatch.countDownMéthodes

// Attention!,Pour appelerawaitMéthodes,Au lieu dewaitMéthodes!

countDownLatch.await();

// Le nombre total d'événements consommés devrait être égal au nombre d'événements publiés

assertEquals(expectEventCount, multiProducerService.eventCount());

}

  • Les résultats des essais sont les suivants:,Test réussi,Conforme aux attentes:

disruptorNote 6:Scénario commun,javaLes tutoriels vont de l'initiation à la maîtrisepdfBaidu Cloud_Interview

 C1、C2Consommation indépendante,C3DépendanceC1EtC2

  • Le diagramme logique est le suivant::

disruptorNote 6:Scénario commun,javaLes tutoriels vont de l'initiation à la maîtrisepdfBaidu Cloud_Java_02

  • Le Code d'implémentation est le suivant,C'est très simple.,Les dépendances utilisentthenC'est fait.:

package com.bolingcavalry.service.impl;

import com.bolingcavalry.service.ConsumeModeService;

import com.bolingcavalry.service.MailEventHandler;

import com.bolingcavalry.service.MailWorkHandler;

import com.bolingcavalry.service.SmsEventHandler;

import org.springframework.stereotype.Service;

@Service(“scene5”)

public class Scene5 extends ConsumeModeService {

@Override

protected void disruptorOperate() {

MailEventHandler c1 = new MailEventHandler(eventCountPrinter);

MailEventHandler c2 = new MailEventHandler(eventCountPrinter);

MailEventHandler c3 = new MailEventHandler(eventCountPrinter);

disruptor

// C1、C2Consommation indépendante

.handleEventsWith(c1, c2)

// C3DépendanceC1EtC2

.then(c3);

}

}

  • Code d'essai de l'unit é:

@Autowired

@Qualifier(“scene5”)

Scene5 scene5;

@Test

public void testScene5 () throws InterruptedException {

log.info(“start testScene5”);

testConsumeModeService(scene5,

EVENT_COUNT,

// Trois consommateurs indépendants,Consommation totale300Événements

EVENT_COUNT * 3);

}

  • Pour économiser de l'espace,Les résultats des tests ne seront pas affichés,Notez que,Chaque événement doit êtreC1EtC2D'abord consommé,Pour êtreC3Consommation;

 C1Consommation indépendante,C2EtC3Et consommer indépendamment,Mais dépendantC1,C4DépendanceC2EtC3

  • Le diagramme logique est le suivant::

disruptorNote 6:Scénario commun,javaLes tutoriels vont de l'initiation à la maîtrisepdfBaidu Cloud_Java_03

  • Le Code d'implémentation est le suivant:

package com.bolingcavalry.service.impl;

import com.bolingcavalry.service.ConsumeModeService;

import com.bolingcavalry.service.MailEventHandler;

import org.springframework.stereotype.Service;

@Service(“scene6”)

public class Scene6 extends ConsumeModeService {

@Override

protected void disruptorOperate() {

MailEventHandler c1 = new MailEventHandler(eventCountPrinter);

MailEventHandler c2 = new MailEventHandler(eventCountPrinter);

MailEventHandler c3 = new MailEventHandler(eventCountPrinter);

MailEventHandler c4 = new MailEventHandler(eventCountPrinter);

disruptor

// C1

.handleEventsWith(c1)

// C2EtC3Et consommer indépendamment

.then(c2, c3)

// C4DépendanceC2EtC3

.then(c4);

}

}

  • Code d'essai de l'unit é:

@Autowired

@Qualifier(“scene6”)

Scene6 scene6;

@Test

public void testScene6 () throws InterruptedException {

log.info(“start testScene6”);

testConsumeModeService(scene6,

EVENT_COUNT,

// Quatre consommateurs indépendants,Consommation totale400Événements

EVENT_COUNT * 4);

}

 C1EtC2Consommation indépendante,C3EtC4C'est aussi une consommation indépendante,Mais...C3EtC4Tous dépendantsC1EtC2,Et puisC5DépendanceC3EtC4

  • Le diagramme logique est le suivant::

disruptorNote 6:Scénario commun,javaLes tutoriels vont de l'initiation à la maîtrisepdfBaidu Cloud_Interview_04

  • Le Code d'implémentation est le suivant:

package com.bolingcavalry.service.impl;

import com.bolingcavalry.service.ConsumeModeService;

import com.bolingcavalry.service.MailEventHandler;

import org.springframework.stereotype.Service;

@Service(“scene7”)

public class Scene7 extends ConsumeModeService {

@Override

protected void disruptorOperate() {

MailEventHandler c1 = new MailEventHandler(eventCountPrinter);

MailEventHandler c2 = new MailEventHandler(eventCountPrinter);

MailEventHandler c3 = new MailEventHandler(eventCountPrinter);

MailEventHandler c4 = new MailEventHandler(eventCountPrinter);

MailEventHandler c5 = new MailEventHandler(eventCountPrinter);

disruptor

// C1EtC2Consommation indépendante

.handleEventsWith(c1, c2)

// C3EtC4C'est aussi une consommation indépendante,Mais...C3EtC4Tous dépendantsC1EtC2

.then(c3, c4)

// Et puisC5DépendanceC3EtC4

.then(c5);

}

}

  • Code d'essai de l'unit é:

@Autowired

@Qualifier(“scene7”)

Scene7 scene7;

@Test

public void testScene7 () throws InterruptedException {

log.info(“start testScene7”);

testConsumeModeService(scene7,

EVENT_COUNT,

// Cinq consommateurs indépendants,Consommation totale500Événements

EVENT_COUNT * 5);

}

 C1EtC2Consommation commune,C3EtC4C'est aussiConsommation commune,Mais...C3EtC4Tous dépendantsC1EtC2,Et puisC5DépendanceC3EtC4

  • Le diagramme logique est le suivant::

disruptorNote 6:Scénario commun,javaLes tutoriels vont de l'initiation à la maîtrisepdfBaidu Cloud_Interview_05

  • Le Code d'implémentation est le suivant:

package com.bolingcavalry.service.impl;

import com.bolingcavalry.service.ConsumeModeService;

import com.bolingcavalry.service.MailEventHandler;

import com.bolingcavalry.service.MailWorkHandler;

import org.springframework.stereotype.Service;

/**

  • @author will ( zq2599@gmail.com)

  • @version 1.0

  • @description: C1EtC2Consommation commune,C3EtC4C'est aussi la consommation commune,Mais...C3EtC4Tous dépendantsC1EtC2,Et puisC5DépendanceC3EtC4

  • @date 2021/5/23 11:05

*/

@Service(“scene8”)

public class Scene8 extends ConsumeModeService {

@Override

protected void disruptorOperate() {

MailWorkHandler c1 = new MailWorkHandler(eventCountPrinter);

MailWorkHandler c2 = new MailWorkHandler(eventCountPrinter);

MailWorkHandler c3 = new MailWorkHandler(eventCountPrinter);

MailWorkHandler c4 = new MailWorkHandler(eventCountPrinter);

MailWorkHandler c5 = new MailWorkHandler(eventCountPrinter);

disruptor

// C1EtC2Consommation commune

.handleEventsWithWorkerPool(c1, c2)

// C3EtC4C'est aussi une consommation indépendante,Mais...C3EtC4Tous dépendantsC1EtC2

.thenHandleEventsWithWorkerPool(c3, c4)

// Et puisC5DépendanceC3EtC4

.thenHandleEventsWithWorkerPool(c5);

}

}

  • Code d'essai de l'unit é:

@Autowired

@Qualifier(“scene8”)

Scene8 scene8;

@Test

public void testScene8 () throws InterruptedException {

log.info(“start testScene8”);

testConsumeModeService(scene8,

EVENT_COUNT,

// C1EtC2Consommation commune,C3EtC4Consommation commune,C5Même si ce n'est qu'un,Mais c'est aussi un modèle de consommation commune,

// C'est - à - dire qu'il y a trois groupes de consommateurs,Donc la consommation totale300Événements

EVENT_COUNT * 3);

}

 C1EtC2Consommation commune,C3EtC4Consommation indépendante,Mais...C3EtC4Tous dépendantsC1EtC2,Et puisC5DépendanceC3EtC4

  • Le diagramme logique est le suivant::

disruptorNote 6:Scénario commun,javaLes tutoriels vont de l'initiation à la maîtrisepdfBaidu Cloud_Interview_06

  • Le Code d'implémentation est le suivant:

package com.bolingcavalry.service.impl;

import com.bolingcavalry.service.ConsumeModeService;

import com.bolingcavalry.service.MailEventHandler;

import com.bolingcavalry.service.MailWorkHandler;

import org.springframework.stereotype.Service;

@Service(“scene9”)

public class Scene9 extends ConsumeModeService {

@Override

protected void disruptorOperate() {

MailWorkHandler c1 = new MailWorkHandler(eventCountPrinter);

MailWorkHandler c2 = new MailWorkHandler(eventCountPrinter);

MailEventHandler c3 = new MailEventHandler(eventCountPrinter);

MailEventHandler c4 = new MailEventHandler(eventCountPrinter);

MailEventHandler c5 = new MailEventHandler(eventCountPrinter);

disruptor

// C1EtC2Consommation commune

.handleEventsWithWorkerPool(c1, c2)

// C3EtC4Consommation indépendante,Mais...C3EtC4Tous dépendantsC1EtC2

.then(c3, c4)

// Et puisC5DépendanceC3EtC4

.then(c5);

}

}

  • Code d'essai de l'unit é:

@Autowired

@Qualifier(“scene9”)

Scene9 scene9;

@Test

public void testScene9 () throws InterruptedException {

log.info(“start testScene9”);

testConsumeModeService(scene9,

EVENT_COUNT,

// C1EtC2Consommation commune(100Événements),

// C3EtC4Consommation indépendante(200Événements),

// C5Consommation indépendante(100Événements),

// Donc la consommation totale400Événements

EVENT_COUNT * 4);

}

 C1EtC2Consommation indépendante,C3EtC4- Oui.Consommation commune,Mais...C3EtC4Tous dépendantsC1EtC2,Et puisC5DépendanceC3EtC4

  • Le diagramme logique est le suivant::

disruptorNote 6:Scénario commun,javaLes tutoriels vont de l'initiation à la maîtrisepdfBaidu Cloud_Java_07

  • Le Code d'implémentation est le suivant:

package com.bolingcavalry.service.impl;

import com.bolingcavalry.service.ConsumeModeService;

import com.bolingcavalry.service.MailEventHandler;

import com.bolingcavalry.service.MailWorkHandler;

import org.springframework.stereotype.Service;

@Service(“scene10”)

public class Scene10 extends ConsumeModeService {

@Override

protected void disruptorOperate() {

MailEventHandler c1 = new MailEventHandler(eventCountPrinter);

MailEventHandler c2 = new MailEventHandler(eventCountPrinter);

MailWorkHandler c3 = new MailWorkHandler(eventCountPrinter);

MailWorkHandler c4 = new MailWorkHandler(eventCountPrinter);

MailEventHandler c5 = new MailEventHandler(eventCountPrinter);

disruptor

// C1EtC2Consommation commune

.handleEventsWith(c1, c2)

// C3EtC4 C'est la consommation commune. ,Mais...C3EtC4Tous dépendantsC1EtC2

.thenHandleEventsWithWorkerPool(c3, c4)

// Et puisC5DépendanceC3EtC4

.then(c5);

}

}

  • Code d'essai de l'unit é:

@Test

public void testScene10 () throws InterruptedException {

log.info(“start testScene10”);

testConsumeModeService(scene10,

Résumé

Cet article va de la base au niveau avancé au combat réel,De peu en profondeur,Prends ça.MySQLC'est très clair.,C'est clair.,C'est ce que j'ai vu de mieux jusqu'à présent.MySQLNotes d'étude,Je crois que si vous lisez attentivement cette note,,Qu'il s'agisse d'un problème au travail ou d'une question posée par un intervieweur, il est facile de le résoudre.!

MySQL50Tri des questions d'entrevue à haute fréquence:

disruptorNote 6:Scénario commun,javaLes tutoriels vont de l'initiation à la maîtrisepdfBaidu Cloud_Java_08

**Cet article a été publié par[C

《Grandes usines de première ligneJavaAnalyse des questions d'entrevue+Notes d'apprentissage pour le développement de l'arrière - plan+La dernière vidéo d'architecture+Document d'information sur le code source du projet en direct》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 Partage open source du contenu complet

ODINGProjet Open Source:【Grandes usines de première ligneJavaAnalyse des questions d'entrevue+Résumé de base notes d'étude+Dernière vidéo d'explication+Code source du projet opérationnel】]( )Inclus**

版权声明
本文为[Harmonios Learning]所创,转载请带上原文链接,感谢
https://cdmana.com/2021/11/20211125173308755t.html

Scroll to Top