如何通过 o:socket 从 EJB 向客户端发送推送?

How to send push via o:socket from EJB to Client?

@EJB和@CDI的合作需要帮助

大家好,

我想有以下场景: 1)在我的应用程序中创建了一个通知(在数据库中) 2)之后应向特定客户端发送推送通知 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 Bean:

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>

我现在的问题是: 如何使用 Socket 识别我的 @EJB 容器是正确的?我在哪里定义@EJB 中的通道名称?

谁能帮帮我。

How to send push via o:socket from EJB to Client?

这个标题很奇怪,因为你的问题已经显示了完全正确的代码。

How is my @EJB container recognized with Socket is the right one? Where do I define the channel name in @EJB?

这个具体问题在当前语境下真的很奇怪。我只能假设您实际上有多个 @Observes PushEvent 方法,并且您实际上只想针对与特定 @Push 通道关联的特定方法。只有在这种情况下,这个问题才有意义。

好吧,为了实现这一点,有几种方法。

  1. 将其作为 PushEvent 的 argument/property 传递 class:

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

    然后在您的观察者方法中检查一下:

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

    请随意使用枚举。


  2. 或者,为每个特定事件创建一个特定的 class:

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

    然后确保只用一种方法观察它:

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

  3. 或者,为 PushEvent 创建一个 @Qualifier:

    @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) {
        // ...
    }