有时候某个单体Agent需要周期性的执行某项动作,比如某个Agent需要定时从互联网上抓取某些公开数据以填充自身知识库,或者对本地数据库进行操作和更新。对JADE来说,用TickerBehaviour很容易实现,下面是一个周期性操作数据库的简单例子。
package jade.capScoreAdopter;
import jade.core.*;
import jade.core.behaviours.*;
import java.sql.*;
import common.DataBaseConnection;
public class IndustryScoreAdopt extends Agent {
protected void adoptScore(){
Connection conn=null;
CallableStatement proc=null;
try{
conn=DataBaseConnection.getConnection();
proc=conn.prepareCall("{call P_WriteIndustryScore}");
proc.close();
conn.close();
}
catch (SQLException e)
{
System.out.println("调用存储过程出错!");
}
}
protected void setup() {
System.out.println("Agent " + getLocalName() + " started.");
addBehaviour(new TickerBehaviour(this, 1000000) {// 1000秒执行一次
protected void onTick() {
adoptScore();
System.out.println("Agent " + myAgent.getLocalName()
+ "执行一次知识调整: tick=" + getTickCount());
}
});
}
}
附:创建数据库连接类
package common;
import java.sql.*;
public class DataBaseConnection {
public static Connection getConnection(){
Connection conn=null;
// 连接数据库,sqlserver连接串
String CLASSFORNAME="com.microsoft.jdbc.sqlserver.SQLServerDriver";
String SERVANDDB="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=enterprisediagnose";
String USER="sa";//用户和密码
String PWD="sa";
try{
Class.forName(CLASSFORNAME);
conn = java.sql.DriverManager.getConnection(SERVANDDB,USER,PWD);
}catch(Exception e){
e.printStackTrace();
System.out.println("Error Trace in getConnection() : " + e.getMessage());
}
return conn;
}
}
阅读(2989) | 评论(0) | 转发(0) |