移动
Agent
技术介绍 ( by quqi99 )
作者:张华 发表于:2011-04-07
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明
( http://blog.csdn.net/quqi99 )
1
Agent概述
Agent的研究起源于分布式人工智能。Agent是模拟人类的行为和关系、具有一定智能并能够自主运行和提供相应服务的程序。
随着网络技术的发展,可以让它在网络中移动并执行,自主完成某些功能,这就Mobile Agent的思想
。
移动Agent由于具有任务异步执行、减轻网络负载、健壮性、并行处理、智能路由等特性,20世纪90年代初期以来,对许多领域产生了非常重大的影响。
Agent的概念出现于20世纪70年代的人工智能中,20世纪80年代后期才成长起来,在计算机领域,Agent可以看作是一种在分布式系统或协作系统中,能持续自主地发挥作用的计算机主体,即软件智能体。
分布式人工智能(DAI)是人工智能研究领域的一个重要分支,也是当前人工智能和分布式系统研究最为活跃的方向之一。分布式人工智能系统由多个Agent组成,每个Agent又是一个半自治系统,这些Agent之间以及Agent与环境之间都是并发的,需要进行交互,DAI研究工作大致分分布式问题求解(DPS)和多Agent系统(MAS)两个方向。
Agent一般具有自主性、交互性、反应性和主动性的特征。
(1)自主性:Agent具有属于自身的计算资源和局部于自身行为的控制机制,能够在外界直接操纵的情况下,根据其内部状态和感知到的外部环境,决定和控制自身的行为。
(2)交互性:能够和其他Agent进行各种形式的交互,能有效地与其它Agent协同工作。
(3)反应性:能够感知所处的环境,并对相关事件做出及时的反应。
(4)主动性:能够遵循承诺采取主动行动,表现出面向目标的行为。
另外,很多AI的研究人员认为,Agent不仅应具有以上定义的特性,而且还具有一些通常人类才具有的概念,如信念、愿望和意图等认知特性。
1.2
移动Agent
随着网络技术的发展,可以让Agent在网络中移动并执行,完成某些功能,这就是移动Agent(Mobile Agent)的思想。
20世纪90年代初由General Magic公司在推出商业系统Telescript时提出了移动Agent的概念。简单地说,移动Agent是一个能在异构网络中自主地从一台主机迁移到另一台主机,并可与其他Agent或资源交互的程序,实际上它是Agent技术与分布式计算技术的混血儿。移动Agent不同于远程执行,移动Agent能够不断地从一个网络位置移动到另一个位置,能够根据自己的选择进行移动。移动Agent不同于进程迁移,一般来说进程迁移系统不允许进程选择什么时候和迁移到哪里,而移动Agent带有状态,所以可根据应用的需要在任意时刻移动,可移动到它想去的任何地方。移动Agent也不同于Applet,Applet只能从服务器向客户单方向移动,而移动Agent可以在客户和服务器之间双向移动。
移动Agent具有很多优点,移动Agent技术通过将服务请求Agent动态地移到服务器端执行,使得此Agent较少依赖网络传输这一中间环节而直接面对要访问地服务器资源,从而避免了大量数据地网络传送,降低了系统对网络带宽的依赖。
移动Agent不需要统一的调度,由用户创建的Agent可以异步地在不同结点上运行,待任务完成后再将结果传送给用户。为了完成某项任务,用户可以创建多个Agent,同时在一个或若干个结点上运行,形成并行求解的能力。此外它还具有自治性和智能路由等特性。
1.3
移动Agent的分布式计算模式
移动Agent模式的关键特性就是网络中的任一主机都拥有处理资源、处理器和方法的任意组合的灵活性,如图1.1所示。方法(在移动Agent)的形式下)没有锁定在一台主机上,而是在整个网络内可共享。
图1.1 移动Agent的分布式计算模式
1.4
移动Agent的主要优点
降低网络负载:这一特征概括了基于移动Agent的分布式计算的特点,即将计算移往数据,而并非把数据移往计算。这样做所带来的好处是可以减少网上原始数据的流量。
克服网络延迟:在一些系统应用中,对环境做出实时反应是极为重要的,对此移动Agent技术提供了一个很好的解决方法,可以由中央处理器将移动Agent派遣到系统局部,直接执行控制器的指令,从而消除网络延迟带来的隐患。
包装不同协议:在分布式系统中进行数据交换,一个系统送出的数据必须被接受方正确解释,这就需要协议的支持,即对输出的数据进行编码,对接收到的数据进行解码。但由于效率和安全性方面等方面的原因,通常会遇到一方希望对协议进行升级的情况,这常常需要对应用进行大量改动,这对于部分原有系统来说,几乎不可能进行。对比,移动Agent可以移动到远程主机上,通过专用协议建立私有数据交换通道。
异步和主动执行功能:移动设备通常依赖昂贵而脆弱的网络连接进行工作。而有的任务,要求移动设备与网络之间必须保持持续的连接,但这可能既不经济,在技术上也不可行。要解决这一难题,可以将任务嵌入到移动Agent之中,而后者可以被派遣到网络上。之后,移动Agent便可以独立创建它的进程,异步、自主地完成所肩负的任务;移动设备则可以在这之后再连接上网络,收回Agent,取得服务结果。
动态适应环境:移动Agent具有感知运行环境和对其变化做出自主反应的能力。多个Agent可以拥有在网上各主机之间合理分布的能力,以维持解决某一特定问题的最优配置。
自然异构性:开放分布式计算各平台之间,往往从硬件到软件都是异质的。由于移动Agent往往独立于特定的主机和传输层协议,而仅仅依赖于它的执行环境(已屏蔽各平台的差异),因而为进行无缝的系统集成提供了极为有利的条件。
健壮性和容错性:由于移动Agent具有对不利的情况和事件动态做出反应的能力,因而减小了建立健壮和容错的分布式系统的难度。在一台主机被关闭以前,可以给正在运行的移动Agent发出警告,它们可在很短的时间内移动到网络上其他主机上,且继续运行。
1.5
移动Agent的应用范围
由于移动Agent所具有的优越性,使它在以下应用中具有很大的潜力。
电子商务:移动Agent非常适合电子商务。交易常常要求实时访问远程信息,如股票报价,甚至是进行实时谈判。不同的Agent拥有不同的目标,并将采取不同的策略以实现各自的目标。可以预想Agent能体现其创建者的意图,并能代表他们的各自利益进行谈判。由此可见,移动Agent技术在电子商务领域有着广阔的应用前景。
分布式信息检索:正如在前面分析移动Agent技术优越性时指出的那样,移动Agent派往数据所存放的地方将大大减轻网络负载和消除网络延迟。同时,由于Internet这样的浩如烟海的信息环境中进行分布式信息检索往往需要花费大量的时间,这时如果仍保持网络连接,则需要花费许多费用;但是通过使用移动Agent技术,使得创建移动Agent的主机可以与网络断开连接,从而节省大量的连接费用和主机机时。
信息发布:移动Agent可以帮助实现Internet的信息PUSH模型。例如,移动Agent可以将新的软件版本以及安装程序直接带到客户主机,进行自动升级和维护。
个人助手:由于具有在远程主机上运行的能力,使移动Agent具备代表其创建者在网络中完成特定任务的能力。由于不受网络连接的限制,其创建者甚至可以关掉他们的计算机。
安全中介:在合作者之间并不能彼此完全信任的情况下,各方可以将移动Agent派往一台彼此都认为安全的主机(它提供了移动Agent的执行环境)上进行协作,从而不必冒险接受对方的直接访问。
电信网络业务:对先进电信业务的支持和管理,关键在于能够对网络进行动态配置和定制用户业务。庞大的物理网络规模和用户的严格要求,使得只有依靠移动Agent技术才能有效地保证系统的灵活和高效。
工作流应用:工作流应用的特点之一是支持合作者之间的信息流动。对此,移动Agent技术能够提供很好的支持,可以将信息相关的操作封装在移动Agent中,再利用后者的移动性和自主性,让信息在机构内部有效地流动。
并行处理:在并行计算中,可以利用Agent技术把各个需要并发执行的子任务派遣到不同的主机上,以实现并发计算。
总之,Agent特别适合用于解决传统方法中要么代价过于昂贵,要么解决不了的问题,如数据、控制、专家知识和资源分布问题,使大量的数据处理可在数据源进行(因为Agent可以移动),只需交换少量的高层信息,减少了大量原始数据传送到远地的操作,提高了网络的利用率;如果需要人性化的进程,Agent具有观察能力、主动适应能力,而不是通过一些预先严格确定的接口函数与外界进行交互作用,能根据目标主动规范化自己的行为,使用用户界面达到“人性化”;如需要集成旧系统,可通过给旧系统上包装一层Agent外壳,其他系统可以调用旧系统的功能。
2 Agent框架
2.1
移动Agent平台分析比较
虽然移动Agent的实质是移动代码与代码运行挂起时所处的状态,也就是对象从一台主机移动到另一台主机上,我们自己就能实现,例如在JAVA中可以通过JAVA的序列化机制来实现,在C++中我们也可以用DCOM来实现。但是要实现移动Agent,为了加快开发节省成本我们一般要选择一个成熟的移动Agent开发平台。移动Agent开发平台为我们开发基于移动Agent的程序提供了各种公共服务。按照现有的实现技术可以将移动Agent系统分为两类:一种是基于移动代码的,例如Telescript;另一种是基于远程对象的,例如Aglet。下面对当前较为成熟的移动Agent系统平台的分析与对比如下:
1.D’Agent
D’Agent(以前称为Agent TCL)是美国Dartmouth大学研究的移动Agent系统。它从支持单一语言TCL发展到目前支持TCL,JAVA和Scheme等多种语言。D’Agent能自动捕获和恢复移动Agent的完整状态,即意味这代理可以在任意点中断执行,然后移动到其它环境中继续执行。
通讯基础: D’Agent的高层通讯机制采用RMI,KiaML等不同的通讯方式,它的服务程序是多线程的,每个代理在单独的进程中执行,这种方式简化了实现,但增加了进程间的通讯开销。
容错服务:Agent可以存储在物理介质上,以防止意外。
安全服务:D’Agent用公钥系统来对Agent进行身份认证,用静态资源管理来管理Agent对资源的访问,不但可以授权访问某种资源,还可以限制使用。
通信服务:支持异步或同步通信模式。
生命周期服务:支持复制克隆和远程创建等操作。
2.Aglet
Aglet是由日本IBM公司用纯JAVA开发的移动Agent技术,并提供了实用的平台-----Aglet Workbench,让人们开发或执行移动Agent系统。到目前为止,Aglet是上述出现实例中最为成功和全面的系统之一,主要表现在以下几个方面:
(1)提供了一个简单而全面的移动Agent编程模型。
(2)为Agent间提供了动态而有效的通信机制。
(3)提供了一套详细且易用的安全机制。
Aglet这个词是由”Agent”和”applet”两个字合成的。简单地说,Aglet就是具有Agent行为的Java applet对象。但Aglet同时传送代码及其状态,而applet只传送代码。Aglet以线程的形式产生于一台机器上,可以随时暂停执行的工作,而后整个Agent可以被分派到另一个机器上,再重新启动执行任务。因为它占用的是线程,所以不会消耗太多的系统资源。
3.Concordia
Concordia系统也是基于JAVA语言开发的一个移动Agent系统,它由Agent Manager,Security Manager, Queue Manager,Event Manager和Service Bridge模块组成。在每个网络节点上,Concordia都在运行Java虚拟机上的服务器,负责Agent的移动,持久性,安全,通讯等工作。Concordia 注重系统的安全性和容错性,系统安全保护措施是双向的,既保护节点资源又保护移动Agent本身。Concordia 对Agent的权限限制主要由使用者决定,这是它和Aglet系统的一个区别。Concordia 的通讯利用现有的TCP/IP通讯服务,其通讯模块提供的是异步通讯模式,没有提供同步通讯模式,这是该系统的一个不足之处。
4.Voyager
Recursion公司的Voyager可以看成是一个增强了的对象请求代理(ORB),同其它移动Agent系统相比,Voyager与Java语言的结合更加紧密,既可用于开发移动Agent系统,也可用于创建传统的分布式系统。Voyager是一个纯Java分布式计算平台,可用来迅速生成高性能分布式应用程序,是代表当前技术水平的一个优秀的移动Agent开发平台。
5.Grasshoper
Grasshoper是目前第一个符合MASIF标准,也是目前唯一符合MASIF和FIPA标准的,基于JAVA的移动Agent系统。 Grasshoper环境包括代理处(Agency)和域注册器,通过专有的ORB(Grasshoper ORB)互联。Agency(相当于MASIF中的Place)是代理实际的运行环境,数个Agency结合构成域,还可以通过JAVA RMI和Socket连接进行通讯。整个通讯结构实现采用插件技术,具有很好的扩充性。在容错服务方面,系统崩溃之后可以从存储介质中恢复Agent的原来执行状态.安全身份证用X. X09证书实现,传输中的安全性由SSL来保证,访问控制通过用户定制的安全管理来完成,实现了数字鉴名。通讯服务支持异步或同步的通讯,动态消息机制和多点发送:生命周期支持复制远程创建和克隆等操作。
2.2
移动Agent支撑平台Aglet
1.Aglet系统框架
Aglet的系统框架如图2.1所示:
图2.1 Aglet的系统框架
首先当一个正在执行的Aglet想要将自己迁移到远端时,会对Aglet Runtime层发出请求;接着Aglet Runtime层将Aglet的状态信息与代码转换成序列化的字节数组。这时如果成功,系统会将字节数组传送至ATCI(Agent Transport and Communication)接口,ATP是一个简单的应用层协议。接着,系统会将字节数组附上相关的系统信息,如系统名称以及Aglet的id等,并以比特流方式通过网络传至远程机器,远程机器通过ATCI层提供的ATP接口,接收到系统传来的字节数组及系统信息;最后,Aglet Runtime层对字节数组反序列化,得到Aglet的状态信息与代码,此时Aglet可以在远程机器上执行。
2.Aglet的生命周期
Aglet系统提供一个上下文环境(context)来管理Aglet的基本行为,包括创建(create)Agent、复制(clone)Agent、分派(dispatch)Agent到远端机器、召回(retract)远端的Agent、暂停(deactive)、唤醒(active)Agent,以及清除(dispose)Aglet等,其过程如图2.2所示:
图2.2 Aglet的生命周期
3.Aglet工作台及Aglet的包结构
Aglet工作台是一个可视化环境,它被用来建立使用移动Agent的网络应用。目前它提供的工具包括:
(1)移动Agent的框架。
(2)ATP-----Agent传输协议。
(3)Tazza-----可视化地开发应用所需的个性化的移动Agent。
(4)JDBC-----用于访问DB2数据库。
(5)JoDax------访问单位的数据。
(6)Tahiti-----可视化Agent的管理页面。
(7)Fiji-----通过在WEB页面上对Agent实行生命周期控制。
Aglet包含如下几个包:
com.ibm.Aglet:这个包定义Aglet的一些接口以及提供管理Agent上下文环境,以及信息的发送和接收的常用方法。
com.ibm.Aglet.event:此包实现了对象模型中的生命周期。
com.ibm.Aglet.system:主要是管理Aglet运行层的一些函数。
com.ibm.Aglet.util:提供一些公共类,如letAudioClip。
com.ibm.Aglet.patterns:包含常见的消息传递模式,如Master-Slave、Notifier-Notification等。
3 Aglet实战
3.1 案例需求
分布式计算实现矩阵乘法。
在局域网中两台机器,一台为Master,一台为Slave。Master创建Matrix类,并创建Calculator类,发送到Slave机器上运行。Master机器将Slave机上运行完成后的Agent回收(结果),再和本机上的运行结果合并,并显示出最终结果。
3.2 程序实现
package examples.Matrix;
import com.ibm.aglet.*;
import com.ibm.aglet.event.*;
import com.ibm.aglet.util.*;
import java.lang.InterruptedException;
import java.io.Externalizable;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.io.IOException;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Enumeration;
/**作者:张华**/
public class Matrix extends Aglet {
transient MyDialog my_dialog = null; //没有串行化
URL dgp = null;//客户端地址
String message = null;
//矩阵初始化
int matone[][]=new int[10][10];
int mattwo[][]=new int[10][10];
int matthr[][]=new int[10][10];
boolean Flag;//设置标志量
int all = 0;
AgletProxy outer;//Agent客户机地址
//设置初始窗口
public void onCreation(Object init) {
Flag=true;
setMessage("Choose remote machine and GO!");//窗口显示信息
createGUI(); //创建窗口
}
//创建窗口
protected void createGUI(){
my_dialog = new MyDialog(this);
my_dialog.pack();
my_dialog.setSize(my_dialog.getPreferredSize());
my_dialog.setVisible(true);
}
//窗口显示信息
public void setMessage(String message){
this.message = message;
}
//处理信息
public boolean handleMessage(Message msg) {
if (msg.sameKind("Finish")) {
OutPut(msg);
} else if (msg.sameKind("startTrip")){
startTrip(msg);
}
else{
return false;
};
return true;
}
//报告已经返回并销毁
public void OutPut(Message msg) {
setText("output begin");
while (Flag){
waitMessage(5*10);
};
my_dialog.msg.append("/n"+msg.getArg("answer").toString()+"/n");
}
public synchronized void startTrip(Message msg) { //到达远程机器
String destination = (String)msg.getArg(); //
得到远程机器地址
//
客户端得到
Agent
的内容
try{
outer=getAgletContext().createAglet(null,"examples.Matrix.Calculator",getProxy());
}catch(Exception e){setText("wrong!");};
try{
dgp=new URL(destination); //dgp
为客户端地址
}catch(MalformedURLException e){setText("wrong!");};
try{
outer.dispatch(dgp); //
发送到客户端
}catch(Exception e){setText("wrong!");};
matrixrun(); //本机上任务开始运行
}
//本机上程序
public void matrixrun(){
setText("matrixrun begin");
for (int x=0;x<10;x++){
for(int y=0;y<10;y++){
matone[x][y]=1;
mattwo[x][y]=1;
matthr[x][y]=0;
}
};
for (int x=0;x<5;x++){
for (int y=0;y<10;y++){
for (int z=0;z<10;z++){
matthr[x][y]=matthr[x][y]+matone[x][z]*mattwo[z][y];
}
}
};
Flag=false;
String result="";
for (int x=0;x<5;x++){
for (int y=0;y<10;y++){
result=result+"A["+x+"]["+y+"]="+matthr[x][y]+" ";
}
}
//打印本机结果
my_dialog.msg.append("The result shows down:"+"/n"+result+"/n"+"Local is over!");
setText("matrixrun over");
}
}
//MyDialog 窗口
class MyDialog extends Frame implements WindowListener, ActionListener{
private Matrix aglet = null;
//下面是一些GUI组件
private AddressChooser dest = new AddressChooser();
public TextArea msg =
new TextArea("",10,20,TextArea.SCROLLBARS_VERTICAL_ONLY);
private Button go = new Button("GO!");
private Button close = new Button("CLOSE");
//创建对话窗口
MyDialog(Matrix aglet) {
this.aglet = aglet;
layoutComponents();
addWindowListener(this);
go.addActionListener(this);
close.addActionListener(this);
}
//组件的布局
private void layoutComponents() {
msg.setText(aglet.message);
GridBagLayout grid = new GridBagLayout();
GridBagConstraints cns = new GridBagConstraints();
setLayout(grid);
cns.weightx = 0.5;
cns.ipadx = cns.ipady = 5;
cns.fill = GridBagConstraints.HORIZONTAL;
cns.insets = new Insets(5,5,5,5);
cns.weightx = 1.0;
cns.gridwidth = GridBagConstraints.REMAINDER;
grid.setConstraints(dest, cns);
add(dest);
cns.gridwidth = GridBagConstraints.REMAINDER;
cns.fill = GridBagConstraints.BOTH;
cns.weightx = 1.0;
cns.weighty = 1.0;
cns.gridheight = 2;
grid.setConstraints(msg, cns);
add(msg);
cns.weighty = 0.0;
cns.fill = GridBagConstraints.NONE;
cns.gridheight = 1;
Panel p = new Panel();
grid.setConstraints(p, cns);
add(p);
p.setLayout(new FlowLayout());
p.add(go);
p.add(close);
}
//事件的处理
public void actionPerformed(ActionEvent ae){
//对“go”按钮的处理
if("GO!".equals(ae.getActionCommand())){
aglet.setMessage(msg.getText());
msg.setText("");
try{
AgletProxy p = aglet.getProxy();
p.sendOnewayMessage(new Message("startTrip", dest.getAddress()));
}catch(Exception e) {
e.printStackTrace();
}
}
// 对“close”按钮的处理
else if("CLOSE".equals(ae.getActionCommand())){
setVisible(false);
}
}
public void windowClosing(WindowEvent we){
dispose();
}
public void windowOpened(WindowEvent we){
}
public void windowIconified(WindowEvent we){
}
public void windowDeiconified(WindowEvent we){
}
public void windowClosed(WindowEvent we){
}
public void windowActivated(WindowEvent we){
}
public void windowDeactivated(WindowEvent we){
}
}
//Calculator.java
package examples.Matrix;
import java.lang.InterruptedException;
import java.io.Externalizable;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.io.IOException;
import java.net.*;
import java.util.Enumeration;
import com.ibm.aglet.*;
/**作者:张华**/
public class Calculator extends Aglet{
AgletProxy proxy=null;
int matone[][]=new int[10][10];
int mattwo[][]=new int[10][10];
int matthr[][]=new int[10][10];
public void onCreation(Object init){
setText("creation begin");
try{
proxy=(AgletProxy)init;
}catch(Exception e){setText("wrong!1");};
}
public void run(){
setText("Calculator begin");
for (int x=0;x<10;x++){
for(int y=0;y<10;y++){
matone[x][y]=1;
mattwo[x][y]=1;
matthr[x][y]=0;
}
};
for (int x=0;x<5;x++){
for (int y=0;y<10;y++){
for (int z=0;z<10;z++){
matthr[x+5][y]=matthr[x+5][y]+matone[x+5][z]*mattwo[z][y];
}
}
};
String result="";
setText("sendonewaymsg begin");
//客户端上从5开始
for (int x=5;x<10;x++){
for (int y=0;y<10;y++){
result=result+"A["+x+"]["+y+"]="+matthr[x][y]+" ";
}
};
//将结果返回到主机
try{
Message msg=new Message("Finish");
msg.setArg("answer",result);
System.out.println(msg.getArg("answer"));
this.proxy.sendOnewayMessage(msg);
}catch(Exception e){setText("wrong!2");};
}
}
3.3 代码分析
在实现中,我们采用了主从(master-slave)模式,这是aglet支持的众多模式中的一种,它充许主aglet把任务派发(dispatch)给从aglet,从aglet携带代码与状态移动到指定的目的主机上,与当地数据资源结合进行计算后,再将计算后的结果返回给主aglet
。
1.首先,通知主Agent向某个从Agent发送调用命令。
//主Agent的代理
AgletProxy p = aglet.getProxy();
//向主Agent发送消息,
p.sendOnewayMessage(
new Message("AgletClient1", “atp://localhost:82”));
Aglet与Aglet之间的通信,是使用消息传递的方式来传递消息对象的。此外,基于安全上的考虑,Aglet并非让外界直接存取其信息,而是透过一个代理(proxy)提供相应的接口与外界沟通。这样做有一个好处,即Aglet的所在位置会透明化,也就是说Aglet想要与远端的Aglet沟通时,只在本地主机的上下文环境中产生对应远端Aglet的代理,并直接与代理沟通即可,不必直接处理网络连接与通信的问题。
2.进入消息循环。
public boolean handleMessage(Message msg)
{
if (msg.sameKind("Finish"))
{
processRosponseResult(msg);
}
else if (msg.sameKind("AgletClient1"))
{
processAgletClient1(msg);
}
else
{
return false;
};
return true;
}
无论是主Agent还是从Agent都要继承自Agent类,并且要覆盖超类Agent类的消息循环处理函数handleMessage(),比如说现在收到的消息为AgletClient1,那么将要执行processAgletClient1(msg)方法。
3.在消息处理函数中,首先从环境(Context)中取得从Agent在本地的代理,然后将从Agent派发到目的主机上。
图3.1 消息处理方法
4.从Agent与当地主机上的数据资源结合经过计算,并通过消息返回计算结果。
图3.2 从Agent代码片断
3.4 运行程序
1) 从网上下载Aglet框架。我下载的是:aglets-2.0.2.jar
2)解压: jar xvf aglets-2.0.2.jar (
注意:不能安装在中文目录下
)
3) 执行ANT命令:
4)设置Java policy:
5)设置环境变量:
AGLETS_HOME= E:/java/aglets2.02
AGLETS_PATH=%AGLETS_HOME%
PATH=%PATH%;%AGLETS_HOME%/bin
6) 将编译后的代码放到 %AGLETS_HOME%/public 目录下去,如下图:
7)启动Aglet (默认用户名是anonymous, 默认密码是:aglets)
启动后的Agent平台如下图所示:
8)创建主Agent (也就是Matrix类),点击“Create”按钮后如下图:
在上图中的Aglet name处输入Matrix类的全路径名(包名加类名),然后点击Create按钮,如下图:
9)将从Aglet发送到Slave机器上去执行运行,并回收结果。
在Adress处输入从Aglet的地址:atp://localhost:4434
(
注意:因为我的是本机,所以写的是
localhost,
确保从
Agent
机器上开启
Aglet
服务
)
运行后的结果如下图所示:
10) OK
4 移动Agent技术在JEE集群统一管理中的应用设想
移动Agent的代码是可以在各个域机器上移动,并结合本地机器资源进行计算的。
1)采用移动Agent的master-slave结构可以实现集群的集中式管理。比如说,在集群主结点机器上部署一个应用之后(相当于Aglet中的主Agent), 完全可以由从Agent将应用转换成字节流之后再移动到集群各从节点机器中自动部署,这样,这可以让用户部署集群应用时只部署在一台机器上就行了,提高了用户体验。
2)如果集群主结点想要了解各从结点的各类信息(如应用本身的状态信息、JVM的堆信息、甚至操作系统的内存CPU利用率等信息)都可以通过发送从Agent到从结点机器上采集信息后再返回得到。
3)如果主结点想要控制从结点(如启、停等等),在定义好协议之后,都可以通过从Agent代码移动到从结点机器上执行协议规定的相关操作即可。
4)如果移动Agent与ALI命令行框架相结合,所有管理操作都将可以在命令行中完成。
分享到:
相关推荐
在移动通信领域,尤其是入门级和中低端智能手机市场,MediaTek平台的设备因性价比高、功能全面而受到广泛欢迎。随着智能手机技术的快速发展,MTK平台的多功能下载软件也日益成为用户维护和升级设备的重要工具。 MTK...
DirectShow是微软开发的一种多媒体框架,用于处理音频和视频流。它主要用于开发视频播放器、视频编辑工具等应用程序。在DirectShow中,开发者可以利用其提供的组件和接口来实现音视频数据的捕获、处理、编码和解码等...
国内最好的数据库达梦DM8,曲奇网盘下载链接:https://quqi.com/s/1243222/wcOZdaWgUlHrwhOk
基于transUnet和swinUnet的医学图像分割项目实验对比,包含完整代码,可以一键运行。评估指标包括dice、iou、recall、precision等
,stm32f030无感foc方案,资料包括原理图,pcb,源程序,观测器参数,电流环参数计算表格。
分布式电源DG选址定容优化及帕累托最优解集的粒子群算法研究,多目标粒子群算法 分布式电源 DG 定容选址 网损 成本 电压偏差 通过分布式能源的选址定容确定得到帕累托最优解集,然后选择最优值进行分析,程序采用改进粒子群算法, ,核心关键词:多目标粒子群算法; 分布式电源选址定容; 网损; 成本; 电压偏差; 帕累托最优解集。,改进粒子群算法在分布式电源选址定容中的应用:优化网损与成本,考虑电压偏差
交变磁场感应材料对沥青路面温度影响的研究,交变磁场下含感应材料沥青路面温度 ,交变磁场; 感应材料; 沥青路面; 温度; 变化; 加热效率,交变磁场对含感应材料沥青路面温度的影响研究
基于Comsol模拟的三层顶板随机裂隙浆液扩散模型:考虑重力影响的瞬态扩散规律分析,Comsol模拟,考虑三层顶板包含随机裂隙的浆液扩散模型,考虑浆液重力的影响,模型采用的DFN插件建立随机裂隙,采用达西定律模块中的储水模型为控制方程,分析不同注浆压力条件下的浆液扩散规律,建立瞬态模型 ,Comsol模拟; 随机裂隙浆液扩散模型; 浆液重力影响; DFN插件; 达西定律模块储水模型; 注浆压力条件; 浆液扩散规律; 瞬态模型,Comsol浆液扩散模型:随机裂隙下考虑重力的瞬态扩散分析
对于Sqlserver数据库只是提供了简单的图形化的导出导入工具,在实际的开发和生产环境不太可能让用户在图形化的界面选择移行的对象,进行移行。 我们在数据库的移行中也遇到这种问题,需要提供一个工具给客户使用。所以我们开发了针对SQLServer数据库的cmd形式导入导出的工具。在长期的实践中不断完善,基本可以实现Oracle的导入导出工具的80%的功能,也比较的稳定。有需要的可以下载使用,也可以提供定制化的服务
内容概要:本文介绍了DeepSeek模型在不同平台上部署的方法。首先阐述了基于Ollama的本地部署,包括Ollama的安装、模型拉取以及交互模式的使用。接着讲解了DeepSeek在移动设备(iOS和Android)上的部署细节:iPhone需要通过Safari安装快捷指令,配置API Key并通过快捷指令测试运行;Android则借助Termux安装必要组件,并手动搭建Ollama环境以加载和测试模型。最后详细叙述了基于Open WebUI部署的方式,涉及Ollama、Docker Desktop及Open WebUI的安装流程及其之间的配合使用来最终达成模型的成功部署。 适用人群:面向有兴趣了解或者实际操作DeepSeek模型跨平台部署的技术开发者、研究人员以及AI爱好者。 使用场景及目标:适用于希望利用DeepSeek模型快速构建本地化应用程序、开展实验研究的用户;具体目标为掌握DeepSeek模型在桌面系统(如Linux、macOS、Windows)、iOS和Android智能手机以及云端WebUI界面上的不同部署手段和技术。 其他说明:对于每种类型的部署都提供了详细的步骤指导,旨在帮助使用者顺利完成所需工具和环境的安装,并确保模型能够正常工作。文中给出的具体链接和命令行脚本,有助于降低初次接触者的上手难度,提升部署效率和成功率。此外,还强调了一些重要的配置注意事项,例如正确输入API key以及对Ollama的初始化检查等。
,FOC 无感 混合磁链观测器 电机控制 代码 PMSM MiniDD(直驱)电机变频无感程序,包含偏心,重量,共振等感知算法,所有算法都不基于库函数,MCU底层配置完全手写
nodejs010-nodejs-cmd-shim-1.1.0-4.1.el6.centos.alt.noarch.rpm
基于S7-200 PLC的交通灯倒计时控制及组态王界面实现原理图解析,S7-200 PLC和组态王交通灯带倒计时控制 923 47 带解释的梯形图接线图原理图图纸,io分配,组态画面 ,S7-200 PLC; 交通灯; 倒计时控制; 组态王; 梯形图接线图; IO分配; 组态画面,"S7-200 PLC与组态王交通灯倒计时控制:梯形图原理及IO分配详解"
西门子四轴卧加后处理系统:828D至840D兼容,四轴联动高效加工解决方案,支持图档处理及试看程序。,西门子四轴卧加后处理,支持828D~840D系统,支持四轴联动,可制制,看清楚联系,可提供图档处理试看程序 ,核心关键词:西门子四轴卧加后处理; 828D~840D系统支持; 四轴联动; 制程; 联系; 图档处理试看程序。,西门子四轴卧加后处理程序,支持多种系统与四轴联动
FPGA篮球赛事24秒倒计时计时器设计与实现(基于Verilog与VHDLL的优化对比),基于fpga篮球倒计时24s。 verilog和vhdl两个版本 ,基于FPGA篮球倒计时24s; Verilog版本; VHDL版本,FPGA篮球比赛倒计时24秒系统:Verilog与VHDL双版本实现
论生成式AI在大学生学习中的应用与伦理问题.pdf
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
"S7-200plc与MCGS智能居家控制系统的深度融合:组态画面、IO分配与梯形图接线图原理详解",No.63 S7-200plc和 MCGS智能居家控制系统组态 带解释的梯形图接线图原理图图纸,io分配,组态画面 ,核心关键词:S7-200plc; MCGS智能居家控制系统; 梯形图接线图原理图; io分配; 组态画面。,"S7-200 PLC与MCGS智能居家系统组态及梯形图原理图解析"
方便暖通工程师及板换用户了解艾齐尔板式换热器选型计算,免费使用。