multithreading - JGroups RPC : NoSuchMethodException

标签 multithreading client rpc jgroups

有一个由3个服务器节点(美属萨摩亚,阿拉斯加,阿拉巴马州)和1个客户端节点(VoterClient)组成的 View 。每当我尝试在 View 中的第一台服务器(在以下情况下为美属萨摩亚)中调用表决方法时,都会收到NoSuchMethodException。这是 View 中的节点列表,如下所示:(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"American Samoa"的地址,obj.IDobj.candidate是远程投票方法的String参数,我得到了NoSuchMethodException。

这是我的日志和异常(exception):

1644年DEBUG [主要] org.jgroups.protocols.FD_SOCK-收到VIEW_CHANGE:[美属萨摩亚,阿拉斯加,阿拉巴马州,VoterClient,VoterClient]
1664年DEBUG [FD_SOCK pinger,StateServerGroup,VoterClient] org.jgroups.protocols.FD_SOCK-ping_dest是美属萨摩亚,pingable_mbrs = [美属萨摩亚,阿拉斯加,阿拉巴马州,VoterClient,VoterClient]
1664 DEBUG [main] org.jgroups.protocols.pbcast.STABLE-[人体工程学]将max_bytes设置为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_TRANSFER.up(STATE_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.handleMyMessage(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)类EVoterServer扩展了ReceiverAdapter实现的Runnable {
私有(private)静态最终String serverProperties = null;//默认属性
私有(private)静态Logger logger = Logger.getLogger(EVoterServer.class);
私有(private)JChannel channel = null;
private String stateName = null;
私有(private)静态最终String serverProperties = null;//默认属性
私有(private)静态最终String channelName =“StateServerGroup”;
private boolean isRunning = true;

@Override
公共(public)无效run(){
尝试 {
channel =新的JChannel(serverProperties);
channel.setName(stateName);
@SuppressWarnings(“未使用”)
RpcDispatcher dispatcher = new RpcDispatcher(channel,this,this,this);
channel.connect(channelName);
channel.getState(null,0);

logger.info(stateName +“服务器从” + new Date()+“。”启动);
logger.info(stateName +“加入的 channel '” + channelName +“'(” + channel.getView()。size()+“成员)。”);
logger.info(stateName +“服务器已准备好处理请求。”);
logger.info(stateName +“服务器的 channel 地址为” + channel.getAddress()+“。”);

isRunning = true;

while(isRunning){
实用 sleep (10000);
}
}
catch(Exception e){
logger.error(“EVoterServer.run(); State:” + stateName +“;” + e.getMessage(),e);
}
最后
{
Util.close(channel);
}
}

公共(public) bool 投票(字符串voterId,字符串候选人名称)
{
System.out.println(“通过” +选民ID +“来投票” +“候选人名称”“”);
返回true;
}
}

这是驱动程序类(主方法代码段);我如何初始化每个状态的服务器。

字符串[] STATE_NAMES = {“阿拉巴马州”,“阿拉斯加”,“美属萨摩亚”};
for(int i = 0; i <3; i++){
尝试 {
EVoterServer服务器=新的EVoterServer(STATE_NAMES [i]);
新的Thread(server).start();
} catch(Throwable t){
logger.error(t.getMessage(),t);
}
}

我认为这与GMS选举的协调员有关。当协调器与投票服务器状态相同时,客户端无法投票。下面显示了协调员美属萨摩亚的选举方式:

1401 DEBUG [main] org.jgroups.protocols.UDP-创建的单播接收器线程
1401 DEBUG [main] org.jgroups.protocols.UDP-创建的多播接收器线程
1411 DEBUG [main] org.jgroups.protocols.pbcast.GMS-选举结果:{美属萨摩亚= 2}
1411 DEBUG [main] org.jgroups.protocols.pbcast.GMS-向美属萨摩亚发送JOIN(VoterClient)
1523 DEBUG [main] org.jgroups.protocols.pbcast.NAKACK-
[setDigest()]

最佳答案

java.lang.NoSuchMethodException: vote



如果无法找到有问题的方法,则Jgroups从MethodCall.invoke()抛出该异常。我看到发生这种情况的原因有很多:
  • 您提到这正在其他服务器上运行。可能是该软件正在运行旧版本的软件吗?也许vote()方法是最近更新的?
  • 是否有可能未正确注册EVoterServer处理程序对象?
  • 我对错误消息failed on dispatcher for VoteAction很好奇。什么是VoteAction?是否有可能注册了它而不是EVoterServer?也许这是偶然连接到错误组的不同 channel 吗?

  • 希望这里有所帮助。

    关于multithreading - JGroups RPC : NoSuchMethodException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10904837/

    相关文章:

    java - 为什么添加这个防御性副本可以避免死锁?

    ruby - Mysql2:关闭客户端连接

    rabbitmq - Celery rpc 与 amqp 结果后端

    java - 安卓java : How to send message from server to a specific client any time

    python - 高效的 Python IPC

    go - 解码为接口(interface)类型

    c# - 在 C# 中如何在同一线程中运行异步方法

    Java 静态和非静态方法的同步

    java - 如何使用 ExecutorService 重新启动之前在 Swing 应用程序中终止的线程

    java - 如何让服务器在单击按钮时向客户端发送消息