How do I load a xml in Optaplanner

2019-09-09 19:28发布

I have created a MySQL database with entries similar to nurse roster, Now i need to send this data to optaplanner deployed on my server. To which file do i need to send it in the optaplanner folder deployed on server to get the results displayed on my webpage.

I'm using Xstream to generate XML file.

Can any one please give me brief on how to make this functionality work and get me the desired results.

4条回答
趁早两清
2楼-- · 2019-09-09 20:10

The whole dataset serialization from and to XML is part of optaplanner-examples: OptaPlanner itself doesn't provide or require any serialization format. That being said, optaplanner-examples includes the following serialization formats:

Every example: XStream XML format in data directories unsolved and solved. The format is defined by the XStream annotations (@XStreamAlias etc) on the domain classes. In some cases the XML format is too verbose, causing OutOfMemoryError, for example for the big MachineReassignment B datasets. Most examples: Competition specific TXT format in data directories import and export. The format is defined by the competition (see docs). In the examples GUI, click on button Import to load them.

查看更多
3楼-- · 2019-09-09 20:12

Here the pseudo code (I never actually use JSP, I currently using GWT) to give you the basic idea, but please do remember these notes :

  1. I think it will be a waste to save your POJO objects to xml then use XStream library to extract it again to POJO objects. In optaplanner example, they use it because it only need a static data and for the sake of example.
  2. I assume that you already create your approriate domain class model that fit your planning problem domain. Because this is one of the core concept of optaplanner.
  3. In method generateCustomerRoster, you should put your own logic to convert your customer POJO objects to planning solution object.

Hope this can help you and lead you to finish your job. Thanks & Regards.

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);			

            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;
    }
	  
    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
    }
}

查看更多
来,给爷笑一个
4楼-- · 2019-09-09 20:15

I suggested you to read the final chapter in optaplanner manual / documentation :

Chapter 15. Integration

If your data source is a database, you can annotate your domain POJO's with JPA annotations. I think it will be a waste if you still store the data from database to xml file then feed the xml file to optaplanner, it will be more wise to feed your POJO objects to optaplanner directly. I don't know what your web application technology, but the general algorithm will be like this :

  1. Get POJO object data from your database (you can use JPA etc.)
  2. Construct the solution class object
  3. Feed the solution object to optaplanner solver
  4. Get the best solution from optaplanner solver and present it to your user in your user desire.

Take a look at CloudBalancingHelloWorld.java class to get the basic idea. Hope this can help you.

查看更多
放我归山
5楼-- · 2019-09-09 20:23

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);			

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

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

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

            xml = JDBCUtil.toXML(rs);

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

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

查看更多
登录 后发表回答