2014-11-05 45 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