移动
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命令行框架相结合,所有管理操作都将可以在命令行中完成。
分享到:
相关推荐
在移动通信领域,MTK平台因其性价比高、功能全面而广受青睐,尤其是在入门级和中低端智能手机市场。"quqi.rar_mtk_mtk software_mtk平台"这个标题表明这是一个与MTK平台相关的软件包,可能是用于MTK手机的多功能下载...
DirectShow是微软开发的一种多媒体框架,用于处理音频和视频流。它主要用于开发视频播放器、视频编辑工具等应用程序。在DirectShow中,开发者可以利用其提供的组件和接口来实现音视频数据的捕获、处理、编码和解码等...
国内最好的数据库达梦DM8,曲奇网盘下载链接:https://quqi.com/s/1243222/wcOZdaWgUlHrwhOk
CSS样式表里重点讲述“行为”功能的一本CHM参考手册,很实用方便,内容也很丰富,收藏一下哦!
中国各地区固定资产投资中的房地产开发投资数据集涵盖了1999至2020年的详细统计信息。该数据集包含了全国各城市地级市州的房地产开发投资情况,这些数据对于理解中国城市化进程、经济发展和房地产市场趋势至关重要。数据集中的指标包括年份、地区以及对应的房地产开发投资额(以亿元为单位),这些数据来源于中国区域统计年鉴及各省市统计年鉴。通过这些数据,研究者和决策者可以深入了解不同地区的经济动态,评估房地产市场的健康状况,并据此制定相应的政策和战略。这些数据不仅有助于宏观经济分析,还能为房地产开发商提供市场进入和扩张的决策支持。
中国各地区数字经济发展对环境污染的影响数据集(2011-2021年)提供了深入分析数字经济与环境污染关系的实证数据。该数据集涵盖了中国各地区在数字经济发展水平、环境污染物排放量、人口与经济指标、外资利用情况以及绿色专利指标等多个维度的数据。具体来说,数据集包括了行政区划代码、年份、所属省份等基本信息,以及数字经济水平熵值法、PM2.5均值、工业烟粉尘排放量、工业二氧化硫排放量、工业废水排放量等关键指标。此外,数据集还涉及了人口密度、人均地区生产总值、实际利用外资额占GDP之比、科学支出占比等经济和人口统计数据,以及绿色专利申请和授权总量等创新指标。这些数据不仅有助于研究者探讨数字经济对环境污染的直接影响,还能分析其潜在的中介机制和影响因素,为理解数字经济如何影响环境质量提供了宝贵的数据资源。
中国各区县工业行业企业数数据集覆盖了2004至2020年的时间跨度,提供了全国范围内区县级工业企业数量的详细统计。这些数据不仅能够反映中国工业企业的发展趋势和分布状况,而且对于研究工业行业的区域差异、发展质量和效益具有重要意义。数据集中包含了省份、地区、时间以及工业行业企业数目等关键指标,总计超过33000条数据记录。这些数据来源于各地方统计局,并经过整理,为研究者提供了一个宝贵的资源,以支持对中国经济特别是工业行业的深入分析和研究。
BGM坏了吗111111
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
puppet-python The Puppet module is used to install and manage python, pip, virtualenvs, and Gunicorn virtual hosts. Please note that the module stankevich/python has been deprecated and is now available under Vox Pupuli: puppet/python. Usage For usage of classes, see Resources. If contributed, update to bundle exec rake strings:generate\[',,,,false,true'] hierarchical configuration. This module supports configuration through hiera. The following example creates two python3 virtual environments.
WORLDPO(沃德披欧)是在政策支持下,成功做出对标进口品质和多达15个系列型号的连接器品牌,并且在专业机构的检测下,成功通过ISO 9001认证,FCC认证,CE认证。 内容概要:本文档为WorldPO连接器产品的选型手册,详细介绍了多种型号连接器的产品规格和参数, 包括标准的引脚间距(1.27mm、0.8mm、0.5mm、0.635mm等)、具体的引脚数量(如6-500针)、各式引脚样式(如贴片式、直插式等)、电镀方式(金镀层厚度不同)、 此外,还提供了配对合高高度、接触材料、电流负载能力、额定电流、不同型号的最大插拔次数和温度范围以及操作环境条件等多种关键属性说明。文中所有技术数据均有详细的图表辅助解读,方便用户快速查找所需参数。此外,还支持非标准定制服务。 使用场景及目标:帮助用户快速查找并选择适合自己应用需求的电连接器型号。例如,针对不同的信号传输要求,如高速数据传输、电力供应或是模拟信号传输,可以选择具有相应特性的连接器。 可以通过直接联系供应商来获取进一步的支持和服务建议。 其他说明:文档末尾提供联系人邮箱和电话,方便客户进行业务洽谈和技术支持查询。
操作系统期末复习题
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
F103BL 是BOOTLOADER,需要通过仿真器进行写入; F103Usr 是一个用户程序编写实例; SW_BootLoader 是QT写的上位机,在BL的模式下通过串口和这个上位机将用户程序写入芯片; STM32的程序是利用uVision5.36编译 SW_BootLoader 是用QT5.15.2编译的
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
内容概要:本文详细介绍了数据集中最常见的几种类型,包括结构化数据集(关系型数据库数据、时间序列数据、地理空间数据)、非结构化数据集(文本数据、图像数据、音频数据、视频数据)、半结构化数据集(JSON数据、XML数据)、流式数据集(传感器数据、社交媒体数据、网络日志数据)、多维数据集(数据仓库数据、数据立方体数据)和合成数据集(模拟数据、生成数据)。每种类型都具体描述了其特点、应用场景和优势。 适合人群:数据科学家、数据分析师、机器学习工程师和其他从事数据相关工作的专业人士。 使用场景及目标:帮助读者深入了解各种数据集的特点和应用场景,提升数据处理和分析能力,更好地利用数据集解决实际问题。 其他说明:随着大数据和人工智能技术的发展,数据集的种类、规模和复杂性不断增加,了解不同类型数据集的特点和应用场景对于提高算法性能和效果至关重要。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
使用python语言和Django框架创建的博客网站系统,下载即可运行,可做毕业设计。
灰色预测模型实现。本资源是使用c++语言编程实现灰色预测模型的源代码。模型为GM(1,1)。灰色预测模型是一种用于处理不确定性和不完全信息的预测方法,它通过分析系统内部因素之间的发展趋势,对原始数据进行生成处理,以寻找系统变动的规律,并建立微分方程模型来预测事物的未来发展趋势。灰色预测的核心是使用时间响应方程:x(k+1)=(x⑴-u/a)exp()+u/a,来根据初始值x(1)来计算x(k)(k=2,3,4....N,N+1),其中α称为发展灰数;μ称为内生控制灰数。可用二乘估计来计算得到。