Я новичок в SSE, поэтому решил создать сайт, который работает с SSE. Я использую на стороне клиента angularJS и делаю свои запросы сервера с restAngular. моя сторона сервера написана в java. Я создал уже запросы POST, GET, DELETE, и теперь я хочу добавить SSE. У меня есть массив объектов, которые я получаю с сервера. Когда я добавляю объект на сервер, который он должен сделать POST-вызов, и обновить массив на стороне клиента, поэтому я решил сделать для него SSE, который будет работать каждый раз, когда этот почтовый запрос будет работать.
как добавить SSE?
Я построил службу для остальных функций:
app.factory('restAngularService', function($filter, Restangular, $q) {
var api = Restangular.all('api');
var getCards = api.one('get');
var deferred = $q.defer();
return {
getCards: function() {
var Cards = [];
if (getCards.get()) {
getCards.getList().then(function(b) {
Cards = b.plain();
deferred.resolve(Cards);
});
} else {
deferred.resolve([{}]);
}
return deferred.promise;
},
delCard : function(id){
var delCard = api.one('delete',id);
delCard.remove();
},
addCard : function(card){
var addCard = api.one('post');
addCard.post("card",card);
},
updateCard : function(card){
var addCard = api.one('update');
addCard.post("card",card);
},
updateStatusCard : function(id){
var incStatus = api.one('incStatus',id);
incStatus.put("card");
},
updateViewCard : function(id){
var incStatus = api.one('incView',id);
incStatus.put("card");
}
}
});
это служба, которая соединяется между контроллером и повторной службой:
app.factory('ServiceArray',function($filter,restAngularService){
var Cards = restAngularService.getCards();
return{
getCards: function() {
return Cards;
},
addCard: function(card){
restAngularService.addCard(card);
//Cards.push(card);
return Cards;
},
getCard: function(monitorName){
return $filter('filter')(Cards, { monitorName: monitorName})[0];
},
updateViewCard: function(card){
restAngularService.updateViewCard(card.id);
return Cards;
},
updateStatusCard: function(card){
if(card.status < 3){
restAngularService.updateStatusCard(card.id);
/*if(($filter('filter')(Cards, { monitorName: monitorName})[0]).status < 3) {
($filter('filter')(Cards, {monitorName: monitorName})[0]).status++;
}*/
}
return Cards;
},
delCard: function(id){
restAngularService.delCard(id);
//Cards.splice(index, 1);
return Cards;
},
upadteCard: function(card){
var uCard = {id:card.id,monitorName:card.monitorName,monitorType:card.monitorType,monitorLevel:card.monitorLevel,monitorProdact:card.monitorProdact,monitorSystem:card.monitorSystem,monitorExplain:card.monitorExplain}
restAngularService.updateCard(uCard);
/*($filter('filter')(Cards, {id: card.id})[0]).monitorName = card.monitorName;
($filter('filter')(Cards, {id: card.id})[0]).monitorType = card.monitorType;
($filter('filter')(Cards, {id: card.id})[0]).monitorLevel = card.monitorLevel;
($filter('filter')(Cards, {id: card.id})[0]).monitorProdact = card.monitorProdact;
($filter('filter')(Cards, {id: card.id})[0]).monitorSystem = card.monitorSystem;
($filter('filter')(Cards, {id: card.id})[0]).monitorExplain = card.monitorExplain;*/
return Cards;
}
}
главный контроллер (где массив):
ServiceArray.getCards().then(function(cards) {
$scope.Cards = cards;
});
это часть серверной части:
public static void addMonitorCard(String id,String dateHeader,String img,String monitorName,String monitorLevel,String monitorProdact,String monitorSystem,String monitorExplain,String monitorType,String classText,String classBtn,String text,int status,int views){
cards.add(new monitorCard(id,dateHeader,img,monitorName,monitorLevel,monitorProdact,monitorSystem,monitorExplain,monitorType,classText,classBtn,text,status,views));
}
public static Result addCard(){
JsonNode requestBody = request().body().asJson();
String id = requestBody.get("id").asText();
String dateHeader = requestBody.get("dateHeader").asText();
String img = requestBody.get("img").asText();
String monitorName = requestBody.get("monitorName").asText();
String monitorLevel = requestBody.get("monitorLevel").asText();
String monitorProdact = requestBody.get("monitorProdact").asText();
String monitorSystem = requestBody.get("monitorSystem").asText();
String monitorExplain = requestBody.get("monitorExplain").asText();
String monitorType = requestBody.get("monitorType").asText();
String classText = requestBody.get("classText").asText();
String classBtn = requestBody.get("classBtn").asText();
String text = requestBody.get("text").asText();
int status = requestBody.get("status").asInt();
int views = requestBody.get("views").asInt();
addMonitorCard(id,dateHeader,img,monitorName,monitorLevel,monitorProdact,monitorSystem,monitorExplain,monitorType,classText,classBtn,text,status,views);
SSE.sendSSEMassge();
return ok("added");
}
public static Result getCards()
{
return ok(Json.toJson(cards));
}
SSE - это открытое HTTP-соединение, которое открыто браузером клиента. Поэтому для правильной реализации вам необходимо создать решение, в котором одно событие может быть немедленно отправлено нескольким конечным клиентам.
Этот архитектурный шаблон называется публикацией/подпиской или Pub/Sub. Так что независимо от этого кода SSE.sendSSEMassge();
делает, он должен следовать этой схеме.
Когда я ранее реализовал SSE, я использовал Redis для Pub/Sub.
Я написал двухстраничный блог о внедрении SSE с узлом, который, мы надеемся, приведет вас к правильному пути.
Надеюсь, это поможет.