Java多线程应用程序未运行方法

时间:2018-07-28 13:22:46

标签: java multithreading javamail threadpool

我正在使用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
}

我无法弄清楚我的代码出了什么问题。我似乎无法获得我想要的输出。该代码未发送我的邮件,当我尝试将其放在一起时,仍无法正常工作。

1 个答案:

答案 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);
        }
    }

没有这些,您的任务将在异常或错误时静默地死掉,并且您不知道为什么