You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过无类型Java API在WildFly/JBoss中程序化添加缓存

使用JBoss DMR创建带嵌套结构的Infinispan缓存配置

要实现你需要的多层级Infinispan配置,核心是利用JBoss DMR的复合操作和层级资源地址来对应XML中的嵌套元素。以下是完整的Java实现示例,完全匹配你给出的XML结构:

完整代码示例

import org.jboss.as.controller.client.ModelControllerClient;
import org.jboss.dmr.ModelNode;
import static org.jboss.as.controller.client.helpers.ClientConstants.*;

public class InfinispanDmrSetup {
    public static void configureCacheContainer(ModelControllerClient client) throws Exception {
        // 构建复合操作,一次性执行所有配置步骤,保证原子性
        ModelNode compositeOp = new ModelNode();
        compositeOp.get(OP).set(COMPOSITE);
        ModelNode steps = compositeOp.get(STEPS);

        // 1. 创建顶级cache-container(对应XML中的<cache-container name="cache1">)
        ModelNode addCacheContainer = new ModelNode();
        addCacheContainer.get(OP).set(ADD);
        addCacheContainer.get(ADDRESS).add("subsystem", "infinispan");
        addCacheContainer.get(ADDRESS).add("cache-container", "cache1");
        steps.add(addCacheContainer);

        // 2. 添加cache-container下的transport子元素(对应<transport lock-timeout="60000"/>)
        ModelNode addTransport = new ModelNode();
        addTransport.get(OP).set(ADD);
        addTransport.get(ADDRESS).add("subsystem", "infinispan");
        addTransport.get(ADDRESS).add("cache-container", "cache1");
        addTransport.get(ADDRESS).add("transport", "DEFAULT"); // Infinispan transport的默认资源名
        addTransport.get("lock-timeout").set(60000);
        steps.add(addTransport);

        // 3. 创建第一个replicated-cache及transaction子元素
        // 3.1 添加replicated1缓存(对应<replicated-cache name="replicated1">)
        ModelNode addReplicated1 = new ModelNode();
        addReplicated1.get(OP).set(ADD);
        addReplicated1.get(ADDRESS).add("subsystem", "infinispan");
        addReplicated1.get(ADDRESS).add("cache-container", "cache1");
        addReplicated1.get(ADDRESS).add("replicated-cache", "replicated1");
        steps.add(addReplicated1);

        // 3.2 为replicated1添加transaction配置(对应<transaction mode="BATCH"/>)
        ModelNode addTx1 = new ModelNode();
        addTx1.get(OP).set(ADD);
        addTx1.get(ADDRESS).add("subsystem", "infinispan");
        addTx1.get(ADDRESS).add("cache-container", "cache1");
        addTx1.get(ADDRESS).add("replicated-cache", "replicated1");
        addTx1.get(ADDRESS).add("transaction", "DEFAULT"); // transaction的默认资源名
        addTx1.get("mode").set("BATCH");
        steps.add(addTx1);

        // 4. 创建第二个replicated-cache及transaction子元素
        // 4.1 添加replicated2缓存(对应<replicated-cache name="replicated2">)
        ModelNode addReplicated2 = new ModelNode();
        addReplicated2.get(OP).set(ADD);
        addReplicated2.get(ADDRESS).add("subsystem", "infinispan");
        addReplicated2.get(ADDRESS).add("cache-container", "cache1");
        addReplicated2.get(ADDRESS).add("replicated-cache", "replicated2");
        steps.add(addReplicated2);

        // 4.2 为replicated2添加transaction配置(对应<transaction mode="BATCH"/>)
        ModelNode addTx2 = new ModelNode();
        addTx2.get(OP).set(ADD);
        addTx2.get(ADDRESS).add("subsystem", "infinispan");
        addTx2.get(ADDRESS).add("cache-container", "cache1");
        addTx2.get(ADDRESS).add("replicated-cache", "replicated2");
        addTx2.get(ADDRESS).add("transaction", "DEFAULT");
        addTx2.get("mode").set("BATCH");
        steps.add(addTx2);

        // 执行复合操作
        ModelNode result = client.execute(compositeOp);
        // 验证执行结果
        if (!result.get(SUCCESS).asBoolean()) {
            throw new RuntimeException("配置执行失败: " + result.get(FAILURE_DESCRIPTION).asString());
        }
    }
}

关键要点说明

  • 复合操作:使用COMPOSITE将所有配置步骤打包,避免多次网络调用,同时保证配置的原子性(要么全部生效,要么全部回滚)。
  • 层级资源地址:DMR通过ADDRESS数组映射XML的嵌套结构,每一层元素对应地址中的一个条目,比如cache-container下的transport对应地址/subsystem=infinispan/cache-container=cache1/transport=DEFAULT。
  • 默认资源名:Infinispan子系统中像transport、transaction这类子元素,默认资源名为DEFAULT,无需手动指定自定义名称。
  • 属性设置:直接在ModelNode中添加属性键值对即可,对应XML元素的属性。

验证配置

配置完成后,可以通过WildFly CLI执行以下命令验证配置是否正确:

/subsystem=infinispan/cache-container=cache1:read-resource(recursive=true)

内容的提问来源于stack exchange,提问作者helge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:40:08