package com.yiqiniu.easytrans.queue.impl.ons;
import java.util.Collection;
import java.util.Properties;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import com.aliyun.openservices.ons.api.Action;
import com.aliyun.openservices.ons.api.ConsumeContext;
import com.aliyun.openservices.ons.api.Consumer;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.MessageListener;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.PropertyKeyConst;
import com.yiqiniu.easytrans.config.EasyTransConifg;
import com.yiqiniu.easytrans.protocol.EasyTransRequest;
import com.yiqiniu.easytrans.queue.consumer.EasyTransConsumeAction;
import com.yiqiniu.easytrans.queue.consumer.EasyTransMsgConsumer;
import com.yiqiniu.easytrans.queue.consumer.EasyTransMsgListener;
import com.yiqiniu.easytrans.serialization.ObjectSerializer;
@Lazy
public class OnsEasyTransMsgConsumerImpl implements EasyTransMsgConsumer {
private Consumer consumer;
@Resource
private ObjectSerializer serializer;
@Resource
private EasyTransConifg config;
@PostConstruct
private void init(){
Properties properties = new Properties();
properties.put(PropertyKeyConst.ONSAddr, config.getExtendConfig("easytrans.queue.ons.addr")); // 阿里云身份验证,在阿里云服务器管理控制台创建
properties.put(PropertyKeyConst.AccessKey, config.getExtendConfig("easytrans.queue.ons.producer.key")); // 阿里云身份验证,在阿里云服务器管理控制台创建
properties.put(PropertyKeyConst.SecretKey, config.getExtendConfig("easytrans.queue.ons.producer.secrect"));// 此处以公有云生产环境为例
properties.put(PropertyKeyConst.ConsumerId, config.getExtendConfig("easytrans.queue.ons.consumer.name")); // 您在控制台创建的Producer ID
consumer = ONSFactory.createConsumer(properties);
consumer.start();
}
private String getAliTagsString(Collection<String> topicSubs) {
StringBuilder sb = new StringBuilder();
for(String s:topicSubs){
sb.append(s);
sb.append("||");
}
return sb.substring(0, sb.length() - 2);
}
@Override
public void subscribe(String topic, Collection<String> tag,
final EasyTransMsgListener listener) {
consumer.subscribe(topic, getAliTagsString(tag), new MessageListener() {
@Override
public Action consume(Message message, ConsumeContext context) {
EasyTransConsumeAction consume = listener.consume((EasyTransRequest<?, ?>) serializer.deserialize(message.getBody()));
return Action.valueOf(consume.name());
}});
}
@Override
public String getConsumerId() {
return config.getExtendConfig("easytrans.queue.ons.consumer.name");
}
}