ОРУ. Как создать синглтон сервис?

Я пытаюсь сделать следующее: у меня есть диспетчер, который будет получать сообщения разных типов и направлять их обработчикам. Диспетчер содержит карту, каждый MessageHandler может обрабатывать сообщения своего типа, и каждый обработчик должен зарегистрироваться в диспетчере.

Итак, у меня есть служба "Диспетчер", которая реализует интерфейс:

public interface Dispatcher{
   public void register(IMessageHandler handler);
   public void handle(IMessage message);
}

и несколько бинов, которые реализуют интерфейс IMessageHandler:

public interface IMessageHandler{
   public void handle(IMessage message);
}

IMessage также является интерфейсом.

Мне нужны эти экземпляры IMessageHandler для вызова метода "register" в Dispatcher, чтобы зарегистрировать себя, чтобы диспетчер мог распространять сообщения соответствующим обработчикам.

Сейчас я делаю следующее:

@Service(IMessageHandler.class)
public class MessageBHandler implements IMessageHandler {

    @Inject
    @Reference
    Dispatcher dispatcher;

  @PostConstruct
  public void registerMyself(){
     dispatcher.register(this);
  }
...

}

Но я вижу в журналах, что Dispatcher получает дважды. Как я могу сделать его синглтоном?

1 ответ

Если вы не укажете область действия своей реализации Dispacher, по умолчанию используется область @Dependent. Это означает, что для каждого MessageHandler будет отдельный экземпляр Dispacher.

Попробуйте установить область вашей реализации Dispacher на @ApplicationScoped.

См.: Использование Области.

Другие вопросы по тегам