package org.zbus.client.service;
import java.io.IOException;
import org.zbus.client.Consumer;
import org.zbus.common.logging.Logger;
import org.zbus.common.logging.LoggerFactory;
import org.zbus.common.remoting.Message;
public class Service extends Thread {
private static final Logger log = LoggerFactory.getLogger(Service.class);
private final ServiceConfig config;
private Thread[] workerThreads;
public Service(ServiceConfig config){
this.config = config;
if(config.getMq() == null || "".equals(config.getMq())){
throw new IllegalArgumentException("MQ required");
}
if(config.getServiceHandler() == null){
throw new IllegalArgumentException("serviceHandler required");
}
}
public void run(){
this.workerThreads = new Thread[config.getThreadCount()];
for(int i=0;i<workerThreads.length;i++){
WorkerThread thread = new WorkerThread(config);
this.workerThreads[i] = thread;
this.workerThreads[i].start();
}
for(Thread thread : this.workerThreads){
try {
thread.join();
} catch (InterruptedException e) {
log.error(e.getMessage(), e);
}
}
}
}
class WorkerThread extends Thread{
private static final Logger log = LoggerFactory.getLogger(WorkerThread.class);
private ServiceConfig config = null;
public WorkerThread(ServiceConfig config){
this.config = config;
}
@Override
public void run() {
Consumer consumer =new Consumer(config.getBroker(), config.getMq());
final int timeout = config.getReadTimeout(); //ms
consumer.setAccessToken(config.getAccessToken());
consumer.setRegisterToken(config.getRegisterToken());
while(true){
try {
Message msg = consumer.recv(timeout);
if(msg == null) continue;
log.debug("Request: %s", msg);
final String mqReply = msg.getMqReply();
final String msgId = msg.getMsgIdRaw(); //必须使用原始的msgId
Message res = config.getServiceHandler().handleRequest(msg);
if(res != null){
res.setMsgId(msgId);
res.setMq(mqReply);
consumer.reply(res);
}
} catch (IOException e) {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
//ignore
}
}
}
}
}