2014-11-05 44 views
0

我创建了一个MySQL数据库,其条目类似于护士名册,现在我需要将此数据发送到我的服务器上部署的optaplanner。我需要将它发送到部署在服务器上的optaplanner文件夹中,以便将结果显示在我的网页上。如何在Optaplanner中加载xml

我正在使用Xstream生成XML文件。

任何人都可以给我简要介绍如何使这个功能工作,并得到我想要的结果。

回答

1

从XML到XML的整个数据集序列化是optaplanner-examples的一部分:OptaPlanner本身不提供或要求任何序列化格式。也就是说,optaplanner-examples包含以下序列化格式:

每个示例:XStream未解决和解决数据目录中的XML格式。格式由域类上的XStream注释(@XStreamAlias等)定义。在某些情况下,XML格式过于冗长,导致OutOfMemoryError,例如对于大型MachineReassignment B数据集。 大多数示例:数据目录导入和导出中特定于竞争的TXT格式。格式由竞赛定义(参见文档)。在示例GUI中,单击按钮导入以加载它们。

+0

荫实际上传递从我的网页连接到MySQL数据库和optaplanner部署在应用服务器上的数据。所以从我的网页中,我必须在部署的应用程序中传递我的输入文件的位置。请帮助我与你宝贵的建议 – 2014-11-05 06:16:41

+1

这个答案是从答案的直接副本在http://stackoverflow.com/questions/25636540/loading-real-world-xml-problems-in-optaplanner-6-1-0 – BradHards 2017-01-03 22:37:40

0

我建议你阅读optaplanner手动/文档中的最后一章:

Chapter 15. Integration

如果您的数据源是一个数据库,你可以注释域POJO的JPA的注解。我认为如果您仍然将数据从数据库存储到xml文件然后将xml文件提供给optaplanner将是浪费,将POJO对象直接提供给optaplanner会更明智。 我不知道你的web应用的技术,但总的算法应该是什么样的:

  1. 从数据库中获取POJO对象数据(可以使用JPA等)
  2. 构建解决方案类对象
  3. 将解决方案对象输入optaplanner求解器
  4. 从optaplanner求解器中获得最佳解决方案,并根据用户需求将其呈现给用户。

查看CloudBalancingHelloWorld.java类来获取基本想法。希望这可以帮到你。

+0

感谢您的回复,如果您能为我提供第一步和第二步的示例,我将非常感激。我只是一个初学者。 – 2014-11-06 08:56:47

+0

您现在使用的是什么网络技术?你可以发布你的简单代码来从数据库加载一些数据到你的网页吗?也许在此之后,我可以帮助您正确地安装optaplanner部件。 – 2014-11-06 09:13:39

+0

以上我已经发布代码,即时通讯使用jsp的网页和我的网页时,当管理员点击日程安排雇员按钮它必须将数据从MySQL数据库传递给optaplanner并获得结果并在网页上显示 – 2014-11-06 23:04:38

0

package com.jdbcxml; 
 

 
import java.io.FileOutputStream; 
 
import java.io.FileWriter; 
 
import java.io.PrintStream; 
 
import java.io.PrintWriter; 
 
import java.sql.Connection; 
 
import java.sql.DriverManager; 
 
import java.sql.ResultSet; 
 
import java.sql.SQLException; 
 
import java.sql.Statement; 
 

 
import org.w3c.dom.Document; 
 

 

 

 
class EmployeeDAO 
 
{ 
 
    private Connection conn = null; 
 
    
 
    static 
 
    { 
 
     try 
 
     { 
 
      Class.forName("com.mysql.jdbc.Driver"); 
 
     } 
 
     catch (Exception e) 
 
     { 
 
      e.printStackTrace(); 
 
     } 
 
    } 
 
    
 
    public EmployeeDAO() 
 
    { 
 
     String url = "jdbc:mysql://50.62.23.184:3306/gtuser"; 
 
     String userId = "gtuser1"; 
 
     String passWord = ""; 
 
     try 
 
     { 
 
      conn = DriverManager.getConnection(url, userId, passWord); 
 
     } 
 
     catch (SQLException e) 
 
     { 
 
      e.printStackTrace(); 
 
     } 
 
    } 
 
    
 
    public void finalize() 
 
    { 
 
     try 
 
     { 
 
      conn.close(); 
 
     } 
 
     catch (SQLException e) 
 
     { 
 
      e.printStackTrace(); 
 
     } 
 
    } 
 

 
    public Document getCustomerList() 
 
    { 
 
     Document doc = null; 
 

 
     try 
 
     { 
 
      Statement stmt = conn.createStatement(); 
 
      ResultSet rs = stmt.executeQuery("SELECT * from t7_users"); 
 

 
      doc = JDBCUtil.toDocument(rs); \t \t \t 
 

 
      rs.close(); 
 
      stmt.close(); 
 
     } 
 
     catch (Exception e) 
 
     { 
 
      e.printStackTrace(); 
 
     } 
 

 
     return doc; 
 
    } 
 
    
 
\t public String getCustomerListAsString() 
 
\t { 
 
\t \t String xml = null; 
 

 
\t \t try 
 
\t \t { 
 
\t \t \t Statement stmt = conn.createStatement(); 
 
\t \t \t ResultSet rs = stmt.executeQuery("SELECT * from t7_users"); 
 

 
      xml = JDBCUtil.toXML(rs); 
 

 
\t \t \t rs.close(); 
 
\t \t \t stmt.close(); 
 
\t \t } 
 
\t \t catch (Exception e) 
 
\t \t { 
 
\t \t \t e.printStackTrace(); 
 
\t \t } 
 

 
\t \t return xml; 
 
\t } 
 
\t 
 
    public static void main(String argv[]) throws Exception 
 
    { 
 
     EmployeeDAO dao = new EmployeeDAO(); 
 
     
 
\t \t String xml = dao.getCustomerListAsString(); 
 
\t \t System.out.println(xml); 
 
\t \t 
 
     Document doc = dao.getCustomerList(); 
 
     System.out.println(doc); 
 
     //PrintWriter out = new PrintWriter(new FileWriter("output.txt")); 
 
     //out.write(doc);; 
 
     //out.close(); 
 
     
 
     
 
    } 
 
}

0

这里的伪代码(我从来没有真正使用JSP,我目前使用GWT)给你基本的想法,但请记住这些注意事项:

  1. 我认为把你的POJO对象保存为xml会很浪费,然后使用XStream库将它再次提取到POJO对象。在optaplanner的例子中,他们使用它,因为它只需要一个静态数据,并为了举例。
  2. 我假设您已经创建了适合您的规划问题域的适用的域类模型。因为这是optaplanner的核心概念之一。
  3. 在generateCustomerRoster方法中,您应该使用自己的逻辑将客户POJO对象转换为计划解决方案对象。

希望这可以帮助你,并带领你完成你的工作。谢谢&关心。

package com.jdbcxml; 
 

 
import java.io.FileOutputStream; 
 
import java.io.FileWriter; 
 
import java.io.PrintStream; 
 
import java.io.PrintWriter; 
 
import java.sql.Connection; 
 
import java.sql.DriverManager; 
 
import java.sql.ResultSet; 
 
import java.sql.SQLException; 
 
import java.sql.Statement; 
 

 
import org.w3c.dom.Document; 
 

 
public class EmployeeDAO 
 
{ 
 
    private Connection conn = null; 
 
    
 
    static 
 
    { 
 
     try 
 
     { 
 
      Class.forName("com.mysql.jdbc.Driver"); 
 
     } 
 
     catch (Exception e) 
 
     { 
 
      e.printStackTrace(); 
 
     } 
 
    } 
 
    
 
    public EmployeeDAO() 
 
    { 
 
     String url = "jdbc:mysql://50.62.23.184:3306/gtuser"; 
 
     String userId = "gtuser1"; 
 
     String passWord = ""; 
 
     try 
 
     { 
 
      conn = DriverManager.getConnection(url, userId, passWord); 
 
     } 
 
     catch (SQLException e) 
 
     { 
 
      e.printStackTrace(); 
 
     } 
 
    } 
 
    
 
    public void finalize() 
 
    { 
 
     try 
 
     { 
 
      conn.close(); 
 
     } 
 
     catch (SQLException e) 
 
     { 
 
      e.printStackTrace(); 
 
     } 
 
    } 
 

 
    public List<Customer> getCustomerList() 
 
    { 
 
     Document doc = null; 
 

 
     try 
 
     { 
 
      Statement stmt = conn.createStatement(); 
 
      ResultSet rs = stmt.executeQuery("SELECT * from t7_users"); 
 

 
      doc = JDBCUtil.toDocument(rs); \t \t \t 
 

 
      rs.close(); 
 
      stmt.close(); 
 
     } 
 
     catch (Exception e) 
 
     { 
 
      e.printStackTrace(); 
 
     } 
 

 
     return doc; 
 
    } 
 

 
    public CustomerRoster generateCustomerRoster(List<Customer> rawData) { 
 
     CustomerRoster result = new CustomerRoster(); 
 
     
 
     // here you should write your logic to generate Customer Roster data from your Raw Data (Customer) 
 
     
 
     return result; 
 
    } 
 
\t 
 
    public static void main(String argv[]) throws Exception 
 
    { 
 
     // Build the Solver 
 
     SolverFactory solverFactory = SolverFactory.createFromXmlResource("yourSolverConfig.xml"); 
 
     Solver solver = solverFactory.buildSolver(); 
 

 
     // Load your problem 
 
     EmployeeDAO dao = new EmployeeDAO(); 
 
     List<Customer> listCustomer = dao.getCustomerList(); 
 
     CustomerRoster unsolvedCustomerRoster = generateCustomerRoster(listCustomer); 
 

 
     // Solve the problem 
 
     solver.solve(unsolvedCustomerRoster); 
 
     CustomerRoster solvedCustomerRoster = (CustomerRoster) solver.getBestSolution(); 
 

 
     // Display the result 
 
     DataGrid grid = new DataGrid(solvedCustomerRoster); // Just change this line code to display to any of your view component 
 
    } 
 
}

+0

非常感谢你用你的宝贵时间来帮助我......将实施它,并得到回来,如果我面临任何问题。 – 2014-11-07 03:03:45

+0

我不能传递doc变量中的数据它说“AbstractXmlSolutionImporter类型中的方法readSolution(File)不适用于参数(URL)”我需要使用Rest服务如果我需要传递数据存储在MySQL数据库....任何建议将是伟大的......花了整天努力传递数据(MySQL数据)护士在optaplanner中的例子 - 我的optaplanner-webexamples文件夹中的例子 – 2014-11-07 07:35:24

+0

我想你还是不要不知道如何正确使用optaplanner,现在让我再说一遍: 您不需要将数据传递给xml文件,optaplanner示例就是这样做的,因为它只需要一个静态数据源,即存储在xml文件中,他们使用Xstream库将xml转换为对象,反之亦然。在optaplanner的例子中,放入一个词,数据源是xml文件,而你的情况是mysql数据库。只需跳过部分xml事物,并专注于创建问题域对象并将其传递给optaplanner求解器对象。 – 2014-11-07 08:05:17