Ho provato a implementare il sistema di notifica di base per un social network base con p:poll
sul livello di visualizzazione e una semplice classe NotificationService
che ottiene le nuove notifiche dal DB e aggiorna l'elenco di notifiche di NotificationBean
che è viewcoped per ogni utente. Flusso di processo simile a questo:Sistema di notifica con p: poll/push
-Poll calls NotificationBean.getNewNotifications for example every 15 sec.
--getNewNotifications calls NotificationService and DAO methods
---notificationList of user is refreshed
----DataTable on view layer shows new notifications
Ma la preoccupazione di p:poll
è di circa la sua prestazione perché invia una query ad ogni scadenza dell'intervallo.
PrimeFaces ha PrimePush basato su Atmosphere Framework, apre socket Web e sembra più adatto alla creazione di un sistema di notifiche.
Ma non so quali componenti e quali proprietà debbano essere utilizzate. Ha il componente p:socket
con la proprietà channel
. Devo usare nomi utente come valori channel
? Qui di seguito il codice proveniente da primefaces vetrina e riassume le ultime frasi:
<p:socket onMessage="handleMessage" channel="/notifications" />
Per quanto ho capito da questa this showcase examplep:socket
ascolta notifications
canale. E il codice pusher frammento è:
PushContext pushContext = PushContextFactory.getDefault().getPushContext();
pushContext.push("/notifications", new FacesMessage(summary, detail));
Ma questo informerà tutte le pagine utente, ho bisogno di una spinta che notifica utente specifico. Diciamo che ci sono 2 utenti e supponiamo che Utente1 aggiunga Utente2 come amico. Ci deve essere sth. così:
pushContext.push("User2/notifications", new FacesMessage("friendship request", "from User1"));
Ma non sono sicuro che questo sia l'uso corretto per questo tipo di requisito funzionale o meno. Considerando la scalabilità dell'app possono esserci costi costosi per l'apertura di così tanti canali per un processo.
Grazie per l'aiuto.
Si desidera che un utente invii un messaggio immediato ad un altro utente? –
@RongNK che dipende da come si capisce 'messaggio'. Nella domanda, ho menzionato gli elenchi che includono le notifiche. Se user1 aggiunge user2 come amico o commenta il suo stato, una notifica dovrebbe essere aggiunta all'elenco di notifica di user2 che può essere una semplice lista di stringhe o un elenco di classi di modelli che è più appropriato per la mia implementazione. Quindi sì, deve essere immediato. –
(scusate il mio inglese) ok, penso che non vogliate usare il sondaggio, quindi il server trasmetterà il massaggio e ogni client verrà filtrato, o il server deve memorizzare l'indirizzo del cliente e inviarlo a un indirizzo specifico, che penso. Lascia che un professionista risolva il tuo problema :) –