контейнерный класс для gnu.mail.providers.nntp.NNTPMessage - PullRequest
0 голосов
/ 03 апреля 2012

Почему Glassfish показывает эту ошибку:

javax.el.ELException: /foo/client.xhtml @11,74 value="#{messageBean.messages}": javax.mail.MessagingException: Socket closed;
  nested exception is:
    java.net.SocketException: Socket closed

Что я приписываю слишком частому и слишком быстрому leafnode на локальном хосте.Журналы Glassfish ниже показывают успешные извлечения сообщений из листового узла, но множественные вызовы SingletonNNTP.loadMessages ().

Как правильно обрабатывать сокеты?Иногда Leafnode дает желаемый результат, иногда нет.

INFO: Initializing Mojarra 2.1.6 (SNAPSHOT 20111206) for context '/NNTPjsf'
INFO: WEB0671: Loading application [NNTPjsf] at [/NNTPjsf]
INFO: NNTPjsf was successfully deployed in 2,574 milliseconds.
INFO: MessageBean..
INFO: MessageBean..
INFO: MessageBean.getMessages..
INFO: MessageBean.getNNTP..
INFO: MAKING SINGLETON..
INFO: NNTP.loadMessages...
INFO: NNTP.loadMessages...
nntp: <200 Leafnode NNTP Daemon, version 1.11.8 running at localhost (my fqdn: dur.bounceme.net)
nntp: >GROUP comp.lang.java.help
nntp: <211 82 3 84 comp.lang.java.help group selected
nntp: >GROUP comp.lang.java.help
nntp: <211 82 3 84 comp.lang.java.help group selected
nntp: >XHDR Message-ID 3-84
nntp: <221 Message-ID header (from overview) for postings 3-84:
nntp: <3 <afp6m75oi6nli4b6q87s317lkc13g689c2@4ax.com>
nntp: <4 <ed7f31e9-8a19-46c7-9a7c-ad8aabfb9599@x10g2000pbi.googlegroups.com>
nntp: <5 <uA4ar.13560$fj7.13111@newsfe20.iad>

Поддерживающий компонент выглядит так:

package net.bounceme.dur.nntp;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.context.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.inject.Named;
import javax.mail.Message;

@Named
@SessionScoped
public class MessageBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private static final Logger logger = Logger.getLogger(MessageBean.class.getName());
    private static Level level = Level.INFO;
    private DataModel dm = null;

    public MessageBean() {
        logger.log(level, "MessageBean..");
    }

    public List<Message> getMessages() throws Exception {
        logger.log(level, "MessageBean.getMessages..");
        List<Message> messages = getNNTP();
        return messages;
    }

    public DataModel getModel() throws Exception {
        logger.log(level, "MessageBean.getModel..");
        List<Message> messages = getNNTP();
        dm = new ListDataModel(messages);
        return dm;
    }

    private synchronized List<Message> getNNTP() throws Exception {
        logger.log(level, "MessageBean.getNNTP..");
        List<Message> messages = new ArrayList<Message>();
        SingletonNNTP nntp = SingletonNNTP.INSTANCE;
        messages = nntp.getMessages(false);
        logger.log(level, "MessageBean.getNNTP nntp.size:  {0}", messages.size());
        return messages;
    }
}

Синглтон:

package net.bounceme.dur.nntp;

import static java.lang.System.out;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.*;

public enum SingletonNNTP {

    INSTANCE;
    private final Logger logger = Logger.getLogger(SingletonNNTP.class.getName());
    private final Level level = Level.INFO;
    private Properties props = new Properties();
    private List<Message> messages = new ArrayList<Message>();

    private SingletonNNTP() {
        out.println("MAKING SINGLETON..");
        props = PropertiesReader.getProps();
        boolean loaded = false;
        try {
            loaded = setMessages(false);
        } catch (Exception ex) {
            Logger.getLogger(SingletonNNTP.class.getName()).log(Level.SEVERE, "FAILED TO LOAD MESSAGES", ex);
        }
    }

    public List<Message> getMessages(boolean debug) throws Exception {
        logger.log(level, "NNTP.getMessages...");
        logMessages();
        return Collections.unmodifiableList(messages);
    }

    private boolean setMessages(boolean debug) throws Exception {
        logger.log(level, "NNTP.loadMessages...");
        Session session = Session.getDefaultInstance(props);
        session.setDebug(debug);
        Store store = session.getStore(new URLName(props.getProperty("nntp.host")));
        store.connect();
        Folder root = store.getDefaultFolder();
        Folder folder = root.getFolder(props.getProperty("nntp.group"));
        folder.open(Folder.READ_ONLY);
        Message[] msgs = folder.getMessages();
        messages = Arrays.asList(msgs);
        folder.close(false);
        store.close();
        if (debug) {

        }
        return true;
    }

    private void logMessages() throws Exception {
        logger.log(level, "NNTP.logMessages..");
        for (Message m : messages) {
            logger.log(level, String.valueOf(m.getMessageNumber()));
            logger.log(level, m.getSubject());
            logger.log(level, m.getContent().toString());
        }
    }

    private void persistMessages() throws Exception {
        //entities.Messages
    }
}

1 Ответ

1 голос
/ 03 апреля 2012

Это сообщение означает, что вы закрыли сокет, а затем попытались прочитать или записать его.Вы пытаетесь прочитать содержание сообщения после закрытия соединения.Вам нужно сохранять не сами Сообщения, а их содержимое, пока соединение открыто.

...