Адрес Artemis mutilcast и очередь не работают должным образом. Моя идея - создать группы или обмен сообщениями для пользователя, который может иметь несколько сеансов веб-сокетов (веб, Android и т. Д.). Сервер опубликует уведомление на многоадресный адрес artemis, и все подписчики должны получить уведомление. В текущем сценарии я просто заставляю пользователя luislaves00 создавать более одного сеанса. В artemis я вижу 2 потребителей (не уверен, как Message Broker Relay из spring выполняет свою работу), но потребители ведут себя как циклический перебор, а не издатель-подписчик. С брокером в памяти от Spring он работает нормально, но недолговечен, поэтому, когда нет подключенного подписчика, сообщения удаляются. Вот код, который я использую:
Клиентская часть:
function connect() {
var socket = new SockJS('/notification-websocket');
stompClient = Stomp.over(socket);
var headers = {
// todo: server will handle this logic
'client-id': 'luisalves00',
'durable-subscription-name': 'luisalves00',
'id' : 'luisalves00'
};
stompClient.connect(headers, function(frame) {
setConnected(true);
console.log('Connected: ' + frame);
// todo: server will handle this logic
stompClient.subscribe('/topic/notification/username' + 'luisalves00', function(notification) {
showNotification(JSON.parse(notification.body).content);
}, headers);
});
}
Конфигурация реле брокера:
public void configureMessageBroker(MessageBrokerRegistry config) {
// Artemis ->
// tcp://0.0.0.0:61613?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=STOMP;useEpoll=true
config.enableStompBrokerRelay("/topic").setRelayHost("127.0.0.1").setRelayPort(61613);
config.setApplicationDestinationPrefixes("/app");
//config.enableSimpleBroker("/topic");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
logger.info("Registering the stomp endpoints.");
registry.addEndpoint("/notification-websocket").setAllowedOrigins("*").withSockJS();
}
Производитель фиктивных уведомлений сервера:
@Scheduled(fixedDelay = 20000)
public void scheduleTaskWithFixedDelay() {
final Notification message = new Notification(UUID.randomUUID().toString() + " -> " + dateTimeFormatter.format(LocalDateTime.now()));
try {
final String user = "luisalves00";
logger.info("Creating msg={}", message);
final Map<String, Object> headers = new HashMap<>();
headers.put("subscription-id", user);
template.convertAndSend("/topic/notification/username/" + user, message, headers);
} catch (Exception e) {
logger.error("", e);
}
}
Когда клиент подписывается, artemis создает адрес и постоянную очередь со следующими параметрами:
Addesses:
id=2147496008 name=/topic/notification/group1/ routingType=[MULTICAST] queueCount=1
Queue
id=2147496011
name=group1.group1
address=/topic/notification/group1/
routingType=MULTICAST
durable=true
maxConsumers-1
purgeOnNoConsumers=false
consumerCount=0
expires
для управления истечением срока действия сообщения. В этом заголовке используется время Unix (en.wikipedia.org/wiki/Unix_time). - person Justin Bertram   schedule 02.10.2018