Как отправить push через o: socket из EJB на клиент? - PullRequest
0 голосов
/ 26 октября 2019

Мне нужна помощь для сотрудничества между @EJB и @ CDI ​​

Привет всем,

Я хотел бы иметь следующий сценарий: 1) В моем приложении создается уведомление (вбаза данных) 2) После этого push-уведомление должно быть отправлено конкретному клиенту 3) В клиенте он обновит конкретную @form со своей страницы ...

Вот мой код:

@Stateless
public class NotificationCreationSendServiceBean implements NotificationCreationSendService {

@Inject
private BeanManager beanManager;

public void createNotification {

// createNotificationInDatabase();
.....

        PushEvent event = new PushEvent("Test");
        beanManager.fireEvent(event);
}
}

Мой компонент JSF:

import static org.omnifaces.util.Messages.addGlobalError;
import static org.omnifaces.util.Messages.addGlobalInfo;

@Named
@ViewScoped
public class NotificationSocket implements Serializable {

    @Inject
    private LoginBean loginBean;

    @Inject
    @Push(channel = "notificationChannel")
    private PushContext push;

    /**
     * Push Notification
     * 
     * @param recipientUser
     */
    public void pushUser(@Observes PushEvent event) {
        Set<Future<Void>> sent = push.send(event.getMessage(), loginBean.getCurrentEmployee().getId());

        if (sent.isEmpty()) {
            addGlobalError("This user does not exist!");
        } else {
            addGlobalInfo("Sent to {0} sockets", sent.size());
        }
    }
}

Здесь страница JSF:

<o:socket channel="notificationChannel"
    user="#{loginBean.currentEmployee.id}" scope="view">
    <f:ajax event="someEvent" listener="#{bean.pushed}" render=":notificationLink" />
</o:socket>

Мой вопрос сейчас: как мой контейнер @EJB, распознаваемый с помощью Socket, является правильным? Где я могу определить название канала в @EJB?

Кто-нибудь может мне помочь, пожалуйста.

1 Ответ

1 голос
/ 27 октября 2019

Как отправить push через o: socket из EJB на клиент?

Этот заголовок странный, поскольку в вашем вопросе уже показан код, который делает именно это.

Как мой контейнер @EJB, распознаваемый с помощью Socket, является правильным? Где я могу определить название канала в @EJB?

Этот конкретный вопрос действительно странный в текущем контексте. Я могу только предположить, что у вас на самом деле есть несколько @Observes PushEvent методов, и что вы на самом деле хотели настроить таргетинг только на конкретный метод, связанный с конкретным @Push каналом. Только в этом контексте этот вопрос может иметь некоторый смысл.

Что ж, для достижения этого есть несколько способов.

  1. Передать его как аргумент / свойствоPushEvent класс:

    beanManager.fireEvent(new PushEvent("notificationChannel", "Test"));
    

    А затем просто проверьте это в вашем методе наблюдателя:

    if ("notificationChannel".equals(event.getChannelName())) {
        // ...
    }
    

    Не стесняйтесь использовать перечисления.


  2. Или создайте определенный класс для каждого конкретного события:

    beanManager.fireEvent(new NotificationEvent("Test"));
    

    И затем просто убедитесь, что вы наблюдаете его только одним методом:

    public void pushUser(@Observes NotificationEvent event) {
        // ...
    }
    

  3. Или создайте @Qualifier для PushEvent:

    @Qualifier
    @Retention(RUNTIME)
    @Target({ FIELD, PARAMETER })
    public @interface Notification {}
    

    Который вы @Inject через Event<T>:

    @Inject @Notification
    private Event<PushEvent> pushEvent;
    
    public void createNotification {
        pushEvent.fire(new PushEvent("Test"));
    }
    

    Итогда просто убедитесь, что вы наблюдаете это только одним методом:

    public void pushUser(@Observes @Notification PushEvent event) {
        // ...
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...