我正在使用Java开发电子邮件应用程序,并且正在尝试实现Java线程池以将进程分为多个线程。
我有10个线程尝试向多个收件人发送电子邮件,现在的问题是,当我运行代码时,它将显示池中具有的线程数,而忽略了在类中执行我的方法。
这是我的代码:
package system.soft.processor;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import system.source.DjadeUtil;
public class MailTransporter {
// HERE WE SET PUBLIC VARIABLES
private SetBase Setting;
private String[] Mails;
private String Messaging;
private String Title;
private static final String TEMPLATESOURCE="data/templates/vs1/newslatter.php";
// LETS CONSTRUCT MAIN CLASS
public MailTransporter(String[] mails, SetBase setting){
Setting=setting;
Mails=mails;
};
/********************** SETTING THE GETTERS METHODS ************************/
public void subject(String subject){
Title=subject;
}
public void message(String message){
Messaging=message;
}
/********************** CONSTRUCTING THE SEND METHOD ***********************/
public static void main(String[] args){
// HERE WE CONSTRUCT THE SEND
SetBase setting=new SetBase();
String[] mails={"gettrafficworld@yahoo.com", "chineduweb@gmail.com"};
String title="Testing Dynamic Message";
String message="This is the body of the message";
int NUM_THREADS=Integer.parseInt(setting.get("maxThread"));
MailTransporter transport=new MailTransporter(mails, setting);
transport.subject(title);
transport.message(message);
// Create a thread pool
ExecutorService es = Executors.newFixedThreadPool(NUM_THREADS);
List<Future<Integer>> futures = new ArrayList<>(NUM_THREADS);
// Submit task to every thread:
for (int i = 0; i < NUM_THREADS; i++) {
futures.add(i, es.submit((Callable<Integer>) new Transporter(transport)));
}
// Shutdown thread pool
es.shutdown();
System.out.println(futures.size());
}
/********************** CONSTRUCTING THE TRANSPORT METHOD ***********************/
private Integer transport(String[] mails, String title, String messaging){
// HERE WE START PROCESSING THE TRANSPORT
Integer sent=0;
// HERE WE START PROCESSING
// Sender's email ID needs to be mentioned
String from = Setting.get("from");
// Get system properties
Properties properties = props();
System.out.println(properties);
// Get the default Session object.
Session session = session(properties);
try {
// Create a default MimeMessage object.
MimeMessage message = new MimeMessage(session);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.addRecipients(Message.RecipientType.TO, mailAddress(mails));
// Set Subject: header field
message.setSubject(Title);
// Send the actual HTML message, as big as you like
message.setContent(msgTranslate(Title, Messaging), "text/html");
// Send message
Transport.send(message);
// Setting the message return
sent=mails.length;
} catch (MessagingException mex) {
mex.printStackTrace();
}
// Here we return int
return sent;
}
/******************* CONSTRUCTING THE MESSAGE TRANSLATOR ********************/
private String msgTranslate(String subject, String messaging){
// HERE WE START CONSTRUCTING THE MESSAGE TRANSLATE
String data="";
DjadeUtil util=new DjadeUtil();
// NOW LETS START PROCESSING
if(messaging!=null && subject!=null){
// Now lets read
try {
data=util.readByScanner(TEMPLATESOURCE);
// Now lets check
if(data.length()>0){
data.replaceAll("%title%", subject);
data.replaceAll("%message%", messaging);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Here we return string
return data;
}
/******************* CONSTRUCTING RECEPIENT PARSER METHOD *******************/
private InternetAddress[] mailAddress(String[] mails){
// HERE WE START PROCESSING THE MAIL ADDRESSES
InternetAddress[] address={};
// NOW LETS START
if(mails!=null){
if(mails.length>0){
address=new InternetAddress [mails.length];
for(int i=0; i<mails.length; i++){
try {
address[i]=new InternetAddress(mails[i]);
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
// Here we return address
return address;
}
/********************** CONSTRUCTING THE PROPERTY METHOD ********************/
private Properties props(){
// HERE WE START SETTING MESSAGE PROPERTIES
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
Properties properties = System.getProperties();
String host = "localhost";
// HERE WE START SETTING
// Setup mail server
properties.setProperty("mail.smtp.host", host);
properties.setProperty("mail.smtp.host", Setting.get("host"));
properties.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
// properties.put("mail.smtp.ssl.trust", "*");
properties.setProperty("mail.smtp.socketFactory.fallback", "false");
properties.put("mail.smtp.socketFactory.port", Setting.get("port"));
properties.setProperty("mail.smtp.port", Setting.get("port"));
properties.setProperty("mail.smtp.socketFactory.port", Setting.get("port"));
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.debug", "true");
properties.put("mail.store.protocol", Setting.get("sp"));
properties.put("mail.transport.protocol", Setting.get("tp"));
// Here we return property
return properties;
}
/********************** CONSTRUCTING THE SESSION METHOD ***********************/
private Session session(Properties props){
// HERE WE START SETTING THE SESSION
// Get the default Session object.
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(Setting.get("username"), Setting.get("password"));
}
});
// Here we return session
return session;
}
/******************** HERE WE CONSTRUCT TRANSPORT CLASS ***********************/
public static final class Transporter implements Callable<Integer>{
// HERE WE CONSTRUCT CLASS
private String Message;
private String Title;
private String[] Mails;
MailTransporter Transport;
public Transporter(MailTransporter transport){
Mails=transport.Mails;
Title=transport.Title;
Message=transport.Messaging;
Transport=transport;
}
/*********** HERE WE CALL THE CALLABLE ***********/
@Override
public Integer call() throws Exception {
return Transport.transport(Mails, Title, Message);
}
// END OF INNER CLASS
}
// END OF OUTER CLASS
}
我无法弄清楚我的代码出了什么问题。我似乎无法获得我想要的输出。该代码未发送我的邮件,当我尝试将其放在一起时,仍无法正常工作。
答案 0 :(得分:1)
我建议捕获任何异常或错误,否则它将以静默方式存储在您要丢弃的submit
返回的Future中。
@Override
public Integer call() throws Exception {
try {
return Transport.transport(Mails, Title, Message);
} catch (Throwable t) {
t.printStackTrace();
throw new RuntimeException(t);
}
}
没有这些,您的任务将在异常或错误时静默地死掉,并且您不知道为什么