RPC 远程调用超时

dyci 发布于 2015/12/31 11:11
阅读 2K+
收藏 0

@少帮主 你好,想跟你请教个问题:


import java.io.IOException;


import org.zbus.broker.Broker;
import org.zbus.broker.BrokerConfig;
import org.zbus.broker.SingleBroker;
import org.zbus.kit.ConfigKit;
import org.zbus.rpc.RpcProcessor;
import org.zbus.rpc.mq.Service;
import org.zbus.rpc.mq.ServiceConfig;


import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;


public class RPCService {
private Prop prop = PropKit.use("play.properties");
private String ip = prop.get("zbus.host");
private String port = prop.get("zbus.port");
private ServiceConfig config;
private Service svc;
private boolean isStart = false;

public boolean isStart() {
return isStart;
}


public RPCService(){
final String serverAddress = ConfigKit.option(new String[]{}, "-b", ip+":"+port);
final int threadCount = ConfigKit.option(new String[]{}, "-c", 32); 
final String mq = ConfigKit.option(new String[]{}, "-mq", "RPCMessageCenter");

RpcProcessor processor = new RpcProcessor(); 
//增加模块,模块名在调用时需要指定
processor.addModule(new MessageService()); 

//配置Broker
BrokerConfig brokerCfg = new BrokerConfig();
brokerCfg.setServerAddress(serverAddress); 
/*brokerCfg.setMaxTotal(threadCount);
brokerCfg.setMinIdle(threadCount);*/

Broker broker = null;
try {
broker = new SingleBroker(brokerCfg);
} catch (IOException e) {
e.printStackTrace();
}

config = new ServiceConfig();
//config.setConsumerCount(threadCount); 
config.setMq(mq); 
config.setBroker(broker);    
config.setMessageProcessor(processor); 

svc = new Service(config);
}

public boolean start(){
try {
svc.start();
isStart = true;
return isStart;
} catch (IOException e) {
e.printStackTrace();
return isStart;

}

}

报错:

Exception in thread "Thread-9" org.zbus.mq.MqException: {"@type":"org.zbus.rpc.RpcCodec$Request","encoding":"UTF-8","method":"sendMessage","module":"","paramTypes":null,"params":["{\"from\":\"Test\",\"to\":\"fb6d56af5fdd4ce9b49ee0f865f83354\"}"]}
at org.zbus.mq.Consumer.recv(Consumer.java:88)
at org.zbus.mq.Consumer$1.run(Consumer.java:145)
at java.lang.Thread.run(Thread.java:745)




//测试代码

public static void RPCMessageCenter() {
Prop prop = PropKit.use("play.properties");
String ip = prop.get("zbus.host");
String port = prop.get("zbus.port");

BrokerConfig brokerConfig = new BrokerConfig(); 
brokerConfig.setServerAddress(ip + ":" + port);
Broker broker = null;
try {
broker = new SingleBroker(brokerConfig);
} catch (IOException e) {
e.printStackTrace();
}  
MqInvoker messageInvoker = new MqInvoker(broker, "RPCMessageCenter"); 
RpcInvoker rpc = new RpcInvoker(messageInvoker);     
rpc.setVerbose(true);
Map<String, String> map = new HashMap<String, String>();
map.put("from", "Test");
map.put("to", "fb6d56af5fdd4ce9b49ee0f865f83354");

boolean s = rpc.invokeSync(boolean.class, "sendMessage", JsonKit.toJson(map));

try {
broker.close();
} catch (IOException e) {
e.printStackTrace();
}
}

报错:

2015-12-31 11:07:48
[INFO]-[Thread: main]-[org.zbus.rpc.RpcInvoker.invokeSync()]: [REP]: Time cost=10430ms
null
Exception in thread "main" org.zbus.rpc.RpcException: module()-method(sendMessage) request timeout
GET / HTTP/1.1
ack: 0
cmd: produce
connection: Keep-Alive
content-length: 388
id: 1f01ede3-d068-4e75-a851-6f8217331148
mq: RPCMessageCenter


{"@type":"org.zbus.rpc.RpcCodec$Request","encoding":"UTF-8","method":"sendMessage","module":"","paramTypes":null,"params":["{\"from\":\"Test\",\"to\":\"fb6d56af5fdd4ce9b49ee0f865f83354\"}"]}
at org.zbus.rpc.RpcInvoker.invokeSync(RpcInvoker.java:161)
at org.zbus.rpc.RpcInvoker.invokeSync(RpcInvoker.java:102)
at org.zbus.rpc.RpcInvoker.invokeSync(RpcInvoker.java:75)
at com.zjhcsoft.test.ZBusTest.RPCMessageCenter(ZBusTest.java:341)
at com.zjhcsoft.test.ZBusTest.main(ZBusTest.java:353)


加载中
0
12叔
12叔
timeout时间设置长点呐
0
callmeHEN
callmeHEN

超时的原因分析:

1. service端异常

2. service执行时间过长,导致超时。

建议service单个方法不要执行长时间任务。可拆分为多个接口!

返回顶部
顶部