Spring Boot中的SseEmitter(根据条件切换到其他程序)

我有三个问题。

我有一个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,使应用程序可以调用它?

谢谢大家的帮助。

:slight_smile:


StackOverflow:https://stackoverflow.com/questions/68156750/sseemitter-in-spring-boot-switch-to-other-program-on-condition