Showing posts with label spring. Show all posts
Showing posts with label spring. Show all posts

Hazelcast Spring Integration


Beans Namespace

You can declare Hazelcast beans for Spring context using beans namespace (default spring beans namespace) as well to declare hazelcast maps, queues and others.
Hazelcast-Spring integration requires either hazelcast-spring jar or hazelcast-all jar in the classpath.
<bean id="instance" class="com.hazelcast.core.Hazelcast" factory-method="newHazelcastInstance">
    <constructor-arg>
        <bean class="com.hazelcast.config.Config">
            <property name="groupConfig">
                <bean class="com.hazelcast.config.GroupConfig">
                    <property name="name" value="dev"/>
                    <property name="password" value="pwd"/>
                </bean>
            </property>
            <!-- and so on ... -->
        </bean>
    </constructor-arg>
</bean>
<bean id="map" factory-bean="instance" factory-method="getMap">
    <constructor-arg value="map"/>
</bean>

Hazelcast Namespace

Hazelcast has Spring integration (requires version 2.5 or greater) since 1.9.1 using hazelcast namespace.
  • Add namespace xmlns:hz="http://www.hazelcast.com/schema/config" to beans tag in context file:
  • <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:hz="http://www.hazelcast.com/schema/config"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                    http://www.hazelcast.com/schema/config
                    http://www.hazelcast.com/schema/config/hazelcast-spring.xsd">
  • Use hz namespace shortcuts to declare cluster, its items and so on.

Hazelcast Instance

After that you can configure Hazelcast instance (node):
<hz:hazelcast id="instance">
        <hz:config>
            <hz:group name="dev" password="password"/>
            <hz:properties>
                <hz:property name="hazelcast.merge.first.run.delay.seconds">5</hz:property>
                <hz:property name="hazelcast.merge.next.run.delay.seconds">5</hz:property>
            </hz:properties>
            <hz:network port="5701" port-auto-increment="false">
                <hz:join>
                    <hz:multicast enabled="false"
                                  multicast-group="224.2.2.3"
                                  multicast-port="54327"/>
                    <hz:tcp-ip enabled="true">
                        <hz:members>10.10.1.2, 10.10.1.3</hz:members>
                    </hz:tcp-ip>
                </hz:join>
            </hz:network>
            <hz:map name="map"
                    backup-count="2"
                    max-size="0"
                    eviction-percentage="30"
                    read-backup-data="true"
                    cache-value="true"
                    eviction-policy="NONE"
                    merge-policy="hz.ADD_NEW_ENTRY"/>
        </hz:config>
    </hz:hazelcast>
As of version hazelcast 1.9.3, you can easily configure map-store and near-cache too. (For map-store you should set either class-name orimplementation attribute.)
 <hz:config>
           <hz:map name="map1">          
                    <hz:near-cache time-to-live-seconds="0" max-idle-seconds="60"
                       eviction-policy="LRU" max-size="5000"  invalidate-on-change="true"/>

                    <hz:map-store enabled="true" class-name="com.foo.DummyStore" 
                        write-delay-seconds="0"/>
           </hz:map>
           
          <hz:map name="map2">          
                    <hz:map-store enabled="true" implementation="dummyMapStore" 
                        write-delay-seconds="0"/>
           </hz:map>
  
          <bean id="dummyMapStore" class="com.foo.DummyStore" />
</hz:config>
It's possible to use placeholders instead of concrete values.
For instance, use property file app-default.properties for group configuration:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:/app-default.properties</value>
        </list>
    </property>
</bean>
<hz:hazelcast id="instance">
    <hz:config>
        <hz:group
            name="${cluster.group.name}"
            password="${cluster.group.password}"/>
        <!-- ... -->
    </hz:config>
</hz:hazelcast>

Hazelcast client

Similar for client
<hz:client id="client"
    group-name="${cluster.group.name}" group-password="${cluster.group.password}">
    <hz:members>10.10.1.2:5701, 10.10.1.3:5701</hz:members>
</hz:client>

Maps, Queues and so on

You can declare beans for the following Hazelcast objects:
  • map
  • multiMap
  • queue
  • topic
  • set
  • list
  • executorService
  • idGenerator
  • atomicNumber
Example:
    <hz:map id="map" instance-ref="instance" name="map"/>
    <hz:multiMap id="multiMap" instance-ref="instance" name="multiMap"/>
    <hz:queue id="queue" instance-ref="instance" name="queue"/>
    <hz:topic id="topic" instance-ref="instance" name="topic"/>
    <hz:set id="set" instance-ref="instance" name="set"/>
    <hz:list id="list" instance-ref="instance" name="list"/>
    <hz:executorService id="executorService" instance-ref="instance" name="executorService"/>
    <hz:idGenerator id="idGenerator" instance-ref="instance" name="idGenerator"/>
    <hz:atomicNumber id="atomicNumber" instance-ref="instance" name="atomicNumber"/>