Multithreading JGroups RPC:NoSuchMethodException

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

拥有一个由3个服务器节点(美属萨摩亚、阿拉斯加、阿拉巴马)和1个客户端节点(VoterClient)组成的视图。每当我试图在视图中的第一个服务器(在下面的例子中是美属萨摩亚)中调用投票方法时,我会得到一个NoSuchMethodException。下面是视图中的节点列表,如下所示:(ping_dest是美属萨摩亚,pingable_mbrs=[美属萨摩亚、阿拉斯加、阿拉巴马、VoterClient])。所以当我打电话的时候

// 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
    处理程序对象是否有可能尚未注册