Uso simples de RabbitMQ

O objetivo principal aqui é colocar uma mensagem em mq e, em seguida, processá-la no mq.
Produtor:
Etapa 1: Criar um nome de fila:

public class ConstantMqName {
    
    
    //查询记录队列
    public static final String MQ_RECORD_SEARCH_CONTENT= "mq-record-search-content";
}
import com.hisi.ie.common.constant.ConstantMqName;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfig {
    
    
    @Bean
    public Queue searchContentQueue() {
    
    
        return new Queue(ConstantMqName.MQ_RECORD_SEARCH_CONTENT, true);
    }
}

Etapa 2: Encapsular a mensagem a ser enviada em um objeto e colocá-la na fila:
(O encapsulamento da mensagem aqui é baseado na demanda)

import org.springframework.amqp.core.AmqpTemplate;
@Service
public class HisiSearchServiceImpl implements HisiSearchService {
    
    
   @Autowired
   private AmqpTemplate rabbitTemplate;
   
   //组装写入mq的数据
   HisiRecordSearchParam paramToMQ = new HisiRecordSearchParam();
   paramToMQ.setContent(content);
   paramToMQ.setSearchEngine(queryFieldList);
   paramToMQ.setSearchs(hisiIeSearchParam.getSearchs());
   paramToMQ.setFilters(filters);
   paramToMQ.setUserId(hisiIeSearchParam.getUserId());
   logger.info("paramToMQ ====>> " + JSONObject.toJSONString(paramToMQ));
   rabbitTemplate.convertAndSend(ConstantMqName.MQ_RECORD_SEARCH_CONTENT, JSONObject.toJSONString(paramToMQ));
 

Os consumidores consomem: a
primeira etapa: crie um nome de fila

import com.hisi.ie.common.constant.ConstantMqName;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfig {
    
    
    @Bean
    public Queue searchContentQueue() {
    
    
        return new Queue(ConstantMqName.MQ_RECORD_SEARCH_CONTENT, true);
    }
}

Etapa 2: o consumidor realiza um processamento específico na mensagem recebida
(aqui, a mensagem recebida é processada e o resultado processado é gravado no cache do redis)

@Component
public class RecordSearchReceiver {
    
    
    private static Logger logger = LoggerFactory.getLogger(RecordSearchReceiver.class);

    @Autowired
    private SearchRecordMapper searchRecordMapper;

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    //这里的注解很重要,监听具体的某一个消息队列
    @RabbitHandler
    @RabbitListener(queues = ConstantMqName.MQ_RECORD_SEARCH_CONTENT)
    public void process(String message) {
    
    
        logger.info("接收到搜索记录,开始处理[" + message + "]");
        try {
    
    
            SearchRecord searchVo = new SearchRecord();
            CombineSearchVo combineSearchVo = null;
            Set<String> content = new HashSet<>();
            //对接收到的消息进行处理,到此就是消费者接收到的消息,后面根据要求对消息做处理
            HisiRecordSearchParam recordSearch = JSON.parseObject(message, HisiRecordSearchParam.class);
            String searchContent = recordSearch.getContent();
            content.add(searchContent );
            contentToRedis(content);

        } catch (Exception e) {
    
    
            logger.error("搜索记录入库异常!", e);
        }
        logger.info("搜索记录入库结束!");
    }

    private void contentToRedis(Set<String> content) {
    
    
        Date d = new Date();
        SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
        long rightTime = (long) (d.getTime() + 8 * 60 * 60 * 1000);
        String dateNowStr = sd.format(rightTime);
        String key = "searchContent-" + dateNowStr;
        try {
    
    
            for (String keyParam : content) {
    
    
            	//序列化
                stringRedisTemplate.setValueSerializer(new StringRedisSerializer());
                //这里缓存的是词汇以及对应的词频
                stringRedisTemplate.opsForHash().increment(key, keyParam, 1);
            }
        } catch (Exception e) {
    
    
            logger.error("写入redis缓存异常!", e);
        }
    }

A explicação anterior é rabbitmq,
agora obtenha os dados no cache redis (você também pode obter os dados no cache redis por meio do cronograma de quartzo)

 Date d = new Date();
 SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
 long rightTime = (long) (d.getTime() + 8 * 60 * 60 * 1000);
 String dateNowStr = sd.format(rightTime);
 String key = "searchContent-" + dateNowStr;
 //这里存储的结构类似(key,(key,value))格式,通过key名进行获取对应的结果
 Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries(key)         

O uso geral é assim. Vários serviços são projetados ao fazer o projeto. Não é fácil apresentar todo o código. Aqui está o conteúdo chave. Quanto ao processamento específico, vamos seguir a lógica do negócio!

Acho que você gosta

Origin blog.csdn.net/qq_32115447/article/details/106944410
Recomendado
Clasificación