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!