Можно ли создать записываемый компонент из Clojure, которым я могу управлять из jconsole? - PullRequest
0 голосов
/ 11 апреля 2020

Я изучал Clojure java .jmx Справочник по API и пробовал упомянутые там примеры, например

;; Can I serve my own beans?  Sure, just drop a Clojure ref
;; into an instance of clojure.java.jmx.Bean, and the bean
;; will expose read-only attributes for every key/value pair
;; in the ref:

  (jmx/register-mbean
     (create-bean
     (ref {:string-attribute "a-string"}))
     "my.namespace:name=Value")

Это прекрасно работает, значение атрибута компонента отображается в консоли, но он доступен только для чтения.

Есть ли способ создать бин с возможностью записи (чтобы он был указан в папке «Операции» и мог управляться из консоли)?

1 Ответ

1 голос
/ 11 апреля 2020

Похоже на clojure. java .jmx-код поддерживает setAttribute. (см. (deftype Bean ...) в https://github.com/clojure/java.jmx/blob/master/src/main/clojure/clojure/java/jmx.clj

Кажется, что самый простой способ - использовать atom вместо ref.

. Наблюдатели за атомами запускают некоторый код, если JMX меняет его. Возможно, попробуйте. Я забыл большую часть JMX;)

РЕДАКТИРОВАТЬ: Быстро попробовал. Похоже, что атрибут все еще доступен только для чтения :( Мне нужно посмотреть глубже. Тем не менее, исходный код довольно приятный и, надеюсь, его легко понять.

EDIT2: Проблема связана с build-attribute-info, который передает false к знаку writeable? в `MBeanAttributeInfo.

Вы можете сделать патч, который:


(import 'java.jmx.MBeanAttributeInfo)
(require '[clojure.java.jmx :as jmx])

(defn build-my-attribute-info
  "Construct an MBeanAttributeInfo. Normally called with a key/value pair from a Clojure map."
  ([attr-name attr-value]
  (build-my-attribute-info
  (name attr-name)
  (.getName (class attr-value)) ;; you might have to map primitive types here
  (name attr-name) true true false)) ;; false -> true compared to orig code
  ([name type desc readable? writable? is?] (println "Build info:" name type readable? writable?) (MBeanAttributeInfo. name type desc readable? writable? is? )))

;; the evil trick one should only use in tests, maybe
;; overwrite the original definition of build-attribute-info with yours
(with-redefs [jmx/build-attribute-info build-my-attribute-info]
   (jmx/register-mbean (jmx/create-bean (atom {:foo "bar"})) "my.bean:name=Foo"))

;; write to it
(jmx/write! "my.bean:name=Foo" "foo" "hello world")

;; read it
(jmx/read "my.bean:name=Foo" "foo")
=> "hello world"

Теперь, к сожалению, Java Mission Control по-прежнему не может изменить значение, но я не уверен, почему. Информация MBean верна. Должно быть разрешение.

...