当前位置: 首页 > 知识库问答 >
问题:

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

周飞语
2023-03-14

我尝试将Spring与websocket一起使用。我从本教程开始调查。

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

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
@RequestMapping("/")
public class PhotoController {

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

现在我想做的是让一个线程向监听“/主题/问候”的客户端发送消息。我这样写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
@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");
    }
}

该方法采用光电控制器。fireGreeting按我的要求调用,但客户端没有发生任何事情。有什么建议吗?非常感谢。

共有2个答案

谷玉韵
2023-03-14

按照@Boris the Spider的建议,调度周期性任务的更好方法是使用Spring调度机制(请参阅本指南)。

为了分离关注点,我还将计划相关代码与控制器代码分离。

在您的情况下,可以使用如下类:

@Component
public class ScheduledTasks {

    @Autowired
    private SimpMessagingTemplate template;

    @Scheduled(fixedRate = 2000)
    public void fireGreeting() {
        this.template.convertAndSend("/topic/greetings", new Greeting("Fire"));
    }
}

并将@EnableSched的标记添加到Application类中。

晁璞
2023-03-14

多亏了蜘蛛鲍里斯,我才得以解决我的问题。正确的解决方法是这样做:

@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启动应用程序运行在heroku。我使用webSocket为特定用户向客户端和服务器发送消息。我使用Spring引导的SimpMessagingTemplate.convertAndSendToUser来发送和接收消息,当用户需要从服务器获取消息时,这种方法效果很好。我使用Heroku会话亲和力,这意味着即使我扩大了会话的数量,用户和webSocket仍然共享同一个会话。 当我需

  • 问题内容: 我只能在用户的套接字ID直接存储在io.sockets.on(’connect’)函数中时向用户发出消息。我不知道为什么在登录后尝试存储其套接字ID时为什么不起作用。 加工: 无法运作: JavaScript客户端代码段 解决方案:感谢@alessioalex, 我不得不从登录页面中删除对socket.io的引用,并将以下内容添加到io.sockets.on(’connection’)

  • 我正在通过在WebSocketClientFlow上遵循doc来尝试客户端websocket。

  • 我正在阅读《Spring in Action4》一书,以使用WebSocket上的STOMP消息传递。 假设,如下所示: 然后客户端使用以下JavaScript代码订阅目标: 则该消息将发送到目的地,如下所示: 那么,两个目的地和看起来是不同的,消息怎么可能到达客户端呢?

  • 我对Spring websocket相当陌生。我有一个简单的演示如下: HandshakeInterceptor类: } WebsocketEndPoint类: } Spring映射webSocket: Html: 现在我想向特定用户发送一条消息。我定义每个设备都有一个deviceId,所以我想知道: 如何与属性握手,这将从客户端发送? 如何从客户端javascript发送握手属性? 如何通过握手

  • 问题内容: 这段代码一切正常(将其缩短以便更好地阅读)。 当向服务器发送请求时,服务器会立即响应他。但是,其他客户端看不到响应消息。 因此,我想进一步说明:当客户端向服务器发送请求时,服务器将响应所有客户端,以便所有客户端都能看到消息。 我怎样才能做到这一点?有任何示例或不错的入门教程吗? 提前致谢! 服务器: 问题答案: 您必须使用连接池将消息广播到所有连接。您可以将其用作教程/示例http:/