0

IMEI MXbeans は初めてです。MXBean が実際にいつ初期化されるかを理解したいのですが、私がサポートしているアプリケーションには通知システムがあり、通知が届くまで JConsole で MXBean を確認できません。これが私の MXBean のコードです。

    package mecomaany.instrumentation;

    import java.lang.management.ManagementFactory;
    import java.util.ArrayList;

    import javax.management.Attribute;
    import javax.management.AttributeList;
    import javax.management.AttributeNotFoundException;
    import javax.management.DynamicMBean;
    import javax.management.InvalidAttributeValueException;
    import javax.management.MBeanAttributeInfo;
    import javax.management.MBeanException;
    import javax.management.MBeanInfo;
    import javax.management.MBeanOperationInfo;
    import javax.management.MalformedObjectNameException;
    import javax.management.ObjectName;
    import javax.management.ReflectionException;

    import  BulkCMIRP_MxBean;
    import SoapIRPLogger;

    /**
     * This dynamic MBean exposes a method to return the 10 latest Basic CM
     * operations.
     * 
 * @author eshtrom
 * 
 */
    public class BasicCMIRP_MxBean implements DynamicMBean{
    private static final String CLASS_NAME =        BasicCMIRP_MxBean.class.getCanonicalName();
    private static final String MX_BEAN_NAME =   BasicCMIRP_MxBean.class.getCanonicalName() + ":Type=BasicCMIRP_MxBean";
    private static final String BEAN_DESCRIPTION = "Instrumentation bean for SOAP Basic CM IRP.";
    private static final int NUM_OPERATIONS_TO_RECORD = 10;
    private final ArrayList<String> basicCMOperations = new ArrayList<String>();

    /**
     * Register the bean. This is a best effort attempt. If registration fails
     * we'll report it but nothing more.
     */
    public BasicCMIRP_MxBean() {
        registerMxBean();
    }

    /**
     * Attempt to unregister and clean up the MX beans.
     */
    public void destroy() {
        basicCMOperations.clear();
        unregisterMxBean();
    }

    /**
     * This method returns a description of this bean to the JMX interface. The
     * description is just a list of names of the currently stored attributes.
     */
    public synchronized MBeanInfo getMBeanInfo() {
        final MBeanAttributeInfo[] attributes = new MBeanAttributeInfo[0];
        final MBeanOperationInfo[] operations = { new MBeanOperationInfo("getBasicCMInstrumentation", "Get instrumentation Basic CM IRP bean.", null, "String[]",
                MBeanOperationInfo.INFO) };
        return new MBeanInfo(this.getClass().getName(), BEAN_DESCRIPTION, attributes, null, operations, null);
    }



    /**
     * Callback to execute methods exposed by this dynamic MBean.
     */
    public Object invoke(final String actionName, final Object[] params, final String[] signature) throws MBeanException, ReflectionException {
        SoapIRPLogger.enter(CLASS_NAME, "invoke");
        if (actionName != null) {
            if (actionName.equals("getBulkCMInstrumentation")) {
                return getBasicCMInstrumentation();
            }
        }
        SoapIRPLogger.exit(CLASS_NAME, "invoke");
        throw new ReflectionException(new NoSuchMethodException(actionName));
    }


    /**
     * Construct a human readable very of the last 10 operations and return it.
     * 
     * @return string array as an object.
     */
    private Object getBasicCMInstrumentation() {
        SoapIRPLogger.enter(CLASS_NAME, "getBasicCMInstrumentation");
        String[] result = new String[basicCMOperations.size()];
        int index = 0;
        for (String operation : basicCMOperations) {
            result[index] = operation;
            index++;
        }
        SoapIRPLogger.exit(CLASS_NAME, "getBasicCMInstrumentation");
        return result;
    }

    /**
     * No attributes are writable so this method will throw an exception.
     */
    public void setAttribute(final Attribute arg0) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException {
        throw new AttributeNotFoundException("All attributes on this bean are read only.");
    }

    /**
     * No attributes are writable so this method will return an empty list.
     */
    public AttributeList setAttributes(final AttributeList arg0) {
        return new AttributeList();
    }


    public Object getAttribute(final String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException {
        throw new AttributeNotFoundException("No attributes are defined on this MX bean.");
    }

    /**
     * No attributes are readable so this method will return an empty list.
     */
    public AttributeList getAttributes(final String[] attributes) {
        return new AttributeList();
    }

    /**
     * Add or update and instrumentation attribute. A null attribute name will
     * be ignored.
     * 
     * @param name
     * @param value
     */
    public void updateInstrumentationAttibute(final String name, final String value) {
        // The only attribute that this bean supports is Bulk CM operations.
        if (name.compareTo("BasicCM_Operations") == 0) {
            basicCMOperations.add(value);
            // We'll only record a maximum of 10 operations. If we exceed the
            // max, remove the oldest.
            if (basicCMOperations.size() > NUM_OPERATIONS_TO_RECORD) {
                basicCMOperations.remove(0);
            }
        }
    }


    public ObjectName getBeanName() throws MalformedObjectNameException, NullPointerException {
        // Construct the ObjectName for the MBean we will register
        return new ObjectName(MX_BEAN_NAME);
    }

    /**
     * Register the bean.
     */
    protected void registerMxBean() {
        try {
            ManagementFactory.getPlatformMBeanServer().registerMBean(this, this.getBeanName());
        } catch (Exception e) {
            SoapIRPLogger.exception(CLASS_NAME, "Constructor", "Failed to register BulkCMIRP_MxBean management beans.", e);
        }
    }
    protected void unregisterMxBean() {
        try {
            ManagementFactory.getPlatformMBeanServer().unregisterMBean(this.getBeanName());
        } catch (Exception e) {
            // Suppress exceptions, we're closing down anyway.
        }
    }    
}
4

1 に答える 1

0

一匹狼;

MBean をプラットフォーム MBeanServer に登録するregisterMxBean()をコンストラクターが呼び出すため、MXBean は構築するとすぐに JConsole に表示されるはずです。

MBean の登録時に JConsole がすでに実行されていると仮定すると、MBean の JConsole のビューは、登録時に生成される MBeanInfo の最初のインスタンスによって決定されます。これをDynamicMBeanとしてコーディングしたので、MBeanInfo を定期的に変更するつもりだったのだろうかと思いますが、JConsole 接続が登録済み Bean の MBeanInfo を取得すると、更新されないことに注意してください。MBeanInfo が変更された場合は、JConsole で接続を閉じてから再度開く必要があります。

したがって、問題は提供したコードの範囲外にある可能性があります。より簡単に言えば、BasicCMIRP_MxBeanのインスタンスがいつ作成されるかということです。

通知が到着し始めるまで Bean が表示されないというあなたのコメントは、次のことを意味しているのか疑問に思います: A. 通知が到着し始めるまで MBean は表示されません。最初の ?] 通知が届く、または B. つまり、通知が届き始めるまで MBean の特定のプロパティを確認できないということです。

おそらく、ここで全体像を明確にすることができます。

無関係かもしれないいくつかの追加の観察:

  1. 生成している MBeanInfo は、 getBasicCMInstrumentation (基本)と呼ばれる唯一の操作を指定しますが、呼び出しハンドラーはgetBulkCMInstrumentation (一括)と呼ばれる操作のデコードのみを試みます。JConsole には操作をレンダリングするために MBeanInfo が提供されるため、コンソールは操作が基本的であると認識しますが、MBean はbulkと呼ばれる要求にのみ応答します。
  2. メソッドgetBasicCMInstrumentationのシグネチャはObjectを返しますが、コードが実際に返すのはString[]です。MBeanInfo でString[]が返されるように指定されているため、これは機能する可能性がありますが、一貫性と明確さのために、メソッド シグネチャを変更します。

//ニコラス

于 2012-04-17T12:51:05.220 に答える