/**
* @author jacky
*/
@Service
public class ProxyServiceImpl implements ProxyService {
private static final Logger LOGGER = LoggerFactory.getLogger(ProxyServiceImpl.class);
@Value("${async_send_proxy_threads:100}")
private int nThreads;
@Autowired
private AccessChannelService accessChannelService;
private static final BlockingQueue<ChannelEvent> events = new LinkedBlockingQueue<ChannelEvent>();
private ExecutorService executorService = Executors.newCachedThreadPool();
/**
* 初始化线程池
* 异步调proxy发送channel事件消息
*/
@PostConstruct
private void init() {
for (int i = 0; i < nThreads; i++) {
executorService.submit(new Runnable() {
@Override
public void run() {
while(true){
ChannelEvent event = null;
try {
event = events.take();
} catch (InterruptedException e) {
LOGGER.error("get channel event error: ", e);
}
if (null != event) {
LOGGER.info("proxy received channelId{}, message: {}.",event.getChannelId(), JSON.toJSONString(event.getMessage()));
try{
accessChannelService.received(event.getAppId(), event.getChannelId(), event.getMessage());
}catch (Exception e){
LOGGER.error("proxy received error:", e);
}
}
}
}
});
}
LOGGER.info("init thread pool finished. {}", nThreads);
}
/**
* 异步调proxy转发channel事件请求
*
* @param appId appId
* @param channelId chanelId
* @param message message
*/
@Override
public void asyncSend(int appId, String channelId, MqttWireMessage message) {
ChannelEvent channelEvent = new ChannelEvent(appId, channelId, message);
if (!events.add(channelEvent)) {
LOGGER.error("add channelEvent error, channelId: {}, messageId: {}.", channelId, message.getMessageId());
}
}
private class ChannelEvent {
private int appId;
private String channelId;
private MqttWireMessage message;
ChannelEvent(int appId, String channelId, MqttWireMessage message) {
this.appId = appId;
this.channelId = channelId;
this.message = message;
}
int getAppId() {
return appId;
}
String getChannelId() {
return channelId;
}
MqttWireMessage getMessage() {
return message;
}
@Override
public String toString() {
return "ChannelEvent{" +
"appId=" + appId +
", channelId='" + channelId + '\'' +
", message=" + message +
'}';
}
}
}
BlockingQueue异步调用实现
最新推荐文章于 2021-12-14 16:02:19 发布