ОРУ. Как создать синглтон сервис?
Я пытаюсь сделать следующее: у меня есть диспетчер, который будет получать сообщения разных типов и направлять их обработчикам. Диспетчер содержит карту, каждый 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.
См.: Использование Области.