从外部Java应用程序运行多平台

时间:2014-08-03 12:55:50

标签: agents-jade

我在访问所有可能与我的问题相关的帖子后发布此内容,但无法找到确切的解决方案。

我在我的硕士学位研究项目中聘请了Jade。也就是说,我想从外部Java应用程序创建几个平台。通过修改网站中的所有文档,特别是“管理”文件,这类似于使用Windows在Windows环境中使用命令行启动多个平台的场景:


第一个平台

打开CMD

type:java jade.Boot -gui -platform-id Platform1

这将启动一个名为Platform1的平台,其中,将在此地址AMS @ Platform1

中访问其AMS

第二个平台

打开另一个“新”CMD

type:java jade.Boot -gui -platform-id Platform2 -local-port 1111

这将启动一个名为Platform2的平台,其中,将在此地址AMS @ Platform2

中访问其AMS

等等。

现在这可以完美地使用命令行,因为我们可以看到具有不同ID和端口的不同平台可以启动,使得其中的代理可以与同一平台或远程平台中的其他代理进行通信。

但是,我尝试使用外部Java应用程序进行相同的启动,并且无法成功执行此操作。

它只能成功启动第一个平台,但不会在其他平台上启动。 这是我的代码

################################################## #############
Profile p1 = new ProfileImpl(true); 
p1.setParameter(ProfileImpl.PLATFORM_ID, "platform"+ID); // ID range from 1 to 10 
p1.setParameter(Profile.LOCAL_PORT, Integer.toString(port)); // available port 
Runtime.instance().setCloseVM(true) 
ContainerController mc = Runtime.instance().createMainContainer(p1); // I need to have a main container    for each platform 
################################################## #############

然后我收到此错误

################################################## ############
Aug 03, 2014 9:42:26 PM jade.imtp.leap.LEAPIMTPManager initialize 
INFO: Listening for intra-platform commands on address: 
- jicp://10.1.1.5:1024 
- jicp://10.1.1.5:1025 

Aug 03, 2014 9:42:26 PM jade.core.AgentContainerImpl joinPlatform 
SEVERE: Some problem occurred while joining agent platform. 
jade.core.ProfileException: Can't get a proxy to the Platform Manager - Caused by:  Wrong platform name platform1. It should be platform2 
        at jade.core.ProfileImpl.createPlatformManager(ProfileImpl.java:529) 
        at jade.core.ProfileImpl.getPlatformManager(ProfileImpl.java:442) 
        at jade.core.ProfileImpl.getServiceManager(ProfileImpl.java:456) 
        at jade.core.AgentContainerImpl.init(AgentContainerImpl.java:346) 
        at jade.core.AgentContainerImpl.joinPlatform(AgentContainerImpl.java:492) 
        at jade.core.Runtime.createMainContainer(Runtime.java:166) 
        at intiator.intiatePlatform(intiator.java:49) 
        at MainLauncher.main(MainLauncher.java:69) 
Nested Exception: 
jade.core.IMTPException: Wrong platform name platform1. It should be platform2 
        at jade.imtp.leap.CommandDispatcher.setPlatformManager(CommandDispatcher.java:231) 
        at jade.imtp.leap.CommandDispatcher.registerSkeleton(CommandDispatcher.java:736) 
        at jade.imtp.leap.LEAPIMTPManager.exportPlatformManager(LEAPIMTPManager.java:198) 
        at jade.core.ProfileImpl.createPlatformManager(ProfileImpl.java:518) 
        at jade.core.ProfileImpl.getPlatformManager(ProfileImpl.java:442) 
        at jade.core.ProfileImpl.getServiceManager(ProfileImpl.java:456) 
        at jade.core.AgentContainerImpl.init(AgentContainerImpl.java:346) 
        at jade.core.AgentContainerImpl.joinPlatform(AgentContainerImpl.java:492) 
        at jade.core.Runtime.createMainContainer(Runtime.java:166) 
        at intiator.intiatePlatform(intiator.java:49) 
        at MainLauncher.main(MainLauncher.java:69) 
Exception in thread "main" java.lang.NullPointerException 
        at intiator.intiatePlatform(intiator.java:58) 
        at MainLauncher.main(MainLauncher.java:69) 
################################################## #############

所以我想成功使用代码,因为它将使用命令行

1 个答案:

答案 0 :(得分:0)

您的建议是同时在同一个Java程序中创建和启动两个或更多个jade平台。除非您编写一个启动单个平台并增加端口并运行多次的程序(尽可能多地需要平台),否则这是不可能的。否则我没有看到任何其他选择。

您可以使用此方法测试端口是否可用:

private boolean isAvailablePort(int port) {
    ServerSocket ss = null;
    DatagramSocket ds = null;
    try {
        ss = new ServerSocket(port);
        ss.setReuseAddress(true);
        ds = new DatagramSocket(port);
        ds.setReuseAddress(true);
        return true;
    } catch (IOException e) {
    } finally {
        if (ds != null) {
            ds.close();
        }
        if (ss != null) {
            try {
                ss.close();
            } catch (IOException e) {
            }
        }
    }
    return false;
}

然后您可以使用它,例如:

while(!isAvailablePort(port)){
    port++;
}

自动化端口增量。