JBossサービス(MBean)の自動開始
質問
サーバーが開始されるたびに自動的に開始されるJBossサービスを構築しようとしています。
サービスに次のクラス構造があります:
public interface CumbiaXPMServiceMBean extends org.jboss.system.ServiceMBean
public class CumbiaXPMService extends org.jboss.system.ServiceMBeanSupport implements CumbiaXPMServiceMBean
サービス用に次の設定ファイルjboss-service.xmlを用意しています:
<server>
<mbean code="uniandes.cumbia.xpm.jboss.CumbiaXPMService"
name="jcumbia:service=JCumbiaEngine">
<depends>jcumbia:service=cumbiaConsole</depends>
<attribute name="LocationInCumbia" attributeClass="java.lang.String">XPMEngine</attribute>
</mbean>
</server>
私の質問は:このサービスを自動的に開始するにはどうすればよいですか?
JBossはロードプロセスの一部としてメソッドstart()を呼び出すことを期待していましたが、そうではありません:start()メソッドに多くのロギンコードがありますが、出力が表示されていません。
ただし、JMXConsoleを使用してMBeanのステータスを見ると、その状態(StateString)は「開始済み」です。
問題の解決
問題の解決策を見つけました。メソッドstart()、stop()、destroy()、create()をオーバーライドしていました。それでも、抽象クラスServiceMBeanSupportを拡張しているため、startService()、stopService()などのメソッドをオーバーライドする必要があります。
コードをメソッドstart()からメソッドstartService()に移動したところ、すべてが必要に応じて動作するようになりました:依存関係が満たされるとすぐにサービスが開始され、メソッドstartService()が実行されます。
結論は次のとおりです:MBeanのライフサイクルにはcreate()、start()、stop()およびdestroy()の呼び出しが含まれますが、抽象クラスServiceMBeanSupportの実装はこれらのメソッドを使用してライフサイクルを処理します。それにもかかわらず、プログラマーがライフサイクルに参加できるように、保護されたメソッド* Service()を提供します。
解決
問題の解決
問題の解決策を見つけました。メソッドstart()、stop()、destroy()、create()をオーバーライドしていました。それでも、抽象クラスServiceMBeanSupportを拡張しているため、startService()、stopService()などのメソッドをオーバーライドする必要があります。
コードをメソッドstart()からメソッドstartService()に移動したところ、すべてが必要に応じて動作するようになりました:依存関係が満たされるとすぐにサービスが開始され、メソッドstartService()が実行されます。
結論は次のとおりです:MBeanのライフサイクルにはcreate()、start()、stop()およびdestroy()の呼び出しが含まれますが、抽象クラスServiceMBeanSupportの実装はこれらのメソッドを使用してライフサイクルを処理します。それにもかかわらず、プログラマーがライフサイクルに参加できるように、保護されたメソッド* Service()を提供します。
他のヒント
私にとっては、MBeanインターフェースでstopおよびstartメソッドを定義するのに役立ちました:
public interface MyServiceMBean {
...
// Lifecycle callbacks
void start() throws Exception;
void stop();
}
利点は、ServiceMBeanをServiceMBeanSupportに拡張する必要がないことです。