如何通过无类型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
相关产品推荐
相关产品推荐

