Spring-Websocket-Endpunkt und Nachricht senden
-
21-12-2019 - |
Frage
Ich habe einen JMS-Listener und muss die Nachricht entgegennehmen, manipulieren und sie dann mithilfe von Websocket auf eine Seite umleiten.
Nun, ich bin nur verwirrt über die Konfiguration, ich habe die WebSocketConfig konfiguriert:
@Configuration
@EnableWebSocketMessageBroker
@EnableScheduling
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic", "/queue");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws/firstep/").withSockJS();
registry.addEndpoint("/ws/secondep/").withSockJS();
}
Und das sollte stimmen, dann ist meine Webseite:
var socket = new SockJS("/myapp-web/api/ws/secondep/",undefined,options);
var stompClient = Stomp.over(socket);
stompClient.connect({
company : "xxx"
}, function(frame) {
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/register', function(message){
console.log('message: ' + message);
});
stompClient.subscribe('/topic/update', function(message){
console.log('message: ' + message);
});
Und die Verbindung funktioniert.
Jetzt habe ich auf meinem JMS-Listener versucht, eine Nachricht auf diese Weise zu senden:
public class ImporterListener implements MessageListener {
Logger logger = LoggerFactory.getLogger(ImporterListner.class);
@SendTo("/topic/register")
private String TestMessage() {
return "TestMessage";
}
@Override
public void onMessage(Message message) {
logger.info("Request on message");
if (message instanceof MapMessage) {
MapMessage t = (MapMessage) message;
TestMessage(); //<--- have to send the message here
Aber es funktioniert nicht.Die Fragen sind:
- Wie sende ich eine Nachricht?
- Wo muss ich den Endpunkt (secondep) angeben, wenn ich eine Nachricht sende?
Danke schön!Jede Hilfe ist willkommen!
Lösung
Test Nachricht();//<--- muss die Nachricht hier senden
Nein, es muss nicht gesendet werden, da Sie eine Methode aus derselben Klasse verwenden, aber @SendTo
macht dein ImporterListener
als Stellvertreter und Advice
funktioniert nur mit der Methode einer anderen Komponente.
Das sollten Sie injizieren:
@Autowired
@Qualifier("brokerMessagingTemplate")
private MessageSendingOperations brokerMessagingTemplate;
Und senden Sie eine Nachricht damit:
brokerMessagingTemplate.convertAndSend("/topic/register", "TestMessage");
Wo muss ich den Endpunkt (secondep) angeben, wenn ich eine Nachricht sende?
Es ist für die @MessageMapping("/ws/secondep")
auf einer POJO-Methode zum Empfangen von Nachrichten von Clients.Es ist nicht für den sendenden Teil.