java - 使用 SseEmitter 的 Spring rest 服务

标签 java android spring rest server-sent-events

当我调用服务器上的 Controller 时,我试图通知一个简单的 html 页面。我有一个调用我的 Controller 的 android 应用程序,完成后我想通知我的网页调用了 Controller 。

这是我的一些代码:

    @RequestMapping("/user") 
public class UserController {

    /**
     * Returns user by id.
     * 
     * @param user IMEI
     * @return
     */
    @RequestMapping(value = "/{imei}", method = RequestMethod.GET)
    public User getUser(@PathVariable String imei) {

        User myUser = null;
        try {
            myUser = DbConnector.getUserWithImei(imei);
        } catch (Exception e) {
            System.out.println("Couldn't get user from database");
            e.printStackTrace();
        }
        SseEmitter emitter = new SseEmitter();
        try {
            emitter.send("Hallokes");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        emitter.complete();
        return myUser;
    }
}

我看到的所有教程, Controller 返回 SseEmitter 但我必须返回一个用户。我必须用另一个映射制作另一个 Controller 并监听那个 url 吗?我将如何在现有 Controller 中调用该 Controller 方法? 我的 EventSource 必须监听什么 URL?

预先感谢您的帮助!

亲切的问候。

最佳答案

我想你快到了,Allinone51。

您对 SseEmitter.send() 的调用可能应该在 getUser 方法中。 一般模式是,当您创建 SseEmitter 时,您需要将它“存储”在某个地方以供其他代码获取它。您正确地从 getSseEmitter 方法返回了 SseEmitter,您只是忘记存储它以便其他方法能够调用它的“发送”。

调整你上面的例子,它可能是这样的:

//...
private SseEmitter emitter;

@RequestMapping(value = "/{imei}", method = RequestMethod.GET)
public User getUser(@PathVariable String imei) { 
    User myUser = null;

    // .. do resolving of myUser (e.g. database etc).

    // Send message to "connected" web page:
    if (emitter != null) {
        emitter.send(myUser.toString()); // Or format otherwise, e.g. JSON.
    }

    // This return value goes back as a response to your android device
    // i.e. the caller of the getUser rest service.
    return myUser;
}

@RequestMapping(value = "/sse")
public SseEmitter getSseEmitter() {
    emitter = new SseEmitter();
    return emitter;
}

当然,上面的代码仅适用于一个连接/发射器。有更智能的方法来存储该发射器。例如,在我的在线游戏应用程序中,我将发射器挂接到每个玩家对象中。这样,每当我的服务器上的播放器对象有东西要告诉播放器设备时,它就可以访问其内部的正确发射器。

关于java - 使用 SseEmitter 的 Spring rest 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35504419/

相关文章:

java - Spring Rabbit如何正确发送回复消息?

java - 如何在Spring中上传apk?

java - SWT 堆积条形图显示总值

java - 生成 13 到 100 之间的 1000 个随机数

java - 从两种类型的 Enum 之一实例化 EnumSet

android - 使用包装内容可绘制图像获取 ImageView 位置

android - 从相机捕获图像并将其直接发送到服务器

java - 从最低到最高打印数组而不排序

android - 在Android中将手机麦克风路由到Sco蓝牙耳机

java - 在我的项目 mvc 上集成项目 restful