PrimeFaces подталкивает OmniFaces подталкивать вопросы миграции - PullRequest
0 голосов
/ 02 июля 2018

Поскольку прайм PrimeFaces будет прекращен, я начал переход на пуш OmniFaces. В целях уведомления все работает как положено, но в моем приложении есть чат, где я пропускаю две вещи в OmniFaces:

1) Смена пользователя сокета по требованию. Я требую это для частных разговоров. В PrimeFaces я создаю канал для каждого разговора на основе идентификатора зарегистрированных пользователей и передаю его методу connect их компонента сокета. С помощью OmniFaces я попытался поместить компонент сокета в выходную панель PrimeFaces, связать свойство пользователя с bean-объектом области видимости, обновить панель по запросу ajax и по событию oncomplete, вызвав OmniFaces.Push.open ('channelName'), но В классе SocketObserver (из витрины) я вижу, что пользователь не был обновлен. В качестве обходного пути я создал канал, используя зарегистрированный идентификатор пользователя в качестве пользователя, и если кто-то, отличный от человека, с которым он разговаривает в данный момент, отправляет сообщение, я игнорирую его при обратном вызове JavaScript, а не добавляю его.

2) Когда я не указываю пользователя в PushContext.send, мне бы хотелось, чтобы сообщение было отправлено всем, кто подключен к каналу, аналогично "/ channel / *" в PrimeFaces. Мое требование заключается в том, чтобы обновить список отключенных онлайн / пользователей от этого приложения чата. В качестве обходного пути я мог бы создать отдельный канал для этих уведомлений, но, поскольку приложение не требует, чтобы это работало, я предпочел сначала проверить здесь.

Я добавлю код, если это необходимо, но сначала я хотел бы проверить, присутствуют ли эти концепции в OmniFaces push.

Спасибо

Ответы [ 2 ]

0 голосов
/ 28 июля 2018

Действительно было невозможно изменить значение <o:socket user="#{...}">, оставаясь в том же представлении JSF (обновления ajax и т. Д.). Что касается выпуска 472 , то оно было улучшено в OmniFaces 3.2-SNAPSHOT.

Любое динамическое изменение значения <o:socket user="#{...}"> во время любого запроса Ajax в том же представлении JSF теперь будет отражаться в поведении push.

Другими словами, теперь возможна конструкция ниже:

<h:form>
    <h:selectOneMenu value="#{bean.chat}">
        <f:selectItems value="#{bean.chats}" />
        <f:ajax render="@form" />
    <h:selectOneMenu>

    ...

    <o:socket channel="chat" user="#{bean.chat.id}" />
</h:form>
0 голосов
/ 02 июля 2018

Если вы начнете использовать user атрибут o:socket, как в примере

<o:socket channel="sess" scope="session" user="#{pushTestUser}" />

1) кажется возможным при использовании «идентификатора пользователя», как это видно на витрине

С http://showcase.omnifaces.org/push/socket:

@Inject @Push
private PushContext someChannel;

public void sendMessage(Object message, User recipientUser) {
    Long recipientUserId = recipientUser.getId();
    someChannel.send(message, recipientUserId);
}

В этом примере передайте User, который является «примером» объекта, который может быть вашим или каким-либо другим. В витрине пользователю передается привязка идентификатора к полю ввода, но это может быть сделано и на стороне сервера. До вас

2) кажется возможным при отправке сообщений на общий канал или даже группы, как можно увидеть в http://showcase.omnifaces.org/push/socket.

@Inject @Push
private PushContext someChannel;

public void sendMessage(Object message, Group recipientGroup) {
    Collection<Long> recipientUserIds = recipientGroup.getUserIds();
    someChannel.send(message, recipientUserIds);
}

Группа представляет собой пример объекта, который может быть вашим собственным, его можно передать из «внешнего интерфейса» или просто прочитать где-нибудь в бэкэнде. Он просто должен содержать идентификаторы пользователей (могут быть сопоставлены направляющие, не обязательно должны быть внутренние идентификаторы пользователей), которые подписаны на канал. Все это только примеры методов.

Так что, на мой взгляд, оба варианта возможны.

...