首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泽西SSE客户端不工作

泽西SSE客户端不工作
EN

Stack Overflow用户
提问于 2015-12-22 06:27:12
回答 2查看 922关注 0票数 4

对于泽西SSE客户端API来说,我是新手,我有一个servlet,它不断地发送事件。当我从浏览器调用URL时,我发现它起作用了。当尝试使用Jersey客户端调用相同的SSE客户端时,它不像预期的那样工作,我没有看到任何异常被抛出。

下面是用于此的代码。

SERVLET:

代码语言:javascript
复制
    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客户端代码:

代码语言:javascript
复制
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();
    }
}

}

泽西客户端onEvent从未触发。会感谢你在这方面的帮助。告诉我,如果我错过了什么。

谢谢你,普拉迪普

EN

回答 2

Stack Overflow用户

发布于 2016-01-13 12:14:49

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

票数 0
EN

Stack Overflow用户

发布于 2017-11-10 08:56:12

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

代码语言:javascript
复制
eventSource.open();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34409717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档