SSE с AngularJS и Java в игре Freamwork

0

Я новичок в 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));
    }
  • 0
    Что не работает? Вы просто спрашиваете, как это должно быть сделано, или как исправить то, что у вас есть?
  • 0
    Я спрашиваю, как это должно быть сделано
Показать ещё 2 комментария
Теги:
restangular
server-sent-events
playframework-2.0

1 ответ

0

SSE - это открытое HTTP-соединение, которое открыто браузером клиента. Поэтому для правильной реализации вам необходимо создать решение, в котором одно событие может быть немедленно отправлено нескольким конечным клиентам.

Этот архитектурный шаблон называется публикацией/подпиской или Pub/Sub. Так что независимо от этого кода SSE.sendSSEMassge(); делает, он должен следовать этой схеме.

Когда я ранее реализовал SSE, я использовал Redis для Pub/Sub.

Я написал двухстраничный блог о внедрении SSE с узлом, который, мы надеемся, приведет вас к правильному пути.

  1. Часть 1
  2. Часть 2

Надеюсь, это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню