问题
Why does Glassfish shows this facelets error:
javax.el.ELException: /foo/client.xhtml @11,74 value="#{messageBean.messages}": javax.mail.MessagingException: Socket closed;
nested exception is:
java.net.SocketException: Socket closed
Which I attribute to hitting leafnode on localhost too frequently and too rapidly. Glassfish logs below show successful message retrievals from leafnode, but multiple calls to SingletonNNTP.loadMessages().
How can deal with sockets correctly? Sometimes Leafnode gives desired output, sometimes not.
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>
The backing bean as so:
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;
}
}
the Singleton:
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:
That message means that you closed the socket and then tried to read from or write to it. You are trying to read Message content after you have closed the connection. You need to save not the Messages themselves but their content, while the connection is open.
来源:https://stackoverflow.com/questions/9985444/container-class-for-gnu-mail-providers-nntp-nntpmessage