【发布时间】:2016-03-25 21:41:10
【问题描述】:
我想要实现的功能:
- 安排时事通讯发送给客户
- 我有一个允许用户触发计划的 JSF 页面。一旦触发了新的日程安排,该日程安排信息将被添加到同一页面的进度部分。进度部分是一个表格,其中每一行代表一个时间表。每个时间表显示已发送的电子邮件数量。单击“刷新”按钮后,进度表会刷新以显示当前状态。
使用的相关技术
- JSF
- EJB
问题
我已经安排了电子邮件,但我不知道如何在 JSF 页面上检索状态。
我的会话 bean 看起来像这样:
@Stateless
public class DefaultEmailScheduleService implements EmailScheduleService {
Queue<String> emailAddresses;
@Resource
TimerService timerService;
@EJB
EmailService emailService;
@PostConstruct
private void postConst() {
}
@Override
public void scheduleEmails(ScheduleExpression se, Collection<String> emailAddresses) {
//set timer
this.emailAddresses = new ConcurrentLinkedQueue<>(emailAddresses);
TimerConfig timerConfig = new TimerConfig();
timerConfig.setPersistent(false);
Timer timer = timerService.createCalendarTimer(se, timerConfig);
//TODO update newsletter/email history
}
@Timeout
public void send(Timer timer) {
if(!emailAddresses.isEmpty()){
Newsletter newsletter = new Newsletter();
newsletter.setTo(emailAddresses.poll());
newsletter.setSubject("Testing");
newsletter.setContent("This is testing newsletter");
emailService.send(newsletter);
System.out.println(newsletter.getFrom() + " --- sent");
}
else {
System.out.println("no more emails");
timer.cancel();
}
}
}
我的解决方案
到目前为止,我发现的有点骇人听闻的解决方案是,每次发送从队列轮询的 Newsletter 对象时,我都会将此 Newsletter 对象保存到应用程序范围的 bean(如一个单例),以便 JSF 页面可以检索发送的时事通讯。当队列为空时,我清理 Application bean 并更新数据库。但是,出于某种原因,我觉得这种方法有点味道。
非常感谢任何帮助。
【问题讨论】: