spring - 如何使用 Spring 通过 websocket 向客户端发送消息

标签 spring sockjs spring-websocket

我尝试将 Spring 与 websocket 一起使用。我从 this tutorial 开始我的调查。 .

在我的客户端中,我有类似的东西来初始化与服务器的连接:

function connect() {
    var socket = new SockJS('/myphotos/form');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function(frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/greetings', function(greeting){
            showGreeting(JSON.parse(greeting.body).content);
        });
    });
}

效果很好,在我的 Controller 中,我可以在以下类中执行我的过程:

@Controller
@RequestMapping("/")
public class PhotoController {

    @MessageMapping("/form")
    @SendTo("/topic/greetings")
    public Greeting validate(AddPhotosForm addPhotosForm) {
        return new Greeting("Hello world !");
    }
}

现在我想做的是让一个线程向监听“/topic/greeting”的客户端发送消息。我这样写了我的 Runnable 类:

public class FireGreeting implements Runnable {

    private PhotoController listener;

    public FireGreeting(PhotoController listener) {
        this.listener = listener;
    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep( 2000 );
                listener.fireGreeting();
            } catch ( InterruptedException e ) {
                e.printStackTrace();
            }
        }   
    }
}

然后像这样完成了我的 Controller :

@Controller
@RequestMapping("/")
public class PhotoController {

    @MessageMapping("/form")
    @SendTo("/topic/greetings")
    public Greeting validate(AddPhotosForm addPhotosForm) {

        // added this part
        FireGreeting r = new FireGreeting( this );
        new Thread(r).start();

        return new Greeting("Hello world !");
    }

    // added this method
    @SendTo("/topic/greetings")
    public Greeting fireGreeting() {
        System.out.println("Fire");
        return new Greeting("Fire");
    }
}

方法 PhotoController.fireGreeting 被调用,但客户端没有发生任何事情。 有什么建议么 ?谢谢。

最佳答案

感谢@Boris the Spider,我能够解决我的问题。正确的解决方案是这样做:

@Controller
@RequestMapping("/")
public class PhotoController {

    @Autowired
    private SimpMessagingTemplate template;

    @MessageMapping("/form")
    @SendTo("/topic/greetings")
    public Greeting validate(AddPhotosForm addPhotosForm) {

        FireGreeting r = new FireGreeting( this );
        new Thread(r).start();

        return new Greeting("Hello world !");
    }

    public void fireGreeting() {
        System.out.println("Fire");
        this.template.convertAndSend("/topic/greetings", new Greeting("Fire"));
    }
}

关于spring - 如何使用 Spring 通过 websocket 向客户端发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28250719/

相关文章:

java - 让 spring-data-neo4j 使用 getter 和 setter

spring - 将 CommonJ 实现与 GlassFish 和 Spring 3 结合使用

activemq - 使用 stomp.js 而不是 sock.js 和 ActiveMQ-Apollo 似乎不起作用

javascript - 一次请求中从 JS 到 Spring 的多个 STOMP 订阅

java - Spring 4 Web 套接字 - 我必须有 stomp 代理吗?

java - spring boot web socket 中的实时通知

Spring websocket 重写 DefaultUserDestinationResolver

java - AOP @Around 不适用于 JSF+Spring

java - activemq-all "5.15.3"不适用于 Spring 5

angular - 有没有办法在 websocket 连接中捕获关闭事件?