Java Spring несколько узлов класса - PullRequest
0 голосов
/ 14 мая 2018

Я новичок в Spring, и мой вопрос довольно прост, но я не могу найти хорошего ресурса.Я просмотрел примеры для начинающих (например, this , this и еще несколько) и искал ответы в StackOverflow, но я не совсем уверен, что я должен искать.

Позвольте мне объяснить сценарий.Допустим, у меня есть центральный узел (C) и несколько внутренних узлов (I_1, ..., I_n), и этот случай:

I_1  
.
.    ------------------> C
.
I_n

В этом очень простом чертеже я пытаюсь проиллюстрировать, что каждый I_iотправляет что-то C, когда C просит об этом.Вот и все.Теперь я хочу, чтобы у каждого I_i был специальный идентификатор, и они отправляют этот идентификатор на C. Как мне смоделировать это весной?На данный момент у меня есть базовая настройка

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

И у меня есть контроллер

@RestController
public class Controller {

    @RequestMapping(value = "/i1/{id}", method = RequestMethod.GET)
    @ResponseBody
    public String i1(
        @PathVariable("id") String id) {
        return id;
    }
}

Так что, если я запущу этот код и свернусь к http://localhost:port/i1/560, он вернет 560Конечно, я могу создать несколько таких узлов, например, создав JAR-файл и запустив его на разных портах.Проблема в том, что я не могу дать им уникальные идентификаторы.Я имею в виду, они все являются экземплярами приложения.Я хотел бы, чтобы они принадлежали к классу узлов ниже (или к чему-то подобному):

class node{
    private int id;

    public node(int id){
        this.id = id;
    }
}

, чтобы у меня было n внутренних узлов.И тогда я могу открыть терминал и свернуть каждого из них, чтобы получить их удостоверение личности.Надеюсь, я объяснил достаточно хорошо.Вкратце: моя цель состоит в том, чтобы иметь n экземпляров класса узла с уникальным идентификатором.И я хочу свернуть их по отдельности и получить их идентификаторы, например, "curl http://localhost:8081/i1" вернет идентификатор i1, а" curl http://localhost:8082/i2" вернет идентификатор i2 и так далее.Я даже не уверен, какие ключевые слова я должен использовать при поиске.Я пробовал "запускать несколько клиентов / хостов / приложений", но не нашел нужной вещи, поэтому я даже был бы признателен за ответ, содержащий именно это.

Бины

Я прочитал этот пример , который на самом деле не использует контроллер, но использует бины.Я попробовал этот подход, который является своего рода тем, что я хочу сделать, он может создавать несколько узловых объектов, все с уникальным идентификатором.Однако я не уверен, смогу ли я подключить каждый из них к разным узлам и портам.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Итак, я думаю, что ваше основное требование довольно легко выполнить.Но все же есть вопросы, касающиеся индекса ваших узлов I_x.Почему они вообще имеют значение?Если у вас есть порт и идентификатор вашего узла, этого достаточно, чтобы идентифицировать узел.Поэтому я создал ответ со следующими двумя свойствами:

  • порт
  • ID

Следуя вышеупомянутым ограничениям, вы не можете создать Controllerкоторый прослушивает определенное отображение I_x.Но на самом деле это не нужно, как я вижу.

Создайте класс NodeInformation, содержащий значения:

@Getter
@Setter
public class NodeInformation {
    private int port;
    private int id;


    public NodeInformation(int port, int id) {
        this.port = port;
        this.id = id;
    }
}

@Getter и @Setter - это org.projectlombok аннотаций, которые автоматическисоздать сеттер и геттер.

Затем заполните необходимую информацию, проанализировав вашу конфигурацию.Этот конфиг может быть установлен либо:

  • application.properties
  • передача аргументов (-Dnode.port=xy -Dnode.id=myid)

ВНИМАНИЕ: В качестве альтернативы вы можетеиспользуйте свойство штока штока server.port, которое автоматически устанавливает порт.

Итак, заполняя информацию в вас NodeInformation, вы должны использовать @Configuration NodeInformationConfiguration, который строит и возвращает ваш Bean:

@Configuration
public class NodeInformationConfiguration {

    private final int port;
    private final int id;

    public NodeInformationConfiguration(@Value("${node.port}") int port, @Value("${node.id}") int id) {
        this.port = port;
        this.id = id;
    }

    @Bean
    public NodeInformation getNodeInfo() {
        return new NodeInformation(port, id);
    }
}

Итак, в конце вы должны установить свой порт и создать контроллер, который возвращает ваш идентификатор.

Настройка порта

Вы можете установить свой порт с помощью EmbeddedServletContainerCustomizer.Используйте NodeInformation, которую мы ранее создали, автоматически подключив ее к вашему классу PortSetter.

@Component
public class PortSetter {


    private final int port;

    @Autowired
    public PortConfiguration(NodeInformation nodeInformation) {
        this.port = nodeInformation.getPort();
    }

    @Bean
    public EmbeddedServletContainerCustomizer containerCustomizer() {
        return (container -> {
            container.setPort(port);
        });
    }
}

И, наконец, создайте простой RestController, который возвращает ваш набор идентификаторов, прослушивая /id:

@RestController
public class NodeController {

    private final NodeInformation nodeInformation;

    @Autowired
    public NodeController(NodeInformation nodeInformation) {
        this.nodeInformation = nodeInformation;
    }

    @RequestMapping("/id")
    public int getNodeId() {
        return this.nodeInformation.getId();
    }
}
0 голосов
/ 14 мая 2018

Ваша настройка с одним узлом и одним контроллером в одном приложении с одним портом проста, но, вероятно, вызовет проблемы с памятью на этом пути.Вам, вероятно, нужно одно приложение, которое запускает ноды-потоки, каждый из которых принимает порт.

Если принять ваш вопрос за чистую монету, проще всего было бы создать компоненты компонентов, использующие @Scope «prototype» (чтобы они не были одиночками).если вы добавите еще один позже), тогда @Autowire один к вашему контроллеру, затем используйте UUID для идентификатора, чтобы он всегда был уникальным, и просто установите его при создании узла:

private UUID id = UUID.randomUUID();

с помощью геттера.Затем контроллер может получить идентификатор из своего собственного узла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...