我在访问所有可能与我的问题相关的帖子后发布此内容,但无法找到确切的解决方案。
我在我的硕士学位研究项目中聘请了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)
################################################## #############
所以我想成功使用代码,因为它将使用命令行
答案 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++;
}
自动化端口增量。