Проблема инициализации движка Java Velocity - PullRequest
4 голосов
/ 29 декабря 2011

У меня написана библиотека, в которой есть часть построения почты.Эта часть создания почты использует Velocity.Класс mailbuilder выглядит следующим образом -

public class mailBuilder {
 public void initialize() throws Exception
    {
            Properties props = new Properties();

            log.info("About to set the ClassPath for Velocity specific tasks");
            props.setProperty(VelocityEngine.RESOURCE_LOADER, "classpath");
            props.setProperty("classpath." + VelocityEngine.RESOURCE_LOADER + ".class", ClasspathResourceLoader.class.getName());

            try
            {
                log.info("Just before");
                Velocity.init(props);
                log.info("Just after");
            }
            catch ( Exception e )
            {
                log.error( "Caught Execption on velocityEngine init", e );
                throw new Exception( "Caught Execption on velocityEngine init", e );
            }
            log.info("Completed initializing Velocity Engine");

    }

public String returnMailstring() throws Exception {
initialize();
....
....
}

}

Теперь, когда я запускаю и тестирую эту библиотеку как есть из Eclipse, она дает ожидаемые результаты, и все выглядит хорошо.У меня есть веб-приложение, которое принимает запрос от пользовательского интерфейса и использует ExecutorService (newSingleThreadExecutor) для обслуживания этих пользовательских запросов один за другим в фоновом режиме.

Я замечаю, что мои вызовы в вышеупомянутую библиотекузацикливание на части создания почты, в частности, на Velocity.init(props) Нет исключений, но поток, кажется, зависает при инициализации VelocityEngine.Я посмотрел в Интернете, и мне не повезло с проблемой.Любая помощь в том, как проблема будет огромной.

Спасибо p1ng

Ответы [ 2 ]

9 голосов
/ 29 декабря 2011

Для использования скорости есть две модели:

  1. Модель Singleton, т.е. Velocity.init(..), здесь у вас есть только одна конфигурация скорости в вашем приложении. Вы должны вызывать init только один раз в этом случае при запуске приложения через прослушиватель или любой инициализирующий компонент.
  2. В многомодельной стартовой версии 1.2 вы можете использовать несколько скоростных двигателей, используя несколько конфигураций, которые модель использует как таковые:
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.Template;

...


//  create a new instance of the engine
 VelocityEngine ve = new VelocityEngine();


//  configure the engine.  In this case, we are using
//  ourselves as a logger (see logging examples..)


ve.setProperty(
    VelocityEngine.RUNTIME_LOG_LOGSYSTEM, this);

//  initialize the engine
ve.init();

...

Template t = ve.getTemplate("foo.vm");

, поэтому просто выберите модель, которую вы хотите использовать, и следуйте ей. но вызов Velocity.init () в многопоточном режиме, безусловно, должен вести к нежелательному поведению.

1 голос
/ 02 января 2012

Эта проблема была из-за того, что мой код не был потокобезопасным.Сделать это так, чтобы решить проблему.Я все еще понимаю необходимость того, чтобы код был потокобезопасным в случае использования SingleThreadExecutor.Вот что приводит к ответу - Ошибка при выполнении асинхронных задач с использованием ExecutorService

...