1

実行したい非クライアント アプリケーションがあります。クライアントはありませんが、HTTP 呼び出しを行い、他のサービスのクライアントとして機能します。おそらく数時間または数日実行されます (ただし、定期的な実行は必要ありません。1 回だけ実行するだけです)。

標準の Context Dependency Injection (CD) と標準の JAX-RS クライアント (Java EE 7 以降の新機能) の利点があるため、Java EE 7 コンテナーで実行したいと考えています。JMS、JPAなどのサービスがあるのもうれしい。

問題は、標準的な方法で main メソッドをどのように記述/注釈付けするかです。@Injectそのようなメソッドはすぐに返さなければならないので、メソッドをオンにするのは良くありません。@Scheduleプログラムで現在のシステム時間を決定しない限り、定期的に実行されるため、理想的ではありません。

私が思いついた最善の方法は、メソッドにワンショットを設定しTimer@Injectメイン メソッドに で注釈を付けること@Timeoutです。

どういうわけか、これは少しもろく、またはエレガントではないようです。サービスを開始するためのより良い標準的な方法はありますか? それを開始して開始させるだけの注釈はありますか?

さらに、アンデプロイ時にサービスを中断してシャットダウンするための標準的な最良の方法は何ですか?

4

2 に答える 2

3

PostConstruct が長時間実行されている場合は、イベントと分離します。

@Singleton
@Startup
public class YourBean{
@Inject
private Event<XXX> started; 
@PostConstruct
private void theMainMethod(){
    started.fire(new XXX());
}
public void handleStarted(@Observes XXX started) {
    // the real main method.
}

}

于 2013-05-11T21:10:37.790 に答える
2

EJBwith(or instead of) を使用できる場合は、Bean とメソッドに+アノテーションをCDI試してください。@Singleton@Startup@PostConstructmain()

@Singleton
@Startup
public class YourBean {

@Stateless
public static class BeanWithMainMethod{

    @Asynchronous
    public void theMainMethod(){
        System.out.println("Async invocation");
     }
}

    @EJB
    private BeanWithMainMethod beanWithMainMethod;

    @PostConstruct
    private void launchMainMethod(){
        beanWithMainMethod.theMainMethod();
    }
}
于 2013-05-11T18:04:08.147 に答える