使用 org.jboss.dmr.ModelNode 更改数据源属性

Posted

技术标签:

【中文标题】使用 org.jboss.dmr.ModelNode 更改数据源属性【英文标题】:Change datasource property using org.jboss.dmr.ModelNode 【发布时间】:2019-01-14 07:06:21 【问题描述】:

我在standalone.xml中有相当常规的数据源定义

<subsystem xmlns="urn:jboss:domain:datasources:2.0">
    <datasources>
        <datasource jndi-name="java:jboss/datasources/MYDS" pool-name="MYDS" enabled="true" use-java-context="true">
            <connection-url>jdbc:hsqldb:file:MYDB</connection-url>
            <security>
                <user-name>superman</user-name>
            </security>
        </datasource>
   </datasources>
</subsystem>

尝试从命令行更改一些属性,这工作正常:

/subsystem=datasources/data-source=MYDS:write-attribute(name=connection-url,value=achooo)

结果:


    "outcome" => "success",
    "response-headers" => 
        "operation-requires-reload" => true,
        "process-state" => "reload-required"
    

但是使用 ModelNode API 让我抓狂。

ModelNode request = new ModelNode();
request.get(ClientConstants.OP_ADDR).add("subsystem", "datasources");
request.get(ClientConstants.OP_ADDR).add("data-source", "MYDS");
request.get(ClientConstants.OP).set(ClientConstants.WRITE_ATTRIBUTE_OPERATION);
request.get("connection-url").set("achooo");
myCliExecutor.executeCliCommandWithResult(request);

结果:


    "outcome" => "failed",
    "failure-description" => "JBAS014746: name may not be null",
    "rolled-back" => true,
    "response-headers" => "process-state" => "reload-required"

【问题讨论】:

什么版本的 WildFly? DMR 不太正确,但您可以利用一些辅助方法。 【参考方案1】:

您的 DMR 不太正确。对于write-attribute 操作,您需要定义namevalue 属性。它应该看起来更像:

final ModelNode address = new ModelNode().setEmptyList();
address.add("subsystem", "datasources");
address.add("data-source", "ExampleDS");

ModelNode request = new ModelNode();
request.get(ClientConstants.OP_ADDR).set(address);
request.get(ClientConstants.OP).set(ClientConstants.WRITE_ATTRIBUTE_OPERATION);
request.get("name").set("connection-url");
request.get("value").set("achooo");
myCliExecutor.executeCliCommandWithResult(request);

org.wildfly.core:controller-client 中还有一个Operations 助手应该可以提供帮助。

final ModelNode address = Operations.createAddress("subsystem", "datasources", "data-source", "MYDS");
final ModelNod op = Operations.createWriteAttributeOperation(address, "connection-url", "achooo");
myCliExecutor.executeCliCommandWithResult(op);

【讨论】:

不幸的是在线 writeOp.get("name").set("connection-url"); 我得到 java.lang.IllegalArgumentException 因为 writeOp 对象只有 protected = falsevalue = "write-attribute"。我没有像 Operations.createAddress 这样的 API,可能是因为我使用 Wildfly 8.2 啊,对不起。 createAddress() 直到后来才引入。我认为Operations.createWriteAttributeOperation() 应该存在。不过,我将编辑并修复更长的示例。我为此道歉是不正确的。

以上是关于使用 org.jboss.dmr.ModelNode 更改数据源属性的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)