Netty - исключение пустого указателя группы sendAsync () - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь отправить сообщения между двумя процессами в Java, используя Atomix и Netty .У меня есть программа с именем Starter, которая отвечает за отправку сообщения всем запущенным процессам, ожидающим этого сообщения.

Это Starter:

Address[] network = {
            Address.from("localhost:23450"),
            Address.from("localhost:23451"),
            Address.from("localhost:23452"),
            Address.from("localhost:23453")
    };

    Serializer s = new SerializerBuilder().build();

    ExecutorService es = Executors.newSingleThreadExecutor();

    ManagedMessagingService ms = NettyMessagingService.builder()
            .withAddress(Address.from("localhost:23459"))
            .build();

    ms.registerHandler("start", (o,m)->{
        System.out.println("Hello "+s.decode(m)+" from "+o);
    }, es);

    ms.sendAsync(Address.from("localhost:23459"), "start", s.encode("start"));

    for (int i = 0; i < network.length; i++) {
        ms.sendAsync(network[i], "start", s.encode("start"));
    }

Это процесс:

Address[] network = {
        Address.from("localhost:23450"),
        Address.from("localhost:23451"),
        Address.from("localhost:23452"),
        Address.from("localhost:23453")
    };

    int id = Integer.parseInt(args[0]);

    Serializer s = new SerializerBuilder().addType(Msg.class).build();

    ManagedMessagingService ms = NettyMessagingService.builder()
                    .withAddress(network[id])
                    .build();

    ExecutorService es = Executors.newSingleThreadExecutor();
    ExecutorService es2 = Executors.newSingleThreadExecutor();

    ms.registerHandler("leader", (o,m) -> {
        int i = s.decode(m);

        if(leader < i){
            leader = i;
            System.out.println("Leader updated to: " + i);
        }
        else{
            System.out.println("Received: " + i + ". Not updated.");
        }
    }, es);

    ms.registerHandler("start", (o,m) -> {
        for(int i=0; i < network.length ; i++ ){
            ms.sendAsync(network[i],"leader", s.encode(id));
        }
        System.out.println("Started");
    },es2);

Каждый из запущенных процессов имеет идентификатор (передается в качестве аргумента).Адреса известны.

У меня две проблемы.

Первая - это то, что ожидающие процессы завершаются.

Вторая, Starter не может отправлять сообщения другим процессам.Я получаю:

Exception in thread "main" java.lang.NullPointerException: group

Что я делаю не так?Стоит ли менять подход к проблеме?

1 Ответ

0 голосов
/ 29 октября 2018

Я решил проблему, добавив ms.start(); в оба файла.Окончательный результат:

ManagedMessagingService ms = NettyMessagingService.builder()
                .withAddress(network[id])
                .build();

//(...)
ms.start();

ms.registerHandler("leader", (o,m) -> {
    //...
});
...