Spring MVC

PokeVote

Dans cette exercice, on va écrire une application Web très simple qui permet de voter pour un pokémon et qui affiche les 10 pokémons qui ont reçu le plus de vote.

Le but de l'exercice est de se focaliser sur les problèmes liés à la concurrence.

Important: Votre application ne connaît pas la liste des noms de pokémons et on peut donc voter pour n'importe qui.

Créez un projet Maven en partant de ce pom.xml.

Vous allez créer une classe Pokemon, PokemonRepository et une classe PokemonService. Pour l'instant, on ne s'intéresse pas aux controlleurs.

La classe PokemonService aura au moins les deux méthodes suivante:

@Service
public class PokemonService {

    public void insertOrIncrementPokemon(String name) {...}
    public long totalCountVote(String name) {...}

}        

La méthode insertOrIncrementPokemon(String name) doit insérer le pokémon s'il n'est pas en base et incrémenter son score. Vous utiliserez des locks pessimistes.

Comment allez-vous gérer le cas où deux visiteurs veulent insérer en même temps pokémon ?

Réaliser les classes demandées.

Vous pouvez tester votre PokemonService avec le CommandLineRunner ci-dessous. Le nombre total de votes devrait être de 10 000.

@Bean
public CommandLineRunner cmd(PokemonService pokemonService){
    return args -> {
        var threads = new ArrayList<Thread>();
        for (int i = 0; i < 100; i++) {
            var thread=new Thread(() -> {
                for (int j = 0; j < 100; j++) {
                    var name = ""+ ThreadLocalRandom.current().nextInt(100);
                        pokemonService.insertOrIncrementPokemon("balbuzar"+name);
                    }
            });
            threads.add(thread);
            thread.start();
        }
        for(var thread : threads){
            thread.join();
        }
        System.out.println(pokemonService.totalCountVote());
    };
}

Réaliser les classes demandées avec des locks optimistes.

Finissez le site.