Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

第 70 章 Spring Integration

目录

70.1. Spring Redis Lock
70.1.1. Maven 依赖
70.1.2. 配置锁
70.1.3. 使用方法
70.2. MQTT Support
70.2.1. 入站消息通道适配器
70.2.2. 出站通道适配器
70.2.3. @MessagingGateway 定义消息网管接口
70.2.4. 手动 ACK 应答
70.2.5. Spring boot with Mqtt v5
	
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-integration</artifactId>
        </dependency>	
	
	

70.1. Spring Redis Lock

70.1.1. Maven 依赖

			
        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-redis</artifactId>
        </dependency>			
			
			

70.1.2. 配置锁

			
package cn.netkiller.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.integration.redis.util.RedisLockRegistry;

@Configuration
public class RedisLockRegistryConfiguration {
    @Bean
    public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {
        return new RedisLockRegistry(redisConnectionFactory, "netkiller-lock");
    }
}
			
			
			

			
  @Bean(destroyMethod = "destroy")
  public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {
    return new RedisLockRegistry(redisConnectionFactory, "neo-lock",
        TimeUnit.MINUTES.toMillis(10));
  }			
			
			

70.1.3. 使用方法

			
@Autowired
private RedisLockRegistry redisLockRegistry;
			
		Lock lock = redisLockRegistry.obtain(device);
        if (lock.tryLock()) {
            try {
                // manipulate protected state
            } finally {
                lock.unlock();
            }
        } else {
            // perform alternative actions
        }			
			
			
			
@Autowired
private RedisLockRegistry redisLockRegistry;

Lock lock = redisLockRegistry.obtain(key);
boolean locked = false;
try {
  locked = lock.tryLock();
  if (!locked) {
    // 没有获取到锁的逻辑    
  }

  // 获取锁的逻辑
} finally {
  if (locked) {
    lock.unlock();
  }
}			
			
			

如果没有上锁,上锁后返回 true 状态。如果已经上锁阻塞等待10秒,然后再返回锁状态

			
    public boolean isLock(String device) {

        Lock lock = redisLockRegistry.obtain(device);
        boolean status = false;
        try {
            status = lock.tryLock(10, TimeUnit.SECONDS);

        } catch (Exception e) {
            log.info(e.getMessage());
        }
        log.warn("status: {} <<<<<<<<<<", status);
        return status;
    }