java sse spring_java – 使用SseEmitter的Spring rest服务

当我在服务器上调用控制器时,我正在尝试通知一个简单的html页面.我有一个Android应用程序调用我的控制器,当这完成后,我想通知我的网页控制器被调用.

这是我的一些代码:

@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;

}

}

我看到的所有教程,控制器返回SseEmitter但我必须返回一个User.我必须使用另一个映射创建另一个控制器并侦听该URL吗?如何在现有控制器中调用该控制器方法?

我的EventSource必须监听哪个URL?

在此先感谢您的帮助!

亲切的问候.

解决方法:

我想你几乎就在那里,Allinone51.

您对SseEmitter.send()的调用可能应该在getUser方法中.

一般模式是,当您创建SseEmitter时,您需要将其“存储”在某处以便其他代码获取它.您正确地从getSseEmitter方法返回SseEmitter,您只是忘记将其存储为另一种方法,以便能够在其上调用“send”.

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

//...

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;

}

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

标签:server-sent-events,android,java,spring,rest

来源: https://codeday.me/bug/20190727/1555947.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值