Я встроил брокер ActiveMQ, настроенный в Spring с поддержкой веб-сокетов (используя STOMP).
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketMqConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableStompBrokerRelay("/topic");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/messaging")
.setAllowedOrigins("*")
.withSockJS();
}
@Bean(initMethod = "start", destroyMethod = "stop")
public BrokerService brokerService() throws Exception {
PersistenceAdapter persistenceAdapter = getPersistenceAdapter();
BrokerService brokerService = new BrokerService();
brokerService.setPersistent(true);
brokerService.setDeleteAllMessagesOnStartup(true);
brokerService.setUseJmx(false);
brokerService.setBrokerName("broker");
brokerService.addConnector("stomp://localhost:61613");
return borkerService;
}
В моем клиенте JavaScript я подписываюсь на тему:
var successHandler = function() {
stompClient.subscribe('/topic/test', function(not) {
pushNotification(not);
}, {'id': clientId, 'activemq.subscriptionName': clientId});
};
var socket = new SockJS('/messaging');
var stompClient = Stomp.over(socket);
stompClient.connect({'client-id': clientId}, successHandler, failureHandler);
И я используюбэкэнд-сервис для подачи этой темы:
@Autowired
private SimpMessagingTemplate messagingTemplate;
messagingTemplate.convertAndSend("/topic/test", event);
И вот мои вопросы:
- Когда я отправляю сообщение в тему, но клиент еще не подписан, почему сообщенияне сохраняется (я полагаю, что после подписки клиента он должен быть уведомлен о пропущенных сообщениях)?
- Если клиент отключается от темы, каждое сообщение сохраняется, существует ли какое-либо средство для ограничения количества сохраняемых сообщений, времени или размерафайлов журнала KahaDB?