Как создать MXBean с методами управления? - PullRequest
0 голосов
/ 05 февраля 2019

Мы планируем реализовать некоторый контроль поведения в нашем CordApp для тестирования.Возможно ли создать компонент M (X), доступный через JMX, который изменит некоторые внутренние флаги в нашем CordApp?Если это неправильный выбор дизайна, пожалуйста, сообщите о наилучшей практике.

По сути, у нас есть набор флагов, таких как:

abstract class BaseFlow() : FlowLogic<SignedTransaction>() {
    var flagBehaviourOne  : Boolean = true
    var flagBehaviourTwo  : Boolean = true
    var flagBehaviourThree: Boolean = true
    var flagBehaviourFour : Boolean = true
...
}

, тогда в некотором реализующем классе мы имеем что-то вроде этого:

object SomeFlow {
    @InitiatingFlow
    class Initiator(private val destinatario: Party,
                    private val parameter: StateObject,
                    private val isAnonymous: Boolean = false,
                    private val pointer: Any) : BaseFlow() {
    ...
        @Suspendable
        override fun call(): SignedTransaction {

        if (flagBehaviourOne || flagBehaviorTwo) { 
            // enforce some specific behaviour
        }

    ...

    } // end of SomeFlow.Initiator

...  

} // end of SomeFlow

1 Ответ

0 голосов
/ 12 февраля 2019

Я (частично) решил свою проблему.

Я добавил новый класс object вместе с его интерфейсом jmx:

package vfalcao.example.jmx

import java.lang.management.ManagementFactory
import javax.management.MXBean
import javax.management.ObjectName

@MXBean
interface BehaviourControlMXBean {
    fun setBehaviourOne(newValue: String)
    fun isBehaviourOne() : String
    ...
    // other "behaviours" ommited for brevity
}

object BehaviourControl : BehaviourControlMXBean {
    // internal data
    ...
    init {
        val objectName = ObjectName("vfalcao.example.jmx:type=BehaviourControl,name=def")
        val platformMBeanServer = ManagementFactory.getPlatformMBeanServer()
        platformMBeanServer.registerMBean(this, objectName)
    }
}

, затем в моем BaseFlowкласс:

abstract class BaseFlow() : FlowLogic<SignedTransaction>() {
   companion object {
      ...
      init {
          println("${BehaviourControl}")
      }
      ...
      fun test() {
          var behaviour1 = ((BehaviourControl.props["behaviour1"] as String).toBoolean())
          if (behaviour1) { 
             // do something controlled by behaviour1
          }
      }

   }
   ...
}
...