В Spring загружаются официальные документы о веб-сокетах, которые сообщают, что сообщения можно отправлять с помощью сокетов из любого компонента.Поэтому я подумал, что могу сохранить (не загружая файлы через сокет) мой контроллер остатка, обрабатывая загрузку моего файла, и отправлять сообщения о ходе выполнения с этого контроллера через сокет.
Я проверил конфигурацию и клиентскую часть (с SockJS), и все выглядит хорошо, потому что, например, gi может отправлять запланированные сообщения с контроллера, но я не хочу этого сценария.Я предпочитаю нанимать службу, которая будет вызываться всякий раз, когда я хочу отправлять сообщения.Я также проверил множество проблем, связанных с невозможностью отправки таких сообщений, но все их решения были связаны с тем, что клиент или класс конфигурации плохо настроены, но, как я уже сказал, я могу отправлять запланированные сообщения без проблем, поэтому я подумал, что моя проблема можетбыть связанным с самим контроллером.
Контроллер
@Autowired
private SimpMessagingTemplate template;
@PostMapping("/")
public String handleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) {
File uploadedFile = storageService.store(file);
redirectAttributes.addFlashAttribute("message",
"You successfully uploaded " + file.getOriginalFilename() + "!");
template.convertAndSend("/topic/greetings", "test message");
myService.uploadFile(uploadedFile);
return "redirect:/";
}
Класс конфигурации
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/gs-guide-websocket").withSockJS();
}
}
Клиент
var stompClient = null;
function setConnected(connected) {
$("#connect").prop("disabled", connected);
$("#disconnect").prop("disabled", !connected);
if (connected) {
$("#conversation").show();
}
else {
$("#conversation").hide();
}
$("#greetings").html("");
}
function connect() {
var socket = new SockJS('/gs-guide-websocket');
stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/greetings', function (greeting) {
showGreeting(greeting.body);
});
});
}
function disconnect() {
if (stompClient !== null) {
stompClient.disconnect();
}
setConnected(false);
console.log("Disconnected");
}
function sendName() {
stompClient.send("/app/hello", {}, JSON.stringify({'name': $("#name").val()}));
}
function showGreeting(message) {
$("#greetings").append("<tr><td>" + message + "</td></tr>");
}
$(function () {
$(".form-inline").on('submit', function (e) {
e.preventDefault();
});
$( "#connect" ).click(function() { connect(); });
$( "#disconnect" ).click(function() { disconnect(); });
$( "#send" ).click(function() { sendName(); });
});
$(document).ready(function() {
connect();
});
Я хочу загрузить файл и увидеть его информацию о прогрессе.Файл загружен и обработан, но не получает никакой информации (Мои сообщения не отправляются через сокет).