package net.joelinn.quartz; import com.google.common.base.Joiner; import net.joelinn.quartz.jobstore.RedisJobStore; import net.joelinn.quartz.jobstore.RedisJobStoreSchema; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.quartz.SchedulerConfigException; import org.quartz.spi.SchedulerSignaler; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.JedisSentinelPool; import redis.embedded.RedisCluster; import redis.embedded.util.JedisUtil; import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.Properties; import java.util.Set; import static net.joelinn.quartz.TestUtils.getPort; import static org.mockito.Mockito.mock; public class RedisSentinelJobStoreTest extends BaseTest { private JedisSentinelPool jedisSentinelPool; private String joinedHosts; private RedisCluster redisCluster; @Before public void setUpRedis() throws IOException, SchedulerConfigException { final List<Integer> sentinels = Arrays.asList(getPort(), getPort()); final List<Integer> group1 = Arrays.asList(getPort(), getPort()); final List<Integer> group2 = Arrays.asList(getPort(), getPort()); //creates a cluster with 3 sentinels, quorum size of 2 and 3 replication groups, each with one master and one slave redisCluster = RedisCluster.builder().sentinelPorts(sentinels).quorumSize(2) .serverPorts(group1).replicationGroup("master1", 1) .serverPorts(group2).replicationGroup("master2", 1) .ephemeralServers().replicationGroup("master3", 1) .build(); redisCluster.start(); Set<String> jedisSentinelHosts = JedisUtil.sentinelHosts(redisCluster); joinedHosts = Joiner.on(",").join(jedisSentinelHosts); final short database = 1; JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setTestOnBorrow(true); jedisPoolConfig.setTestOnCreate(true); jedisPoolConfig.setTestOnReturn(true); jedisPoolConfig.setMaxWaitMillis(2000); jedisPoolConfig.setMaxTotal(20); jedisPool = new JedisSentinelPool("master1", jedisSentinelHosts, jedisPoolConfig); jobStore = new RedisJobStore(); jobStore.setHost(joinedHosts); jobStore.setJedisPool(jedisSentinelPool); jobStore.setLockTimeout(2000); jobStore.setMasterGroupName("master1"); jobStore.setRedisSentinel(true); jobStore.setInstanceId("testJobStore1"); jobStore.setDatabase(database); mockScheduleSignaler = mock(SchedulerSignaler.class); jobStore.initialize(null, mockScheduleSignaler); schema = new RedisJobStoreSchema(); jedis = jedisPool.getResource(); jedis.flushDB(); } @After public void tearDownRedis() throws InterruptedException { if (jedis != null) { jedis.close(); } if (jedisPool != null) { jedisPool.close(); } redisCluster.stop(); } @Test public void redisSentinelJobStoreWithScheduler() throws Exception { Properties quartzProperties = new Properties(); quartzProperties.setProperty("org.quartz.scheduler.instanceName", "testScheduler"); quartzProperties.setProperty("org.quartz.threadPool.threadCount", "3"); quartzProperties.setProperty("org.quartz.jobStore.class", RedisJobStore.class.getName()); quartzProperties.setProperty("org.quartz.jobStore.host", joinedHosts); quartzProperties.setProperty("org.quartz.jobStore.redisSentinel", String.valueOf(true)); quartzProperties.setProperty("org.quartz.jobStore.masterGroupName", "master1"); quartzProperties.setProperty("org.quartz.jobStore.lockTimeout", "2000"); quartzProperties.setProperty("org.quartz.jobStore.database", "1"); testJobStore(quartzProperties); } }