我有一个我希望运行的非客户端应用程序。它将没有客户端,但它会进行HTTP调用并充当其他服务的客户端。它可能会运行几个小时或几天(但它不需要定期运行 - 只是一次性)。如何在Java EE中使用CDI编写main()?
由于标准上下文依赖注入(CD)和标准JAX-RS客户端(自Java EE 7以来的新增功能)的好处,我想在Java EE 7容器中运行它。拥有诸如JMS,JPA之类的服务也不错。
问题是如何以标准方式编写/注释主要方法? @Inject
上的方法是不好的,因为这样的方法必须很快返回。 @Schedule
是不理想的,因为它定期运行,除非我以编程方式确定当前系统时间。
我能想到的最好方法是在@Inject
方法中设置一个Timer
方法,并用@Timeout
注释我的主方法。
不知何故,这似乎有点脆弱或不雅。 有没有更好的标准方式来启动服务?一些注释会导致它开始并开始行动?
此外,如何在取消部署时中断和关闭服务的最佳标准方式是?
你的问题有点曲折。如果您正在应用程序容器中运行应用程序,那么为什么要定义一个主要方法?使用['@ Schedule'](http://docs.oracle.com/javaee/6/api/javax/ejb/Schedule.html)方法创建一个启动的单例EJB。 – Perception 2013-05-10 21:55:59
@Perception蜿蜒是我缺乏清晰度的反映,因此是一个问题。 '@ Schedule'需要一段时间。我应该什么时候注释该方法?我不希望它定期运行。该方法需要运行一次。如果'@ Schedule'接受部署后的时间间隔,那将是完美的,但事实并非如此。我可以使用'@Schedule ... myfunc(定时器定时器)'并取消传入的定时器并使用'TimerService'设置间隔定时器来运行'@Timeout ... mymain()'声音。 – necromancer 2013-05-10 22:00:51
不知道你是否编辑了你的问题,或者我错过了底部。会发誓它读不同。无论如何,一个想法 - 使用一个启动,单身bean,并在其@PostConstruct方法中创建一个计时器。或者,嵌入像Quartz这样的第三方库,并安排一个非重复的作业,以便在部署应用程序时启动作业。该工作的计划要求是什么(应用程序部署,特定日期,按需运行?)。 – Perception 2013-05-10 22:20:03