Multithreading JGroups RPC:NoSuchMethodException
拥有一个由3个服务器节点(美属萨摩亚、阿拉斯加、阿拉巴马)和1个客户端节点(VoterClient)组成的视图。每当我试图在视图中的第一个服务器(在下面的例子中是美属萨摩亚)中调用投票方法时,我会得到一个NoSuchMethodException。下面是视图中的节点列表,如下所示:(ping_dest是美属萨摩亚,pingable_mbrs=[美属萨摩亚、阿拉斯加、阿拉巴马、VoterClient])。所以当我打电话的时候Multithreading JGroups RPC:NoSuchMethodException,multithreading,client,rpc,jgroups,Multithreading,Client,Rpc,Jgroups,拥有一个由3个服务器节点(美属萨摩亚、阿拉斯加、阿拉巴马)和1个客户端节点(VoterClient)组成的视图。每当我试图在视图中的第一个服务器(在下面的例子中是美属萨摩亚)中调用投票方法时,我会得到一个NoSuchMethodException。下面是视图中的节点列表,如下所示:(ping_dest是美属萨摩亚,pingable_mbrs=[美属萨摩亚、阿拉斯加、阿拉巴马、VoterClient])。所以当我打电话的时候 // Call the vote method on the state
// Call the vote method on the state.
voteResult = dispatcher.callRemoteMethod(address1, "vote",
new Object[] { obj.ID, obj.candidate },
new Class[] { String.class, String.class },
new RequestOptions(ResponseMode.GET_ALL, 50000));
其中address1
是“美属萨摩亚”
的地址,obj.ID
和obj.candidate
是远程投票方法的字符串
参数,我得到NoSuchMethodException
这是我的日志和异常:
1644 DEBUG [main] org.jgroups.protocols.FD_SOCK - VIEW_CHANGE received: [American Samoa, Alaska, Alabama, VoterClient, VoterClient]
1664 DEBUG [FD_SOCK pinger,StateServerGroup,VoterClient] org.jgroups.protocols.FD_SOCK - ping_dest is American Samoa, pingable_mbrs=[American Samoa, Alaska, Alabama, VoterClient, VoterClient]
1664 DEBUG [main] org.jgroups.protocols.pbcast.STABLE - [ergonomics] setting max_bytes to 20MB (5 members)
This should be occuring right?????
State server address: American Samoa.
java.lang.NoSuchMethodException: vote
at org.jgroups.blocks.MethodCall.invoke(MethodCall.java:312)
at org.jgroups.blocks.RpcDispatcher.handle(RpcDispatcher.java:326)
at org.jgroups.blocks.RequestCorrelator.handleRequest(RequestCorrelator.java:456)
at org.jgroups.blocks.RequestCorrelator.receiveMessage(RequestCorrelator.java:363)
at org.jgroups.blocks.RequestCorrelator.receive(RequestCorrelator.java:238)
at org.jgroups.blocks.MessageDispatcher$ProtocolAdapter.up(MessageDispatcher.java:543)
at org.jgroups.JChannel.up(JChannel.java:716)
at org.jgroups.stack.ProtocolStack.up(ProtocolStack.java:1026)
at org.jgroups.protocols.pbcast.STATE_TRANSFER.up(STATE_TRANSFER.java:178)
at org.jgroups.protocols.FRAG2.up(FRAG2.java:181)
at org.jgroups.protocols.FlowControl.up(FlowControl.java:418)
at org.jgroups.protocols.FlowControl.up(FlowControl.java:400)
at org.jgroups.protocols.pbcast.GMS.up(GMS.java:889)
...
at org.jgroups.protocols.TP$IncomingPacket.handleMyMessage(TP.java:1728)
at org.jgroups.protocols.TP$IncomingPacket.run(TP.java:1710)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
failed on dispatcher for VoteAction.
1644调试[main]org.jgroups.protocols.FD_SOCK-查看收到的更改:[美属萨摩亚、阿拉斯加、阿拉巴马、VoterClient、VoterClient]
1664调试[FD_SOCK pinger,StateServerGroup,VoterClient]org.jgroups.protocols.FD_SOCK-ping_dest是美属萨摩亚,pingable_mbrs=[美属萨摩亚,阿拉斯加,阿拉巴马,VoterClient,VoterClient]
1664调试[main]org.jgroups.protocols.pbcast.STABLE-[Humanetics]将最大字节设置为20MB(5个成员)
这应该会发生对吧?????
国家服务器地址:美属萨摩亚。
java.lang.NoSuchMethodException:投票
位于org.jgroups.blocks.MethodCall.invoke(MethodCall.java:312)
位于org.jgroups.blocks.RpcDispatcher.handle(RpcDispatcher.java:326)
位于org.jgroups.blocks.RequestCorrelator.handleRequest(RequestCorrelator.java:456)
位于org.jgroups.blocks.RequestCorrelator.receiveMessage(RequestCorrelator.java:363)
位于org.jgroups.blocks.RequestCorrelator.receive(RequestCorrelator.java:238)
位于org.jgroups.blocks.MessageDispatcher$ProtocolAdapter.up(MessageDispatcher.java:543)
位于org.jgroups.JChannel.up(JChannel.java:716)
位于org.jgroups.stack.ProtocolStack.up(ProtocolStack.java:1026)
位于org.jgroups.protocols.pbcast.STATE\u TRANSFER.up(STATE\u TRANSFER.java:178)
位于org.jgroups.protocols.FRAG2.up(FRAG2.java:181)
位于org.jgroups.protocols.FlowControl.up(FlowControl.java:418)
位于org.jgroups.protocols.FlowControl.up(FlowControl.java:400)
位于org.jgroups.protocols.pbcast.GMS.up(GMS.java:889)
...
位于org.jgroups.protocols.TP$IncomingPacket.handleymessage(TP.java:1728)
位于org.jgroups.protocols.TP$IncomingPacket.run(TP.java:1710)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(未知源)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(未知源)
位于java.lang.Thread.run(未知源)
VoteAction的调度程序失败。
投票方式如下:
public class EVoterServer extends ReceiverAdapter implements Runnable{
private static final String serverProperties = null; // default properties
private static Logger logger = Logger.getLogger(EVoterServer.class);
private JChannel channel = null;
private String stateName = null;
private static final String serverProperties = null; // default properties
private static final String channelName = "StateServerGroup";
private boolean isRunning = true;
@Override
public void run() {
try {
channel = new JChannel(serverProperties);
channel.setName(stateName);
@SuppressWarnings("unused")
RpcDispatcher dispatcher = new RpcDispatcher(channel, this, this, this);
channel.connect(channelName);
channel.getState(null, 0);
logger.info(stateName + " server started at " + new Date() + ".");
logger.info(stateName + " joined channel '" + channelName + "' (" + channel.getView().size() + " members).");
logger.info(stateName + " server ready to serve requests.");
logger.info(stateName + " server's channel address is " + channel.getAddress() + ".");
isRunning = true;
while(isRunning) {
Util.sleep(10000);
}
}
catch(Exception e) {
logger.error("EVoterServer.run(); State: " + stateName + "; " + e.getMessage(), e);
}
finally
{
Util.close(channel);
}
}
public boolean vote(String voterId, String candidateName)
{
System.out.println("Vote for " + candidateName + " by " + voterId + ".");
return true;
}
}
公共类EVoterServer扩展ReceiverAdapter实现可运行{
私有静态最终字符串serverProperties=null;//默认属性
私有静态记录器=Logger.getLogger(EVoterServer.class);
专用JChannel通道=null;
私有字符串stateName=null;
私有静态最终字符串serverProperties=null;//默认属性
私有静态最终字符串channelName=“StateServerGroup”;
私有布尔值isRunning=true;
@凌驾
公开募捐{
试一试{
通道=新的JCChannel(服务器属性);
channel.setName(stateName);
@抑制警告(“未使用”)
RpcDispatcher dispatcher=新的RpcDispatcher(频道,这个,这个,这个);
channel.connect(channelName);
channel.getState(null,0);
info(stateName+“服务器在“+新日期()+”启动);
logger.info(stateName+“已加入频道”+“频道名+”(“+channel.getView().size()+“成员”);
info(stateName+“服务器准备好服务请求”);
info(stateName+“服务器的通道地址是”+channel.getAddress()+”);
isRunning=true;
同时(正在运行){
睡眠(10000);
}
}
捕获(例外e){
logger.error(“EVoterServer.run();状态:“+stateName+”;”+e.getMessage(),e);
}
最后
{
Util.close(通道);
}
}
公共布尔投票(字符串voterId、字符串candidateName)
{
System.out.println(“由“+voterId+”投票支持“+candidateName+”);
返回true;
}
}
这是驱动程序类(主方法片段);如何为每个状态初始化服务器
String [] STATE_NAMES = {"Alabama", "Alaska", "American Samoa"};
for (int i = 0; i < 3; i++) {
try {
EVoterServer server = new EVoterServer(STATE_NAMES[i]);
new Thread(server).start();
} catch (Throwable t) {
logger.error(t.getMessage(), t);
}
}
字符串[]州名称={“阿拉巴马州”、“阿拉斯加州”、“美属萨摩亚州”};
对于(int i=0;i< 3;i++){
试一试{
EVoterServer服务器=新的EVoterServer(状态名称[i]);
新线程(server.start();
}捕获(可丢弃的t){
logger.error(t.getMessage(),t);
}
}
我认为这与GMS选出的协调员有关。当协调器与投票服务器状态相同时,客户端无法投票。以下是美属萨摩亚协调员的选举情况:
1401 DEBUG [main] org.jgroups.protocols.UDP - created unicast receiver thread
1401 DEBUG [main] org.jgroups.protocols.UDP - created multicast receiver thread
1411 DEBUG [main] org.jgroups.protocols.pbcast.GMS - election results: {American Samoa=2}
1411 DEBUG [main] org.jgroups.protocols.pbcast.GMS - sending JOIN(VoterClient) to American Samoa
1523 DEBUG [main] org.jgroups.protocols.pbcast.NAKACK -
[setDigest()]
1401调试[main]org.jgroups.protocols.UDP-创建的单播接收器线程
1401调试[main]org.jgroups.protocols.UDP-创建的多播接收器线程
1411 DEBUG[main]org.jgroups.protocols.pbcast.GMS-选举结果:{美属萨摩亚=2}
1411调试[main]org.jgroups.protocols.pbcast.GMS-向美属萨摩亚发送加入(VoterClient)
1523调试[main]org.jgroups.protocols.pbcast.NAKACK-
[setDigest()]
java.lang.NoSuchMethodException:投票
如果Jgroups无法找到有问题的方法,它将从MethodCall.invoke()
抛出该异常。我认为发生这种情况的原因有很多:
- 您提到这在您的其他服务器上工作。可能是因为它运行的是旧版本的软件吗?可能最近更新了
方法vote()
处理程序对象是否有可能尚未注册EVoterServer