我有三个问题。
我有一个Spring Boot应用。我已经设法使用SseEmitter成功实现了服务器端事件。前端和后端都是如此。所以现在,当客户端访问一个页面时,一个GET请求被发送到/sse。我正在使用一个@RequestParam
id来区分客户。这个ID基本上是一个收费付款的标识符。一旦支付了费用,我的数据库就会被更新,SseEmitter就会向特定的客户端发送一个支付成功的消息。
Spring Boot控制器代码
@GetMapping("/sse")
public SseEmitter sse(@RequestParam("id") String id) throws InterruptedException, IOException {
// 180000 is in miliseconds so 180sec (3min). Connection keeps open for 3min
SseEmitter sseEmitter = new SseEmitter(180_000L);
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(() -> {
try {
if (chargeService.findPaidCharge(id, "true") != null) {// means there is a charge
sseEmitter.send("Ching ching! Payment received");
sseEmitter.complete();
System.out.println("Payment complete do something else");
//Switch to photo taking program here
}
} catch (Exception e) {
sseEmitter.completeWithError(e);
} finally {
sseEmitter.complete();
}
});
executor.shutdown();
return sseEmitter;
}
客户端JS代码
<script type="text/javascript">
$(document).ready(function() {
var items = $("#items")
var chargeID = $("#chargeID").text();
var getRequestURL = "/sse?id=";
var finalGetRequestURL = getRequestURL.concat(chargeID);
var sse = $.SSE(finalGetRequestURL, {
onMessage: function(message) {
var html = message.data;
$("#items").text(html);
sse.stop();
}
});
sse.start();
});
</script>
问题1:我上述使用ExecutorService和使用单线程的方式是最好的实现吗?如果这个应用程序大规模运行(对/sse的多个GET请求),是否会有任何线程或并发问题?我是线程/并发的新手,只是想确认一下。
问题2:付款后,我想激活我电脑中的另一个程序。基本上这是个拍照的程序。我的想法是使用Runtime (Runtime run = Runtime.getRuntime(); run.exec(command);)
运行一个AHK脚本(.exe文件),这将切换到我的拍照应用程序。有谁知道我怎么做?它应该放在我上面的控制器的尝试块中吗?
问题3:另一个问题是,如果我把我的应用程序部署到云端,这个工作流程是否可以工作?比如AWS或者Digital Ocean?我很担心,因为现在我的这个AHK脚本将不在本地了。我是否需要把这个AHK脚本也部署到云端,以获得一个实时的URL,使应用程序可以调用它?
谢谢大家的帮助。
StackOverflow:https://stackoverflow.com/questions/68156750/sseemitter-in-spring-boot-switch-to-other-program-on-condition