Невозможно проверить процесс, запланированный JBoss вне JBoss - PullRequest
0 голосов
/ 06 января 2012

У меня есть процесс JBoss Scheduled (JBoss 5.0.0.GA, org.jboss.varia.scheduler.Scheduler), который запущен в производство.Это делает свою работу.У него нет юнит-тестов.И мне нужно изменить его.

Работа заключается в том, чтобы подключиться к серверу Exchange компании через IMAP, сканировать определенную папку на наличие новых сообщений и что-то делать с найденными сообщениями.

Итак, моя первая цель - написать несколько простых модульных тестов, и первое, что я хочу сделать, - это просто получить количество сообщений в папке.Код для этого, включая печать количества сообщений в папке, уже находится в рабочем коде.Создавая SSCCE для этого поста, я, по сути, просто удалил часть «и сделайте что-нибудь с сообщениями, которые он находит», вместе с небольшим количеством запутывания и упрощения.

Итак, теперь код:

package com.mycompany.utils;

import org.apache.log4j.Logger;
import org.jboss.varia.scheduler.Schedulable;

import java.util.Date;
import java.util.Properties;
import javax.mail.Folder;
import javax.mail.Session;
import javax.mail.Store;

public class BouncedEmailSimple implements Schedulable {
    private static final Logger logger = Logger.getLogger("com.mycompany.utils");

    @Override
    public void perform(Date pTimeOfCall, long pRemainingRepetitions) {
        String popHost = "192.168.1.55";
        String smtpHost = "192.168.1.55";
        String popUser = "username";
        String popPasswd = "password";
        Session session = null;
        Folder folder = null;
        Store store = null;

        try {
            Properties sysProperties = System.getProperties();
            sysProperties.put("mail.smtp.host", smtpHost);
            session = Session.getInstance(sysProperties, null);
            session.setDebug(false);

            logger.info("Started Bounce Email Simple process.");
            logger.info("user:" + popUser);
            logger.info("smtp:" + smtpHost);
            logger.info("pop:" + popHost);

            store = session.getStore("imap");
            store.connect(popHost, popUser, popPasswd);

            logger.info("store:" + store);

            folder = store.getDefaultFolder();

            logger.info("1");

            if (folder == null) {
                logger.error("No Default Mail Folder");
                throw new Exception("No Default Mail Folder");
            }

            logger.info("2");

            folder = folder.getFolder("Bounces");

            logger.info("3");

            if (folder == null) {
                logger.error("Bounce Mail folder not available");
                throw new Exception("Bounce Mail folder not available");
            }

            logger.info("4");

            folder.open(Folder.READ_WRITE);

            logger.info("5");

            int totalMessages = folder.getMessageCount();

            logger.info("6");

            if (totalMessages == 0) {
                folder.close(false);
                store.close();
                return;
            }

            logger.info("7");
            logger.info("Messages to process = [" + totalMessages + "]");
            logger.info("8");

            System.out.println("Ended Bounce Email Simple processes.");
        } catch (Exception ex) {
            logger.error("BouncedEmailSimple Server Failure");
            logger.error("Error = [" + ex.getMessage() + "]");

            try {
                if (folder.isOpen()) {
                    folder.close(false);
                }
            } catch (Exception ex3) {
                ex3.printStackTrace();
            }
            ex.printStackTrace();
        } finally {
            try {
                if (store.isConnected()) {
                    store.close();
                }
            } catch (Exception ex4) {
                ex4.printStackTrace();
            }
        }
    }
}

И пример модульного теста:

package com.mycompany.utils;

import org.junit.Test;

import java.util.Date;

import static org.junit.Assert.fail;

public class BouncedEmailSimpleTest {
    @Test
    public void actualTest() {
        try {
            BouncedEmailSimple bes = new BouncedEmailSimple();
            bes.perform(new Date(), 0);
        } catch (Exception e) {
            e.printStackTrace();
            fail();
        }
    }
}

Когда я запускаю его, вывод:

$ cat junit/TEST-com.mycompany.utils.BouncedEmailSimpleTest.txt 
Testsuite: com.mycompany.utils.BouncedEmailSimpleTest
Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0.603 sec
------------- Standard Output ---------------
- Started Bounce Email Simple process.
- user:devsupport
- smtp:192.168.1.55
- pop:192.168.1.55
- store:imap://username@192.168.1.55
- 1
- 2
- 3
- 4
------------- ---------------- ---------------

Testcase: actualTest took 0.43 sec
    Caused an ERROR
com/sun/mail/util/MessageRemovedIOException
java.lang.NoClassDefFoundError: com/sun/mail/util/MessageRemovedIOException
    at com.sun.mail.imap.IMAPFolder.open(IMAPFolder.java:809)
    at com.mycompany.utils.BouncedEmailSimple.perform(Unknown Source)
    at com.mycompany.utils.BouncedEmailSimpleTest.actualTest(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.sun.mail.util.MessageRemovedIOException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

У меня mail.jar (версия 1.3что-то) в моем classpath для моего модульного теста, и эта версия mail.jar не содержит вышеуказанного класса.Тем не менее, я также скачал JavaMail версии 1.4.4, которая имеет вышеупомянутый класс и включила 1.4.4 (а также исключил 1.3.something) в пути к классам.Это приводит к другой ошибке, к которой я не могу получить доступ прямо сейчас (я больше не на своем рабочем компьютере, где была запущена эта публикация ...) Однако, кажется, что здесь есть что-то более фундаментальное или, по крайней мере, более конкретноек JBoss, чем я положительно на данный момент.Версия mail.jar на пути к классам JBoss также не содержит приведенный выше класс, поэтому я более чем запутался.

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 06 января 2012

В вашем classpath должна быть только одна версия mail.jar.Как вы обнаружили, смешивание и сопоставление разных версий не работает.

0 голосов
/ 06 января 2012

Когда я пришел на работу этим утром, я добавил обратно jar JavaMail 1.4.4 в мой путь к классу (и удалил jars 1.3.something), снова запустил свой тест, и он работалЯ списываю это на «что-то изменилось с сервером Exchange за ночь».Спасибо всем за помощь.

0 голосов
/ 06 января 2012

Mike

Я только что посмотрел на mail-1.3.jar и mail-1.4..4.jar, и вы правы насчет этого класса "MessageRemovedIOException". Возможно, вы используете последнюю версию imap.jar, которая ожидает этот класс. Похоже, эти 2 jar (и другие pop3, smtp) идут вместе с реализацией Javamail.

Удачи.

...