解组套接字流时JAXB挂起 [英] JAXB hangs while unmarshaling socket stream

查看:112
本文介绍了解组套接字流时JAXB挂起的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

马歇尔和解读读者和作家的问题。所以这就是。这就是我给PrintWriter编写内容的方法。

Have an issue with marshall and unmarshall readers and writers. So here it is. This is how i marshall something to the PrintWriter.

try {

    JAXBContext jaxbContext = JAXBContext.newInstance(XMLProtocol.class);
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    //jaxbMarshaller.setProperty(, value)
    //jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
    jaxbMarshaller.marshal(protocol, out);


} catch (JAXBException e) {
    LOG.error("Error while processing protocol"+e);             
}

这就是我得到它的方式:

This is how i get it:

private BufferedReader in;
private PrintWriter out;
private String buffer;
private StringBuffer stringBuffer;

public ServerThread(Socket s) throws IOException {
    socket = s;
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
    start();
}

public void run() {
    try {
        while (true) {
            // LOG.trace("Waiting for input stream ready");

            /*
             * if (in.readLine().endsWith(">")) {
             *     LOG.trace("here we go"+buffer);
             *     JAXBContext jaxbContext = JAXBContext.newInstance(XMLProtocol.class);
             *     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
             *     XMLProtocol protocol = (XMLProtocol) jaxbUnmarshaller.unmarshal(in);
             *     LOG.trace("Nop it no the end " + protocol.getContent());
             * }
             */

            if (in.ready()) {

                LOG.trace("BufferedReader - ready");
                buffer += in.readLine();
                if (buffer.endsWith("</XMLProtocol>")) {
                    LOG.trace("Wish you were here1"+in);

                    JAXBContext jaxbContext = JAXBContext.newInstance(XMLProtocol.class);

                    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

                    XMLProtocol protocol = (XMLProtocol) jaxbUnmarshaller.unmarshal(in);

                    LOG.trace("Getting message from user " + protocol.getContent());
                } else {

                    LOG.trace("Nop it no the end " + buffer);
                }
            }
        }

    } catch (IOException e) {
        e.printStackTrace();

    } catch (JAXBException e) {
        e.printStackTrace();

    } finally {
        try {
            socket.close();
            LOG.trace("Socket closed");
        } catch (IOException e) {
            LOG.error("Socket no closed" + e);
        }
    }
}

然后这个Unmarshall操作挂起。并且它甚至没有显示任何异常。

Then this Unmarshall operation hangs. And it show me nothing even Exception.

推荐答案

是的,我发现了这个问题的解决方案! JAXB不是SOCKET流的最佳决策,因为它等待流的结束。解决方案是使用清晰的SAX解析器,您可以在其中编写自己的ParserHandler(DefaultHandler.class),当您到达最后一个标记时,应该抛出自己的异常,表示停止解析。

Yeah i found solvation of this issue! JAXB is not the best decision to SOCKET streams, cause it wait the end of the stream. Solution is to use clear SAX parser where you can to write your own ParserHandler (DefaultHandler.class) and when you reach your last tag, you should to throw your own exception which indicates to stop parsing.

这篇关于解组套接字流时JAXB挂起的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆