如何通过 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
通道关联的特定方法。只有在这种情况下,这个问题才有意义。
好吧,为了实现这一点,有几种方法。
将其作为 PushEvent
的 argument/property 传递 class:
beanManager.fireEvent(new PushEvent("notificationChannel", "Test"));
然后在您的观察者方法中检查一下:
if ("notificationChannel".equals(event.getChannelName())) {
// ...
}
请随意使用枚举。
或者,为每个特定事件创建一个特定的 class:
beanManager.fireEvent(new NotificationEvent("Test"));
然后确保只用一种方法观察它:
public void pushUser(@Observes NotificationEvent event) {
// ...
}
或者,为 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) {
// ...
}
@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
通道关联的特定方法。只有在这种情况下,这个问题才有意义。
好吧,为了实现这一点,有几种方法。
将其作为
PushEvent
的 argument/property 传递 class:beanManager.fireEvent(new PushEvent("notificationChannel", "Test"));
然后在您的观察者方法中检查一下:
if ("notificationChannel".equals(event.getChannelName())) { // ... }
请随意使用枚举。
或者,为每个特定事件创建一个特定的 class:
beanManager.fireEvent(new NotificationEvent("Test"));
然后确保只用一种方法观察它:
public void pushUser(@Observes NotificationEvent event) { // ... }
或者,为
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) { // ... }