2015-06-03 6 views
1

Моя цель - настроить запланированное задание, которое запускается при запуске.Simulate @Startup на EJB 3.0 (WebLogic 11gR1)

на EJB 3.1, я мог бы сделать что-то вроде:

@Startup 
@Stateless 
public class SchedulePoller { 

    @Resource 
    TimerService timerService; 

    @PostConstruct 
    public void defineScheduler() { 
     timerService.createTimer(60000, 60000, null); 
    } 

    @Timeout 
    public void checkSchedule(Timer timer) { 
     System.out.println("time: " + new Date()); 
    } 
} 

Теперь моя проблема заключается в том, что @Startup не доступен в EJB 3.0, которая является самой последней версии поддерживается на WebLogic 11gR1 (10.3.5). Это означает, что Bean не сконструирован, поэтому не вызывается метод defineScheduler.

Я прочитал, что возможное решение заключается в определении HttpServlet, с закачиваемой мой Bean, переопределить метод init и положить <load-on-startup> в web.xml файле. Я не могу использовать этот метод, потому что мой проект является модулем EJB, и у меня нет веб-контекста.

Единственное другое решение, о котором я думал до сих пор, заключается в том, чтобы изменить Bean на @MessageDriven и поместить сообщение в очередь после запуска, но для каждого развертывания это потребует дополнительных действий.

Есть ли способ воспроизвести аннотацию @Startup? Лучший вариант заключается в том, что Bean автоматически запускается при запуске, но я могу рассмотреть также сценарий для добавления в StartWebLogic.cmd или любой другой «автоматический» способ.

спасибо.

ответ

2

Нет, нет другого варианта для EJB 3.0. Вы сказали, что ваш проект является модулем EJB, но мое предложение по-прежнему заключалось бы в создании еще одного модуля WAR для запуска вашего запуска. Я бы использовал ServletContextListener, а не сервлет load-on-startup, так как вы фактически не хотите иметь конечную точку в WAR, вы просто хотите (ab) использовать ее для уведомления о запуске приложения.

1

мне пришлось создать еще один проект с расширением «веб-модуль Dynamic», просто редактировать web.xml с этой информацией

<listener> 
    <listener-class>it.project.scheduler.InitServletContainer</listener-class> 
</listener> 

В моем существующем проекте, я добавил слушатель implentation

public class InitServletContainer implements ServletContextListener { 

    @EJB 
    private transient SchedulePollerLocal schedulerBean; 

    @Override 
    public void contextInitialized(ServletContextEvent arg0) { 
     schedulerBean.defineScheduler(); 
    } 

} 

В конце концов, мне пришлось добавить этот проект в EAR