泽西 SSE 客户端不工作

Posted

技术标签:

【中文标题】泽西 SSE 客户端不工作【英文标题】:Jersey SSE client not working 【发布时间】:2016-03-28 08:32:45 【问题描述】:

我是 Jersey SSE 客户端 API 的新手,我有一个 servlet 可以持续发送事件。当我从浏览器调用 URL 时,我看到它在工作。当尝试使用 Jersey SSE 客户端调用相同的内容时,它没有按预期工作,我没有看到任何异常被抛出。

这是我使用的代码。

SERVLET:

    package com.abc.test;

    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Calendar;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class TestStream extends HttpServlet 

    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException 
        res.setContentType("text/event-stream");
        res.setCharacterEncoding("UTF-8");
        PrintWriter printWriter = null;

        while(true)
        
            try 
                printWriter = res.getWriter();
                printWriter.print("data: Thread Will wait for 10 seconds and push the notifications \n\n");
                printWriter.print("data: " + Calendar.getInstance().getTime() +"\n\n");
                res.flushBuffer();
                Thread.sleep(10000);
            
            catch(IOException ie) 
                printWriter.close();
                break;
            
            catch(InterruptedException ie)
                printWriter.close();
                break;
            
        

    

泽西 SSE 客户代码:

package com.abc.test;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;

import org.glassfish.jersey.media.sse.EventSource;
import org.glassfish.jersey.media.sse.InboundEvent;
import org.glassfish.jersey.media.sse.SseFeature;


public class ListenerThread implements Runnable 

private int i = 0;
private Thread t;

public void start() 
    if (t == null) 
        t = new Thread(this);
        t.start();
    


@Override
public void run() 
    EventSource eventSource = null;
    try 
        // TODO Auto-generated method stub
        Client client = ClientBuilder.newBuilder()
                .register(SseFeature.class).build();
        WebTarget target = client.target("http://172.20.14.19:8080/TestStream/SSE");
        eventSource = new EventSource(target) 
            @Override
            public void onEvent(InboundEvent inboundEvent) 
                    System.out.println(inboundEvent.getName() + "; "
                            + inboundEvent.readData(String.class));
            
        ;

        while (i <= 10) 
            try 
                Thread.sleep(6000);
                System.out.println("Printing I value : " + i);
                System.out.println("Is Event Source OPEN : " + eventSource.isOpen());
             catch (Exception e) 
                e.printStackTrace();
            
        
     catch (Throwable t) 
        System.out.println("Inside Throwable");
        t.printStackTrace();
     finally 
        if (null != eventSource)
            eventSource.close();
    

Jersey Client onEvent 从未触发。将不胜感激任何帮助。让我知道,如果我错过了什么。

谢谢, 普雷迪普

【问题讨论】:

【参考方案1】:

由于您使用的是 EventSource 和 EventListener,我认为您需要注册事件并打开 eventSource.register(listener, "EVENT NAME");

eventSource.open();

【讨论】:

【参考方案2】:

SseFeature 不适用于这种分块输出,我们必须使用 ChunkedInput 来读取事件。

【讨论】:

以上是关于泽西 SSE 客户端不工作的主要内容,如果未能解决你的问题,请参考以下文章

泽西客户端异步 POST 请求不等待响应

泽西客户端在Weblogic中运行403但是可以 独立运行

客户端响应过滤器读取实体问题(泽西)

How Javascript works (Javascript工作原理) 深入理解 WebSockets 和带有 SSE 机制的HTTP/2 以及正确的使用姿势

泽西客户端多部分通话

Glassfish:泽西客户端中的MessageBodyProviderNotFoundException