Конфигурация веб-сокета CXF

Я пытаюсь отправить сообщение мониторинга на мою клиентскую страницу jsf с помощью веб-сокета. Но за последние 2 дня мы приблизились к решению, но все еще не можем отправить сообщение на страницу jsf, хотя мне удалось создать соединение с веб-сокетом.

Вот мой код JavaScript.

websocket = new WebSocket("ws://localhost:9000/jdbc/monitor");
websocket.binaryType = 'arraybuffer';

websocket.onopen = function(evt) {
    onOpen(evt);
};

websocket.onclose = function(evt) {
    onClose(evt);
};

websocket.onmessage = function(evt) {
    onMessage(evt);
};

websocket.onerror = function(evt) {
    onError(evt);
};

function startSocket() {

    websocket.send("Started");

}

function stopSocket() {

    websocket.close();

}

function onOpen(evt) {
    console.log("Connection opened" + evt);
}

function onClose(evt) {
    console.log("Connection closed" + evt);
}

function onMessage(evt) {
    console.log("Recieved message" + evt);
}

function onError(evt) {
    console.log("error occured" + evt);
}

function doSend(message) {
    console.log("sending message...");
    websocket.send(reqmsg.value);
}

Класс отдыха CXF

@Path("/jdbc/")
@Service
public class JdbcMonitor {

    private final static Logger LOG = LoggerFactory.getLogger(JdbcMonitor.class); 
    private final Set<OutputStream> monitor = new HashSet<OutputStream>();

    @GET
    @Path("/monitor")
    @Produces("text/*")
    public StreamingOutput monitor() {

        return new StreamingOutput() {

            @Override
            public void write(OutputStream wr) throws IOException,
                    WebApplicationException {
                LOG.debug("Recieved a connection");
                monitor.add(wr);
                wr.write(("Regsitered for monitor at" + new java.util.Date()
                        .toString()).getBytes());
                LOG.debug("Write completed");

            }
        };

    }

    public synchronized void sendData(final String message) {

        LOG.debug("Triggered a websocket send");
        int i=0;
        for (final Iterator<OutputStream> it = monitor.iterator();it.hasNext();) {

            LOG.debug("Sending number"+ i++);
            final OutputStream out = it.next();
            try {
                out.write(message.getBytes());
            } catch (IOException e) {
                try {
                    out.close();
                    LOG.debug("Closing connection");
                } catch (IOException e1) {
                    LOG.debug("Closing connection");
                }
                it.remove();
            }

        }
        LOG.debug("Websocket send completed");

    }

}

и класс компонента CXF

<jaxrs:server id="kpWebSockServer" address="ws://localhost:9000/" >
        <jaxrs:serviceBeans>
            <ref bean="jdbcMonitor" />
        </jaxrs:serviceBeans>
</jaxrs:server>

Код, который я использую, аналогичен предоставленному образцу CXF. И я могу подключиться к серверу. поскольку FireFox показывает мне журнал Connection opened[object Event], и через некоторое время я получаю закрытый журнал соединений, так как между клиентом и сервером нет связи. Однако журнал показывает, что причал получает сообщение, но не может переслать его методу мониторинга. Следовательно, я считаю, что мне не хватает некоторой конфигурации, связанной с причалом, чтобы сообщение могло быть делегировано CXF с сервера причала (вся настройка развернута на сервере tomcat7, который не поддерживает веб-сокет). Может ли кто-нибудь помочь, указав недостающую ссылку. Вот журнал, связанный с пристанью.

2014-09-24 21:06:23,997 [qtp10414855-16 Selector0] DEBUG org.eclipse.jetty.io.nio - created SCEP@c8ddda{l(/127.0.0.1:57569)<->r(/127.0.0.1:9000),s=0,open=true,ishut=false,oshut=false,rb=false,wb=false,w=true,i=0}-{AsyncHttpConnection@15d3a98,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0}
2014-09-24 21:06:24,001 [qtp10414855-21] DEBUG org.eclipse.jetty.http.HttpParser - filled 468/468
2014-09-24 21:06:24,015 [qtp10414855-21 - /jdbc/monitor] DEBUG org.eclipse.jetty.server.Server - REQUEST /jdbc/monitor on AsyncHttpConnection@15d3a98,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-5,l=9,c=0},r=1
2014-09-24 21:06:24,016 [qtp10414855-21 - /jdbc/monitor] DEBUG o.e.j.server.handler.ContextHandler - scope null||/jdbc/monitor @ o.e.j.s.h.ContextHandler{,null}
2014-09-24 21:06:24,016 [qtp10414855-21 - /jdbc/monitor] DEBUG o.e.j.server.handler.ContextHandler - context=||/jdbc/monitor @ o.e.j.s.h.ContextHandler{,null}
2014-09-24 21:06:24,047 [qtp10414855-21 - /jdbc/monitor] DEBUG o.e.j.websocket.WebSocketFactory - extensions=[]
2014-09-24 21:06:24,094 [qtp10414855-21 - /jdbc/monitor] INFO  o.a.c.t.w.jetty.JettyWebSocket - onOpen(WSFrameConnection@1977251 l(127.0.0.1:9000)<->r(127.0.0.1:57569)))
2014-09-24 21:06:24,095 [qtp10414855-21 - /jdbc/monitor] DEBUG o.e.j.websocket.WebSocketFactory - Websocket upgrade /jdbc/monitor 13 null WebSocketServletConnectionRFC6455 p=WebSocketParserRFC6455@1d2436e state=START buffer=null g=WebSocketGeneratorRFC6455@148fc1a closed=false buffer=-1
2014-09-24 21:06:24,095 [qtp10414855-21 - /jdbc/monitor] DEBUG org.eclipse.jetty.server.Server - RESPONSE /jdbc/monitor  101 handled=true
2014-09-24 21:06:24,096 [qtp10414855-21] DEBUG o.e.j.server.AsyncHttpConnection - Enabled read interest SCEP@c8ddda{l(/127.0.0.1:57569)<->r(/127.0.0.1:9000),s=1,open=true,ishut=false,oshut=false,rb=false,wb=false,w=true,i=0}-{AsyncHttpConnection@15d3a98,g=HttpGenerator{s=4,h=0,b=-1,c=-1},p=HttpParser{s=0,l=9,c=0},r=1}
2014-09-24 21:06:24,130 [qtp10414855-21] DEBUG org.eclipse.jetty.io.nio - WebSocketServletConnectionRFC6455 p=WebSocketParserRFC6455@1d2436e state=START buffer=null g=WebSocketGeneratorRFC6455@148fc1a closed=false buffer=-1 replaced AsyncHttpConnection@15d3a98,g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=-3},r=1

person Karthik Prasad    schedule 24.09.2014    source источник
comment
Не могли бы вы добавить подробности о конфигурации maven/CXF, необходимой для поддержки WebSockets с Jetty/CXF? заранее спасибо   -  person Raphael Jolivet    schedule 25.08.2016
comment
Также знаете ли вы, как добавлять заголовки к отправленным сообщениям в StreamingOutput?   -  person Raphael Jolivet    schedule 25.08.2016


Ответы (1)


Наконец нашел свою проблему. Это была проблема с кодом JavaScript. В методе отправки я должен передать URI с типом метода http, приведенный ниже код исправил эту проблему.

function startSocket() {

    websocket.send("Get /jdbc/monitor");

}
person Karthik Prasad    schedule 26.09.2014
comment
Пожалуйста, поделитесь некоторыми деталями в вашей настройке. Какую версию CXF вы использовали? Какова ваша конфигурация? Спасибо! - person mvermand; 14.12.2018