2

以下のように書きましたが、すぐに終了します。

public static void main(String[] args) {
    new ClassPathXmlApplicationContext("/springtests/test01.xml");
}

test01.xmlネットワークなどに接続するいくつかのスレッド (デーモン) を持つ複数の Bean が含まれています。

待ち方か何か?

4

6 に答える 6

4

ここでオブジェクトを作成するだけです。Bean を取得してから使用する必要があります。例えば

ApplicationContext ctx = new ClassPathXmlApplicationContext("/springtests/test01.xml");
MyClass myObj= MyClass.class.cast(ctx.getBean("myBeanName"));         
myObj.doStuff();

さらにヘルプが必要な場合は、test01.xml の内容を投稿してください

于 2012-09-26T18:09:20.050 に答える
1

他の回答の推奨事項のほとんどに同意しますが、主な方法はそのままで問題ないと思います。変更する必要があるのは、少なくとも 1 つのワーカー スレッドを非デーモンにすることだけです。

Thread.setDaemon Java doc から:

実行中のスレッドがすべてデーモン スレッドのみの場合、Java 仮想マシンは終了します。

また、すべてのスレッドが Bean の init メソッド (または afterPropertiesSet) 中に開始され、Bean の開始 (ライフサイクル インターフェイスの実装) を必要としないことを確認してください。すべての Bean をコーディングした方法では、初期化されますが、開始されません。

于 2012-09-26T18:20:12.083 に答える
1

How to wait or something?

I've used something like the following pattern. My Main thread starts the context and then waits for someone else to call Main.shutdownLatch.countDown() command to tell it to close the context and exit. I usually do this with a JMX command.

public static CountDownLatch shutdownLatch = new CountDownLatch(1);
public static void main(String[] args) {
    ApplicationContext context =
       new ClassPathXmlApplicationContext("/springtests/test01.xml");
    try {
        shutdownLatch.await();
    } finally {
        context.close();
    }
}
于 2012-09-26T19:23:05.313 に答える
0

Bean に次のように実装させることができますApplicationListener<ContextStartedEvent>

@Override
public final void onApplicationEvent(ContextStartedEvent event) {...

そして多分またExitCodeGenerator

@Override
public int getExitCode() {

次に、主な方法は次のとおりです。

public static void main(String[] args) {
    try (ConfigurableApplicationContext context = SpringApplication.run(AppConfig.class, args)) {
        context.start();
        System.exit(SpringApplication.exit(context));
    }
}
于 2014-11-05T13:23:22.250 に答える
0

applicationContext の Bean が適切にシャットダウンされるcontext.registerShutdownHook()ように呼び出すことができますが、applicationContext がデーモン スレッドのみを開始する場合は、メイン スレッドが終了しないようにする必要があります。

より良い戦略はmain()、呼び出し可能なコンテキストからいくつかの Bean を取得bean.startApp()し、物事を開始することです。または、コンテキストで開始されたスレッドの少なくとも 1 つを非デーモンにすることです。

于 2012-09-26T18:09:28.623 に答える