2017-12-21 23 views
0

こんにちは! Startup Beanの@PostConstructメソッドでJMXを通じてwildflyサーバーのシステムプロパティをロードしようとしています。デプロイメントの開始時にすでに起動されているサーバーインスタンスでは正常に動作しますが、サーバーインスタンスのブートストラップでは起動しても失敗します。WildflyのStartup BeanのJMXを介したAttributeNotFoundException

Wildfly 11.0.0.CR1 スタートアップBeanコード:

package ru.wildfly.test.ejb.wildflyconsulregistrar.startup; 
import ru.wildfly.test.ejb.wildflyconsulregistrar.api.ConsulRegistrar; 

import javax.annotation.PostConstruct; 
import javax.annotation.PreDestroy; 
import javax.ejb.Singleton; 
import javax.ejb.Startup; 
import javax.inject.Inject; 

@Startup 
@Singleton 
public class WildflyConsulRegistrarStartupBean { 

    @Inject 
    private ConsulRegistrar consulRegistrar; 

    @PostConstruct 
    public void initialize() { 
     registerServices(); 
    } 

    private void registerServices() { 
     consulRegistrar.registerService("WildflyTestCluster"); 
    } 


    ............. 
} 

ConsulRegistrarコード:

package ru.wildfly.test.ejb.wildflyconsulregistrar.impl; 

import com.ecwid.consul.v1.ConsulClient; 
import com.ecwid.consul.v1.agent.model.NewService; 
import ru.test.ejb.wildflyconsulregistrar.api.ConsulRegistrar; 
import ru.wildfly.test.ejb.wildflyconsulregistrar.serversettings.api.CurrentServerNodeSettings; 

import javax.annotation.PostConstruct; 
import javax.enterprise.context.Dependent; 
import javax.inject.Inject; 
import java.text.MessageFormat; 
import java.util.ArrayList; 
import java.util.List; 

@Dependent 
public class ConsulRegistrarImpl implements ConsulRegistrar { 

    ............... 

    @Inject 
    private CurrentServerNodeSettings currentServerNodeSettings; 

    ............. 

    @Override 
    public void registerService(String serviceName) { 
     String currentNodeName = currentServerNodeSettings.getCurrentNodeName(); 
     ........................ 
    } 

    ....................... 

} 

CurrentServerNodeSettingsコード:

package ru.wildfly.test.ejb.wildflyconsulregistrar.serversettings.impl; 


import ru.wildfly.test.ejb.wildflyconsulregistrar.serversettings.api.CurrentServerNodeSettings; 

import javax.enterprise.context.Dependent; 
import javax.management.MBeanServer; 
import javax.management.ObjectName; 
import java.lang.management.ManagementFactory; 

@Dependent 
public class CurrentServerNodeSettingsWildflyImpl implements CurrentServerNodeSettings { 

    .................... 

    @Override 
    public String getCurrentNodeName() { 
     String currentNodeName = getPlatformMBeanServerAttributeValue(String.class, "jboss.as:system-property=server.name", "value"); 
     return currentNodeName; 
    } 

    private <T> T getPlatformMBeanServerAttributeValue(Class<T> valueType, String objectName, String attributeName) { 
     T attributeValue = null; 

     try { 
      MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); 
      Object attributeObject = mBeanServer.getAttribute(new ObjectName(objectName), attributeName); 

      attributeValue = attributeObject != null ? (valueType.cast(attributeObject)) : null; 
     } catch (Exception ex) { 
      throw new IllegalStateException(ex); 
     } 

     return attributeValue; 
    } 
} 

エラーメッセージ:

Caused by: java.lang.IllegalStateException: 
javax.management.AttributeNotFoundException: 
"WFLYCTL0216: Management resource '[(\"system-property\" => \"server.name\")]' not found" 
at ru.wildfly.test.ejb.wildflyconsulregistrar.serversettings.impl.CurrentServerNodeSettingsWildflyImpl 
.getPlatformMBeanServerAttributeValue(CurrentServerNodeSettingsWildflyImpl.java:41) 

私はjbossフォーラムhttps://developer.jboss.org/message/971717#971717で同じ問題を発見しましたが、回答はありませんでした。

提案がありますか?

答えて

0

これは起動時の依存関係の問題です。つまり、@PostConstructメソッドの実行後にサーバー名が設定されます。最初にアプリケーションからアクセスしたときにサーバー名lazyをロードしてみてください。

Wildlyには、モジュールの依存関係の定義にもかかわらず、アプリケーションからの展開シーケンスを強制する一般的な方法はありません。しかし、これはあなたの場合に役立つことはありません。

+0

サービスディスカバリーコンポーネントに現在のサーバーインスタンスを登録して、後でロードバランシングに含めるために、このプロパティーが必要です。私が依存できる依存関係がなければ、何らかの再試行システムでタスクを実装します。それにもかかわらず、ありがとう。 – netfisher777

関連する問題