У меня есть проект, сгенерированный с помощью jiperster 3.12.2, и я пытаюсь отправить сообщение тревоги через websockets из моего контроллера после того, как я сохранил его в db. RestController можно вызывать из интерфейса интерфейса jipster (создать новый объект) или из мобильного приложения, которое отправляет HTTP POST.Клиент не получает новое сообщение, отправленное с контроллера после сохранения
По какой-то причине мой клиент (мобильное приложение, сгенерированное с ионным и угловым) не получает никаких новых сообщений. Что случилось с моим кодом?
@RestController
@RequestMapping("/api")
public class AlarmResource {
private final Logger log = LoggerFactory.getLogger(AlarmResource.class);
@Inject
private AlarmService alarmService;
@Inject
SimpMessageSendingOperations messagingTemplate;
@PostMapping(value = "/alarms")
@Timed
@CrossOrigin
@Secured({AuthoritiesConstants.ALARM, AuthoritiesConstants.ADMIN, AuthoritiesConstants.EDITOR})
public ResponseEntity<Alarm> createAlarm(@RequestBody Alarm alarm) throws URISyntaxException {
log.debug("REST request to save Alarm : {}", alarm);
if (alarm.getId() != null) {
return ResponseEntity.badRequest().headers(HeaderUtil.createFailureAlert("alarm", "idexists", "A new alarm cannot already have an ID")).body(null);
}
if(alarm.getTimestamp_ms() == null) {
BigDecimal now = new BigDecimal(System.currentTimeMillis());
alarm.setTimestamp_ms(now);
}
Alarm result = alarmService.save(alarm);
System.out.println("Sending ne alarm message");
String dest = "/topic/alarmactivity";
messagingTemplate.convertAndSend(dest, result);
return ResponseEntity.created(new URI("/api/alarms/" + result.getId()))
.headers(HeaderUtil.createEntityCreationAlert("alarm", result.getId().toString()))
.body(result);
}
AlarmMessageService:
@Controller
public class AlarmMessageService {
private static final Logger log = LoggerFactory.getLogger(AlarmMessageService.class);
private DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@SubscribeMapping("/topic/alarmactivity")
@SendTo("/topic/alarmtracker")
public Alarm sendAlarm(@Payload Alarm newAlarm, StompHeaderAccessor stompHeaderAccessor, Principal principal) {
log.debug("Sending user tracking data {}", newAlarm);
return newAlarm;
}
}
И трекер-service.js в стороне клиента:
(function() {
'use strict';
/* globals SockJS, Stomp */
angular
.module('exampleApp')
.factory('ExAlarmTrackerService', ExAlarmTrackerService);
ExAlarmTrackerService.$inject = ['$rootScope', '$window', '$localStorage', '$http', 'API_URL','$q', 'AuthServerProvider', '$stomp'];
function ExAlarmTrackerService ($rootScope, $window, $localStorage, $http, API_URL, $q, AuthServerProvider, $stomp) {
var stompClient = null;
var subscriber = null;
var listener = $q.defer();
var connected = $q.defer();
var alreadyConnectedOnce = false;
var service = {
connect: connect,
disconnect: disconnect,
receive: receive,
sendActivity: sendActivity,
subscribe: subscribe,
unsubscribe: unsubscribe
};
return service;
function connect() {
//building absolute path so that websocket doesnt fail when deploying with a context path
var loc = $window.location;
var url = API_URL + 'websocket/tracker';
var authToken = AuthServerProvider.getToken();
if(authToken){
url += '?access_token=' + authToken;
}
var socket = new SockJS(url);
stompClient = Stomp.over(socket);
var stateChangeStart;
var headers = {};
stompClient.connect(headers, function() {
connected.resolve('success');
//sendActivity();
if (!alreadyConnectedOnce) {
stateChangeStart = $rootScope.$on('$stateChangeStart', function() {
//sendActivity();
console.log("statechange");
});
alreadyConnectedOnce = true;
}
});
$rootScope.$on('$destroy', function() {
if(angular.isDefined(stateChangeStart) && stateChangeStart !== null){
stateChangeStart();
}
});
}
function disconnect() {
if (stompClient !== null) {
stompClient.disconnect();
stompClient = null;
}
}
function receive() {
return listener.promise;
}
function sendActivity() {
if (stompClient !== null && stompClient.connected) {
stompClient
.send('/topic/activity',
{},
angular.toJson({'page': $rootScope.toState.name}));
}
}
function subscribe() {
connected.promise.then(function() {
subscriber = stompClient.subscribe('/topic/alarmtracker', function(data) {
listener.notify(angular.fromJson(data.body));
});
}, null, null);
}
function unsubscribe() {
if (subscriber !== null) {
subscriber.unsubscribe();
}
listener = $q.defer();
}
}
})();
И в моих controller.js:
ExAlarmTrackerService.receive().then(null, null, function(activity) {
console.log(activity);
});