GVKun编程网logo

java – 使用SseEmitter的Spring rest服务(java spring restful)

8

本文将分享java–使用SseEmitter的Springrest服务的详细内容,并且还将对javaspringrestful进行详尽解释,此外,我们还将为大家带来关于flutter实现promise

本文将分享java – 使用SseEmitter的Spring rest服务的详细内容,并且还将对java spring restful进行详尽解释,此外,我们还将为大家带来关于flutter 实现 promise 中 resolve (RxJava 中 emiter.onSucess ("result")) 功能、html5-Spring SSEEmitter中途完成、Java spring SseEmitter / ResponseBodyEmitter:检测浏览器重新加载、java – REST服务没有在Spring中使用Spring和Maven注册的相关知识,希望对你有所帮助。

本文目录一览:

java – 使用SseEmitter的Spring rest服务(java spring restful)

java – 使用SseEmitter的Spring rest服务(java spring restful)

当我在服务器上调用控制器时,我正在尝试通知一个简单的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对象中.这样,只要我的服务器上的玩家对象有东西告诉玩家设备,它就可以访问自己内部的正确发射器.

flutter 实现 promise 中 resolve (RxJava 中 emiter.onSucess (

flutter 实现 promise 中 resolve (RxJava 中 emiter.onSucess ("result")) 功能

 

BehaviorSubject openCameraController = BehaviorSubject();

BridgeChannel _openCamera() {
print(''- - - - - - - - - - - - - - - - - - > _openCamera() '');
return BridgeChannel(
name: ''openCamera'',
onBridgeHandler: (dataFromJs) async {
print(''- - - - - - - - - - - - - - - - - - > 111 ''+dataFromJs);
EventBus().post(OpenCameraEvent(dataFromJs));
print(''- - - - - - - - - - - - - - - - - -> 222 '');
String str = await doSome();
print(" - - - - - - - - - - - - - - - - - - > 555 "+str);
return str;
}
);
}

Future<String> doSome() async {
  // 注意Future的范型不正确的话,await Future完不会生成String
Future<String> future = new Future(() => "");
openCameraController.listen((resul) async {
future.then((_) => resul);
});
return future;
}

 

html5-Spring SSEEmitter中途完成

html5-Spring SSEEmitter中途完成

我是服务器发送事件的新手,但不是Spring的新手.
已经制作了一个控制器,该控制器从启动SSEEmitter的UI上的按钮触发,并将其传递给另一个线程,该线程在每4秒后循环向UI发送消息.
到目前为止,我正在运行10个循环,每个循环睡眠4秒,但突然在第6或第7个循环的迭代附近,出现异常“线程“ Thread-4”中的异常java.lang.IllegalStateException:ResponseBodyEmitter已设置为完成”. .

因此,事件源再次重新建立连接,即再次调用控制器方法,这当然是我所不希望的.

我在这里尝试一件简单的事情.用户通过单击按钮进行订阅.
服务器无论何时都向浏览器发送响应10或20.就我而言,这就是上证所为之创造的.

代码如下:

@RequestMapping("/subscribe")
public SseEmitter subscribe() {
    SseEmitter sseEmitter = new SseEmitter();
    try {
        sseEmitter.send("Dapinder");
    } catch (IOException e) {
        // Todo Auto-generated catch block
        e.printstacktrace();
    }
    Runnable r = new AnotherThread(sseEmitter);
    new Thread(r).start();
    return sseEmitter;
}

公共类AnotherThread实现Runnable {

private SseEmitter sseEmitter;

public AnotherThread(SseEmitter sseEmitter) {
    super();
    this.sseEmitter = sseEmitter;
}

@Override
public void run() {
    SseEventBuilder builder = SseEmitter.event();
    builder.name("dapEvent");
    for (int i = 0; i < 10; i++) {
        builder.data("This is the data: " + i +" time.");
        try {
            //sseEmitter.send(builder);
            sseEmitter.send("Data: "+i);
            //sseEmitters.get(1L).send("Hello");
        } catch (IOException e) {
            e.printstacktrace();
        }
        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printstacktrace();
        }
    }
    sseEmitter.complete();
}

public SseEmitter getSseEmitter() {
    return sseEmitter;
}

public void setSseEmitter(SseEmitter sseEmitter) {
    this.sseEmitter = sseEmitter;
}

}

function start() {
    var eventSource = new EventSource("http://localhost:8080/HTML5SSE/springSSE/subscribe"); //  /springSSE/connect
      eventSource.onmessage = function(event) {
        document.getElementById('foo').innerHTML = event.data;
    };

}


<button onclick="start()">Subscribe</button>

解决方法:

您的构建器未被使用;您创建并配置了构建器,但是随后直接使用“ sseEmitter.send”发送了一条简单消息.尝试这个:

sseEmitter.send(SseEmitter.event().name("dapEvent").data("This " + i +" time.");

还有一件事:为什么在subscribe方法中已经调用了send方法?此时,尚未返回SseEmitter.此消息是否传递给客户端?

这是一个excellent article,从JavaScript角度(不是Spring)说明了SSE.您将在此处看到可以通过调用流上的close从客户端取消事件流.将此与事件侦听器结合使用,您应该拥有所需的内容:

var source = new EventSource('...');
source.addEventListener('error', function(e) {
  if (e.currentTarget.readyState == EventSource.CLOSED) {
    // Connection was closed.
  } else {
    // Close it yourself
    source.close();
  }
});
source.addEventListener('message', function(e) {
  console.log(e.data);
});

注意:文章说e.readyState,但是我认为这是错误的.接收到的对象e是事件.您需要像这样从其中获取EventSource对象:e.currentTarget.

Java spring SseEmitter / ResponseBodyEmitter:检测浏览器重新加载

Java spring SseEmitter / ResponseBodyEmitter:检测浏览器重新加载

我在Java Spring中使用服务器端事件(SSE).每当新客户端订阅事件服务时,我在REST控制器上执行以下代码:

SseEmitter emitter = new SseEmitter(-1L);
emitter.onCompletion(() -> {
        logger.debug(TAG + "Emitter completed.");
        emitters.remove(emitter);
    });
return emitter;

然后,每当需要将事件通知给我执行的客户端时:

 for (ResponseBodyEmitter emitter: emitters) {
        emitter.send("Message #1");
 }

问题是当其中一个客户端重新加载浏览器时,发射器没有完成(正如我所料),并且在调用上面的代码时我得到一个损坏的管道异常.只有在触发此异常后,我才会看到发射器已完成.

有没有办法解决这个问题?

最佳答案
当浏览器重新加载时,它会为您的服务器建立一个新的EventSource,对吧?您的问题是旧的问题,它不再具有客户端端点.

我建议你尝试检测它是同一个客户端连接,然后在旧发射器上显式调用完成.

在我的情况下,我可以根据EventSource传入的令牌检测到这一点作为URL参数.当我将新创建的发射器挂钩到“用户对象”时,我确保在将新的发射器分配给用户字段变量之前完成前一个发射器.

从您的代码中,您似乎有一个列表或一组发射器.你可以把它改成地图,你有一些客户端身份作为密钥,发射器作为值吗?

我无法准确地告诉您要用作客户身份的信息,因为这完全取决于您的应用程序.在我的例子中,它是一个JWT令牌,但你可以简单地创建一个客户编号方案……

java – REST服务没有在Spring中使用Spring和Maven注册

java – REST服务没有在Spring中使用Spring和Maven注册

我有一个Maven项目,其中包含下面列出的依赖项:

wink.version = 1.1.3-incubating和spring.version = 3.0.5.RELEASE

Spring中的应用上下文包括:

    java.lang.class">
        

web.xml包括:

aram>
    figLocationaram-name>
    aram-value>
        classpath:meta-inf/wink/wink-core-context.xml
        classpath:applicationContext.xml
    aram-value>
aram>

servlet-mapping>
    servlet-mapping>

Rest Java Class包括:

@Path("/ex")
public class ExampleRest {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public String example() throws IOException {
        return "{ 'id':'test' }";
    }
}

查看日志我没有看到任何异常或问题,正在创建’restexample’bean但是……当我尝试调用REST服务时,我得到了404.

我认为Apache Wink没有注册ExampleRest.

任何的想法 ?

更新02/14:
在日志中,我注意到Apache Wink没有注册ExampleRest.也许,问题是在bean声明中,或者是我正在使用的依赖项.
我还设置了另一个没有弹簧的项目,它在那里工作.我真的需要Spring将他的IoD用于daos和服务.

最佳答案
在您的web.xml中,您指向一个名为wink-core-context.xml的文件.这个文件的路径似乎是错误的.它应该是:

meta-inf/server/wink-core-context.xml

See source

不知道为什么你在这里看不到FileNotFoundException.

今天关于java – 使用SseEmitter的Spring rest服务java spring restful的介绍到此结束,谢谢您的阅读,有关flutter 实现 promise 中 resolve (RxJava 中 emiter.onSucess ("result")) 功能、html5-Spring SSEEmitter中途完成、Java spring SseEmitter / ResponseBodyEmitter:检测浏览器重新加载、java – REST服务没有在Spring中使用Spring和Maven注册等更多相关知识的信息可以在本站进行查询。

本文标签: