【发布时间】:2013-05-05 16:02:27
【问题描述】:
我有一个想要运行的无客户端应用程序。它没有客户端,但会进行 HTTP 调用并充当其他服务的客户端。它可能会运行几个小时或几天(但它不需要定期运行——只需一次)。
我想在 Java EE 7 容器中运行它,因为标准上下文依赖注入 (CD) 和标准 JAX-RS 客户端(自 Java EE 7 以来的新功能)的好处。有JMS、JPA等服务也不错。
问题是如何以标准方式编写/注释 main 方法? @Inject 在方法上是不好的,因为这样的方法必须快速返回。 @Schedule 并不理想,因为它会定期运行,除非我以编程方式确定当前系统时间。
我能想到的最好办法是在 @Inject 方法中设置一次性 Timer 并用 @Timeout 注释我的主要方法。
不知何故,这似乎有点脆弱或不雅。 是否有更好的标准方式来启动服务?一些注释会导致它启动并开始运行?
此外,在取消部署时中断和关闭服务的最佳标准方法是什么?
【问题讨论】:
-
你的问题有点绕。如果您在应用程序容器中运行应用程序,那么为什么要定义 main 方法?只需使用
@Schedule方法创建一个启动单例 EJB。 -
@Perception 曲折反映了我缺乏清晰度,因此提出了这个问题。
@Schedule需要一些时间。我应该在什么时候注释该方法?我不希望它定期运行。该方法需要运行一次。如果@Schedule在部署后接受一个间隔,那将是完美的,但事实并非如此。我可以使用@Schedule ... myfunc (Timer timer)并取消传入计时器并使用TimerService设置一个间隔计时器来运行@Timeout ... mymain ()所涉及的声音。 -
不知道您是编辑了问题还是我错过了底部。发誓它读起来不一样。无论如何,一个想法 - 使用启动单例 bean 并在其 @PostConstruct 方法中创建一个计时器。或者,嵌入像 Quartz 这样的第三方库,并安排一个非重复的作业,以便在部署应用程序时启动该作业。作业的日程安排要求是什么(应用部署、特定日期、按需运行?)。
-
@Perception 可能是您的看法 ;-) 我没有编辑,如果我编辑了,编辑将可用。在您上次发表评论后,我确实编辑了我的用户名。计划要求是“在应用程序部署上”。感谢您的建议。我不喜欢使用第三方库,但我会尝试使用
@PostConstruct计时器。 -
@Perception(续)关于关闭,是否可以让
@PreDestroy设置一个标志并等待主方法持有的锁,当主通知标志并结束时释放该锁?本质上,我想在没有任何其他手动或非标准技术的情况下停止取消部署并开始部署。
标签: jakarta-ee cdi seam3 weld java-ee-7