Похоже на 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 верна. Должно быть разрешение.