提问者:小点点

使用Apache驼峰蓝图实现Hazelcast缓存


我正在尝试用骆驼蓝图实现Hazelcast缓存。但我无法完成。我能够通过java代码(不是通过hazelcastXML配置文件)创建Hazelcast实例。实例已经创建,但在实例创建期间不会调用缓存加载器类(即使初始化方法是EAGER)。附加了一些代码片段。

如果有人遇到这个,请告诉我。

代码:

public class ConfigHack extends Config {

public ConfigHack(String instanceName ){
    super(instanceName);
    System.out.println("Going to create Hazelcast instance 
................"+instanceName);

    TcpIpConfig tcpIpConfig = new TcpIpConfig();
    List membersList = new ArrayList<String>();
    membersList.add("localhost");
    tcpIpConfig.setMembers(membersList);

    MulticastConfig multicastConfig = new MulticastConfig();
    multicastConfig.setEnabled(true);

    JoinConfig join = new JoinConfig();
    join.setTcpIpConfig(tcpIpConfig);
    join.setMulticastConfig(multicastConfig);

    NetworkConfig networkConfig =  new NetworkConfig();
    networkConfig.setPort(5701);
    networkConfig.setPortAutoIncrement(true);
    networkConfig.setJoin(join);

    GroupConfig groupConfig = new GroupConfig();
    groupConfig.setName("devuser");
    groupConfig.setPassword("devpassword"); 

    MapStoreConfig mapStoreConfig = new MapStoreConfig();
    //Absolute path in class name field below
    mapStoreConfig.setClassName("VehicleCacheLoader");
    mapStoreConfig.setImplementation(new VehicleCacheLoader());
    mapStoreConfig.setEnabled(true);
    mapStoreConfig.setInitialLoadMode(InitialLoadMode.EAGER);
    mapStoreConfig.setWriteDelaySeconds(500);

    MapConfig mapConfig = new MapConfig();
    mapConfig.setName("vehicleMap");
    mapConfig.setBackupCount(2);
    mapConfig.setMaxIdleSeconds(1000000);
    mapConfig.setEvictionPercentage(30);
    mapConfig.setEvictionPolicy(EvictionPolicy.LFU);
    mapConfig.setMapStoreConfig(mapStoreConfig);

    Map<String,MapConfig> mapConfigs = new HashMap<String,MapConfig>();
    mapConfigs.put("vehicleMap", mapConfig);

    //config.setMapConfigs(mapConfigs);
    addMapConfig(mapConfig);
    setGroupConfig(groupConfig);
    setNetworkConfig(networkConfig);        
}
}
public class VehicleCacheLoader implements MapLoader<String, VehicleVO> {

@Override
public VehicleVO load(String paramK) {
    System.out.println("Calling load method for Key " + paramK);
    VehicleVO vehicleVO = new VehicleVO();
    vehicleVO.setCustId("XXX");
    vehicleVO.setVehicleHeader("XXX");
    vehicleVO.setVehicleInitial("001");
    vehicleVO.setVehicleNumber("1234");
    vehicleVO.setVehicleObjId(paramK);
    return vehicleVO;
}

@Override
public Map<String, VehicleVO> loadAll(Collection<String> paramCollection) {
    System.out.println("Calling Load all values() " + "Got key = ");
    VehicleVO vehicleVO = null;
    Map<String, VehicleVO> vehicleDataMap = new HashMap<String, VehicleVO>();
    for (String paramKey : paramCollection) {
        System.out.println("Calling ...." + paramKey);
        vehicleVO = new VehicleVO();
        vehicleVO.setCustId("XXX");
        vehicleVO.setVehicleHeader("XXX");
        vehicleVO.setVehicleInitial("001");
        vehicleVO.setVehicleNumber("1234");
        vehicleVO.setVehicleObjId(paramKey);
        vehicleDataMap.put(paramKey, vehicleVO);
    }   
    return vehicleDataMap;
}

@Override
public Set<String> loadAllKeys() {
    System.out.println("Calling Load all keys() ");
    Set<String> vehicleKeys = new HashSet<String>();
    vehicleKeys.add("XXX001");
    vehicleKeys.add("XXX002");
    vehicleKeys.add("XXX003");
    vehicleKeys.add("XXX004");
    return vehicleKeys;
}
}
Blueprint config:
-----------------
<bean id="hazelcastInstance" class="com.hazelcast.core.Hazelcast"
    factory-method="newHazelcastInstance" destroy-method="shutdown">
    <argument ref="hazelcastConfig"/>
</bean>

<bean id="hazelcastConfig" class="xx.yy.zz.ss.tt.cache.ConfigHack">
    <argument value="TestInstance" />
</bean>

共1个答案

匿名用户

这条线

mapConfigs.put("vehicleMap", mapConfig);

定义将用于名称匹配“车辆地图”的地图的配置。

为了创建这样的映射,您需要对其运行操作,例如

hazelcastInstance.getMap("vehicleMap"); 

如果配置是:

mapConfigs.put("vehicleMap*", mapConfig);

这将在您创建名为“车辆Map1”或“车辆Map123”的地图时使用。

配置定义了在需要时将使用的配置。在您第一次访问地图之前不需要它,也就是创建地图的时候。

这里的“EAGER”指的是地图加载器的运行方式,而不是地图的创建方式。