AnyLogic自定义代理间是否可通过端口传输对象及触发接收方法问询
完全可以通过端口在自定义代理之间传输任意类型的对象,包括代理实例、动态变量值、自定义数组等数据,操作流程如下:
具体实现步骤
1. 端口配置
- 分别在发送方代理中添加输出端口,接收方代理中添加输入端口
- 端口属性中的
Msg class设置为Object(如果仅传输固定类型数据,也可指定为对应类,减少后续类型转换出错概率) - 在上层容器(父代理/主模型)中,用连接器将发送方输出端口与接收方输入端口完成连接
2. 发送逻辑实现
在需要发送数据的位置,直接调用输出端口的send()方法即可,示例代码:
// 示例1:发送Double类型的动态变量值 outPort.send(dynamicVariableName); // 示例2:发送自定义维度的数组 double[] outputArr = new double[]{1.2, 3.4, 5.6}; outPort.send(outputArr); // 示例3:发送代理实例 outPort.send(agentInstance);
如果需要同时传输多组不同类型的数据,可自定义Java类封装所有要传输的字段,创建类实例后统一发送即可。
3. 接收触发逻辑实现
接收动作不需要手动调用port.receive()方法,系统会在消息传输到输入端口时自动触发:
- 点击接收方的输入端口,在属性面板找到「收到消息时」(英文版为Message received)的代码编辑区
- 在此处编写接收后的处理逻辑,通过内置变量
msg获取发送方传输的对象,使用前需做对应类型转换,示例代码:
// 接收数组类型数据的示例 double[] receivedArr = (double[]) msg; // 将收到的数组赋值给接收方的输入变量 inputArray = receivedArr; // 后续可添加自定义处理逻辑
常见调试失败原因排查
- 未在输入端口的「收到消息时」区域编写处理逻辑,导致收到消息无响应
- 发送和接收的对象类型不匹配,类型转换时报错
- 上层容器中端口的连接关系错误,消息无法传输到目标代理
- 端口的
Msg class设置的类型与实际传输对象类型不兼容,导致传输失败
内容的提问来源于stack exchange,提问作者Piero
相关产品推荐
相关产品推荐

