Come eseguire un'attività a elevato utilizzo di calcolo in Java in una macchina virtualeHow to run a compute-intensive task in Java on a virtual machine

Importante

Azure offre due diversi modelli di distribuzione per creare e usare le risorse: Gestione risorse e la distribuzione classica.Azure has two different deployment models for creating and working with resources: Resource Manager and Classic. Questo articolo illustra l'uso del modello di distribuzione classica.This article covers using the Classic deployment model. Microsoft consiglia di usare il modello di Gestione risorse per le distribuzioni più recenti.Microsoft recommends that most new deployments use the Resource Manager model.

A partire dal 15 novembre 2017, le macchine virtuali saranno disponibili solo nel portale di Azure.Starting November 15, 2017, Virtual Machines will be available only in the Azure portal. L'accesso dal portale classico non sarà più supportato.Access from the classic portal will no longer be supported.

Con Azure è possibile usare una macchina virtuale per gestire attività a elevato utilizzo di calcolo.With Azure, you can use a virtual machine to handle compute-intensive tasks. Ad esempio, una macchina virtuale può gestire attività e fornire risultati a computer client o ad applicazioni mobili.For example, a virtual machine can handle tasks and deliver results to client machines or mobile applications. Dopo aver letto questo articolo, si avranno a disposizione tutte le informazioni necessarie per creare una macchina virtuale nella quale è in esecuzione un'applicazione Java a elevato utilizzo di calcolo che può essere monitorata da un'altra applicazione Java.After reading this article, you will have an understanding of how to create a virtual machine that runs a compute-intensive Java application that can be monitored by another Java application.

Questa esercitazione presuppone che l'utente sappia creare applicazioni della console Java, importare librerie nell'applicazione Java e generare un archivio Java (JAR).This tutorial assumes you know how to create Java console applications, can import libraries to your Java application, and can generate a Java archive (JAR). Non è richiesta alcuna conoscenza di Microsoft Azure.No knowledge of Microsoft Azure is assumed.

Si acquisiranno le nozioni seguenti:You will learn:

  • Come creare una macchina virtuale con un Java Development Kit (JDK) già installato.How to create a virtual machine with a Java Development Kit (JDK) already installed.
  • Accedere in remoto alla macchina virtuale.How to remotely log in to your virtual machine.
  • Creare uno spazio dei nomi del bus di servizio.How to create a service bus namespace.
  • Creare un'applicazione Java che esegua un'attività a elevato utilizzo di calcolo.How to create a Java application that performs a compute-intensive task.
  • Creare un'applicazione Java che esegua un'attività che monitori l'avanzamento dell'attività a elevato utilizzo di calcolo.How to create a Java application that monitors the progress of the compute-intensive task.
  • Eseguire le applicazioni Java.How to run the Java applications.
  • Arrestare le applicazioni Java.How to stop the Java applications.

In questa esercitazione verrà utilizzato il Problema del commesso viaggiatore per l'attività a elevato utilizzo di calcolo.This tutorial will use the Traveling Salesman Problem for the compute-intensive task. Di seguito è riportato un esempio dell'applicazione Java che esegue l'attività a elevato utilizzo di calcolo.The following is an example of the Java application running the compute-intensive task.

Risolutore del Problema del commesso viaggiatore

Di seguito è riportato un esempio dell'applicazione Java che monitora l'attività a elevato utilizzo di calcolo.The following is an example of the Java application monitoring the compute-intensive task.

Client del Problema del commesso viaggiatore

Nota

Per completare l'esercitazione, è necessario un account Azure.To complete this tutorial, you need an Azure account. È possibile attivare i vantaggi della sottoscrizione MSDN oppure iscriversi per ottenere una versione di valutazione gratuita in Azure.You can activate your MSDN subscriber benefits or sign up for a free trial in Azure.

Per creare una macchina virtualeTo create a virtual machine

  1. Accedere al portale di Azure classico.Log in to the Azure classic portal.
  2. Fare clic su Nuovo, Calcolo, Macchina virtuale e quindi su Da raccolta.Click New, click Compute, click Virtual machine, and then click From Gallery.
  3. Nella finestra di dialogo Virtual machine image select (Seleziona immagine macchina virtuale) selezionare JDK 7 Windows Server 2012 (JDK 7 Windows Server 2012).In the Virtual machine image select dialog box, select JDK 7 Windows Server 2012. Si noti che è disponibile anche JDK 6 Windows Server 2012 nel caso in cui siano presenti applicazioni non ancora predisposte per l'esecuzione in JDK 7.Note that JDK 6 Windows Server 2012 is available in case you have legacy applications that are not yet ready to run in JDK 7.
  4. Fare clic su Avanti.Click Next.
  5. Nella finestra di dialogo Configurazione macchina virtuale :In the Virtual machine configuration dialog box:
    1. Specificare un nome per la macchina virtuale.Specify a name for the virtual machine.
    2. Specificare la dimensione da utilizzare per la macchina virtuale.Specify the size to use for the virtual machine.
    3. Immettere un nome per l'amministratore nel campo User Name .Enter a name for the administrator in the User Name field. Prendere nota di questo nome e della password che verrà immessa successivamente perché verranno utilizzati per l'accesso in remoto alla macchina virtuale.Remember this name and the password you will enter next, you will use them when you remotely log in to the virtual machine.
    4. Immettere una password nel campo Nuova password e reimmetterla nel campo Conferma.Enter a password in the New password field, and re-enter it in the Confirm field. Si tratta della password dell'account dell'amministratore.This is the Administrator account password.
    5. Fare clic su Avanti.Click Next.
  6. Nella finestra di dialogo Configurazione macchina virtuale successiva:In the next Virtual machine configuration dialog box:
    1. Per Servizio cloud usare l'impostazione predefinita di Crea un nuovo servizio cloud.For Cloud service, use the default Create a new cloud service.
    2. Il valore di Nome DNS del servizio cloud deve essere univoco in cloudapp.net.The value for Cloud service DNS name must be unique across cloudapp.net. Se necessario, modificarlo in modo che sia indicato come univoco in Azure.If needed, modify this value so that Azure indicates it is unique.
    3. Specificare un'area, un gruppo di affinità o una rete virtuale.Specify a region, affinity group, or virtual network. Ai fini di questa esercitazione, specificare come area West US.For purposes of this tutorial, specify a region such as West US.
    4. Nella casella Account di archiviazione selezionare Usa un account di archiviazione generato automaticamente .For Storage Account, select Use an automatically generated storage account.
    5. Nella casella Set di disponibilità selezionare (Nessuno).For Availability Set, select (None).
    6. Fare clic su Avanti.Click Next.
  7. Nella finestra di dialogo Configurazione macchina virtuale finale:In the final Virtual machine configuration dialog box:
    1. Accettare le voci di endpoint predefinite.Accept the default endpoint entries.
    2. Fare clic su Complete.Click Complete.

Per accedere in remoto alla macchina virtualeTo remotely log in to your virtual machine

  1. Accedere al portale di Azure classico.Log on to the Azure classic portal.
  2. Fare clic su Virtual machines.Click Virtual machines.
  3. Fare clic sul nome della macchina virtuale a cui si desidera accedere.Click the name of the virtual machine that you want to log in to.
  4. Fare clic su Connect.Click Connect.
  5. Rispondere ai prompt visualizzati per connettersi alla macchina virtuale.Respond to the prompts as needed to connect to the virtual machine. Quando vengono richiesti il nome e la password dell'amministratore, usare i valori specificati durante la creazione della macchina virtuale.When prompted for the administrator name and password, use the values that you provided when you created the virtual machine.

Si noti che la funzionalità di bus di servizio di Azure richiede l'installazione del certificato Baltimore CyberTrust Root come parte del proprio archivio cacerts dell'ambiente JRE.Note that the Azure Service Bus functionality requires the Baltimore CyberTrust Root certificate to be installed as part of your JRE's cacerts store. Questo certificato è incluso automaticamente nell'ambiente Java Runtime Environment (JRE) usato in questa esercitazione.This certificate is automatically included in the Java Runtime Environment (JRE) used by this tutorial. Se questo certificato non è disponibile nell'archivio cacerts dell'ambiente JRE, vedere Aggiunta di un certificato all'archivio certificati CA Java per altre informazioni su come aggiungerlo e informazioni sulla visualizzazione dei certificati nell'archivio cacerts.If you do not have this certificate in your JRE cacerts store, see Adding a Certificate to the Java CA Certificate Store for information on adding it (as well as information on viewing the certificates in your cacerts store).

Come creare uno spazio dei nomi del bus di servizioHow to create a service bus namespace

Per iniziare a utilizzare le code del bus di servizio in Azure, è innanzitutto necessario creare uno spazio dei nomi servizioTo begin using Service Bus queues in Azure, you must first create a service namespace. che fornisce un contenitore di ambito per fare riferimento alle risorse del bus di servizio all'interno dell'applicazione.A service namespace provides a scoping container for addressing Service Bus resources within your application.

Per creare uno spazio dei nomi del servizio:To create a service namespace:

  1. Accedere al portale di Azure classico.Log on to the Azure classic portal.
  2. Nel riquadro di spostamento in basso a sinistra nel portale di Azure classico fare clic su Bus di servizio, controllo di accesso e caching.In the lower-left navigation pane of the Azure classic portal, click Service Bus, Access Control & Caching.
  3. Nel riquadro in alto a sinistra nel portale di Azure classico fare clic sul nodo Bus di servizio e quindi sul pulsante Nuovo.In the upper-left pane of the Azure classic portal, click the Service Bus node, and then click the New button.
    Schermata nodo bus di servizioService Bus Node screenshot
  4. Nella finestra di dialogo Crea un nuovo spazio dei nomi servizio immettere uno spazio dei nomi servizio in Spazio dei nomi e quindi, per assicurarsi che sia univoco, fare clic sul pulsante Verifica disponibilità.In the Create a new Service Namespace dialog box, enter a Namespace, and then to make sure that it is unique, click the Check Availability button.
    Schermata Create a New NamespaceCreate a New Namespace screenshot
  5. Dopo avere verificato che lo spazio dei nomi è disponibile, scegliere il paese o l'area in cui dovrà essere ospitato e fare clic sul pulsante Create Namespace .After making sure the namespace name is available, choose the country or region in which your namespace should be hosted, and then click the Create Namespace button.

    Lo spazio dei nomi creato verrà quindi visualizzato nel portale di Azure classico e sarà necessario attendere qualche istante affinché venga attivato.The namespace you created will then appear in the Azure classic portal and takes a moment to activate. Prima di continuare, attendere che lo stato sia Active .Wait until the status is Active before continuing with the next step.

Recuperare le credenziali di gestione predefinite per lo spazio dei nomiObtain the Default Management Credentials for the namespace

Per poter eseguire le operazioni di gestione, ad esempio creare una coda, nel nuovo spazio dei nomi, è necessario ottenere le credenziali di gestione per lo spazio dei nomi.In order to perform management operations, such as creating a queue, on the new namespace, you need to obtain the management credentials for the namespace.

  1. Nel riquadro di spostamento a sinistra fare clic sul nodo Bus di servizio per visualizzare l'elenco degli spazi dei nomi disponibili.In the left navigation pane, click the Service Bus node to display the list of available namespaces. Schermata relativa agli spazi dei nomi disponibiliAvailable Namespaces screenshot
  2. Selezionare lo spazio dei nomi appena creato nell'elenco visualizzato.Select the namespace you just created from the list shown. Schermata relativa all'elenco degli spazi dei nomiNamespace List screenshot
  3. Il riquadro Proprietà a destra elenca le proprietà relative al nuovo spazio dei nomi.The right-hand Properties pane lists the properties for the new namespace. Schermata pannello ProprietàProperties Pane screenshot
  4. Le credenziali di sicurezza in Chiave predefinita sono nascoste.The Default Key is hidden. Fare clic sul pulsante Visualizza per visualizzare le credenziali di sicurezza.Click the View button to display the security credentials. Schermata Default KeyDefault Key screenshot
  5. Prendere nota dei valori indicati in Default Issuer e Default Key, in quanto dovranno essere usati per eseguire operazioni con lo spazio dei nomi.Make a note of the Default Issuer and the Default Key as you will use this information below to perform operations with the namespace.

Come creare un'applicazione Java che esegue un'attività a elevato utilizzo di calcoloHow to create a Java application that performs a compute-intensive task

  1. Nel computer di sviluppo (che non deve essere la macchina virtuale creata dall'utente) scaricare Azure SDK for Java.On your development machine (which does not have to be the virtual machine that you created), download the Azure SDK for Java.
  2. Creare un'applicazione di console Java usando il codice di esempio fornito al termine di questa sezione.Create a Java console application using the example code at the end of this section. In questa esercitazione verrà usato TSPSolver.java come nome del file Java.In this tutorial, we'll use TSPSolver.java as the Java file name. Modificare i segnaposto your_service_bus_namespace, your_service_bus_owner e your_service_bus_key per usare rispettivamente i valori spazio dei nomi, Autorità di certificazione predefinita e Chiave predefinita del bus di servizio.Modify the your_service_bus_namespace, your_service_bus_owner, and your_service_bus_key placeholders to use your service bus namespace, Default Issuer and Default Key values, respectively.
  3. Dopo la codifica, esportare l'applicazione in un archivio Java eseguibile (JAR) e creare un pacchetto con le librerie richieste nell'archivio JAR generato.After coding, export the application to a runnable Java archive (JAR), and package the required libraries into the generated JAR. In questa esercitazione verrà usato TSPSolver.jar come nome dell'archivio JAR generato.In this tutorial, we'll use TSPSolver.jar as the generated JAR name.

// TSPSolver.java

import com.microsoft.windowsazure.services.core.Configuration;
import com.microsoft.windowsazure.services.core.ServiceException;
import com.microsoft.windowsazure.services.serviceBus.*;
import com.microsoft.windowsazure.services.serviceBus.models.*;
import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class TSPSolver {

    //  Value specifying how often to provide an update to the console.
    private static long loopCheck = 100000000;  

    private static long nTimes = 0, nLoops=0;

    private static double[][] distances;
    private static String[] cityNames;
    private static int[] bestOrder;
    private static double minDistance;
    private static ServiceBusContract service;

    private static void buildDistances(String fileLocation, int numCities) throws Exception{
        try{
            BufferedReader file = new BufferedReader(new InputStreamReader(new DataInputStream(new FileInputStream(new File(fileLocation)))));
            double[][] cityLocs = new double[numCities][2];
            for (int i = 0; i<numCities; i++){
                String[] line = file.readLine().split(", ");
                cityNames[i] = line[0];
                cityLocs[i][0] = Double.parseDouble(line[1]);
                cityLocs[i][1] = Double.parseDouble(line[2]);
            }
            for (int i = 0; i<numCities; i++){
                for (int j = i; j<numCities; j++){
                    distances[i][j] = Math.hypot(Math.abs(cityLocs[i][0] - cityLocs[j][0]), Math.abs(cityLocs[i][1] - cityLocs[j][1]));
                    distances[j][i] = distances[i][j];
                }
            }
        } catch (Exception e){
            throw e;
        }
    }

    private static void permutation(List<Integer> startCities, double distSoFar, List<Integer> restCities) throws Exception {

        try
        {
            nTimes++;
            if (nTimes == loopCheck)
            {
                nLoops++;
                nTimes = 0;
                DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
                Date date = new Date();
                System.out.print("Current time is " + dateFormat.format(date) + ". ");
                System.out.println(  "Completed " + nLoops + " iterations of size of " + loopCheck + ".");
            }

            if ((restCities.size() == 1) && ((minDistance == -1) || (distSoFar + distances[restCities.get(0)][startCities.get(0)] + distances[restCities.get(0)][startCities.get(startCities.size()-1)] < minDistance))){
                startCities.add(restCities.get(0));
                newBestDistance(startCities, distSoFar + distances[restCities.get(0)][startCities.get(0)] + distances[restCities.get(0)][startCities.get(startCities.size()-2)]);
                startCities.remove(startCities.size()-1);
            }
            else{
                for (int i=0; i<restCities.size(); i++){
                    startCities.add(restCities.get(0));
                    restCities.remove(0);
                    permutation(startCities, distSoFar + distances[startCities.get(startCities.size()-1)][startCities.get(startCities.size()-2)],restCities);
                    restCities.add(startCities.get(startCities.size()-1));
                    startCities.remove(startCities.size()-1);
                }
            }
        }
        catch (Exception e)
        {
            throw e;
        }
    }

    private static void newBestDistance(List<Integer> cities, double distance) throws ServiceException, Exception {
        try
        {
            minDistance = distance;
            String cityList = "Shortest distance is "+minDistance+", with route: ";
            for (int i = 0; i<bestOrder.length; i++){
                bestOrder[i] = cities.get(i);
                cityList += cityNames[bestOrder[i]];
                if (i != bestOrder.length -1)
                    cityList += ", ";
            }
            System.out.println(cityList);
            service.sendQueueMessage("TSPQueue", new BrokeredMessage(cityList));
        }
        catch (ServiceException se)
        {
            throw se;
        }
        catch (Exception e)
        {
            throw e;
        }
    }

    public static void main(String args[]){

        try {

            Configuration config = ServiceBusConfiguration.configureWithWrapAuthentication(
                    "your_service_bus_namespace", "your_service_bus_owner",
                    "your_service_bus_key",
                    ".servicebus.windows.net",
                    "-sb.accesscontrol.windows.net/WRAPv0.9");

            service = ServiceBusService.create(config);

            int numCities = 10;  // Use as the default, if no value is specified at command line.
            if (args.length != 0)
            {
                if (args[0].toLowerCase().compareTo("createqueue")==0)
                {
                    // No processing to occur other than creating the queue.
                    QueueInfo queueInfo = new QueueInfo("TSPQueue");

                    service.createQueue(queueInfo);

                    System.out.println("Queue named TSPQueue was created.");

                    System.exit(0);
                }

                if (args[0].toLowerCase().compareTo("deletequeue")==0)
                {
                    // No processing to occur other than deleting the queue.
                    service.deleteQueue("TSPQueue");

                    System.out.println("Queue named TSPQueue was deleted.");

                    System.exit(0);
                }

                // Neither creating or deleting a queue.
                // Assume the value passed in is the number of cities to solve.
                numCities = Integer.valueOf(args[0]);  
            }

            System.out.println("Running for " + numCities + " cities.");

            List<Integer> startCities = new ArrayList<Integer>();
            List<Integer> restCities = new ArrayList<Integer>();
            startCities.add(0);
            for(int i = 1; i<numCities; i++)
                restCities.add(i);
            distances = new double[numCities][numCities];
            cityNames = new String[numCities];
            buildDistances("c:\\TSP\\cities.txt", numCities);
            minDistance = -1;
            bestOrder = new int[numCities];
            permutation(startCities, 0, restCities);
            System.out.println("Final solution found!");
            service.sendQueueMessage("TSPQueue", new BrokeredMessage("Complete"));
        }
        catch (ServiceException se)
        {
            System.out.println(se.getMessage());
            se.printStackTrace();
            System.exit(-1);
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
            e.printStackTrace();
            System.exit(-1);
        }
    }

}

Come creare un'applicazione Java per monitorare lo stato dell'attività a elevato utilizzo di calcoloHow to create a Java application that monitors the progress of the compute-intensive task

  1. Nel computer di sviluppo creare un'applicazione console Java usando il codice di esempio fornito al termine di questa sezione.On your development machine, create a Java console application using the example code at the end of this section. In questa esercitazione verrà usato TSPClient.java come nome del file Java.In this tutorial, we'll use TSPClient.java as the Java file name. Come mostrato in precedenza, modificare i segnaposto your_service_bus_namespace, your_service_bus_owner e your_service_bus_key per usare rispettivamente i valori spazio dei nomi, Autorità di certificazione predefinita e Chiave predefinita del bus di servizio.As shown earlier, modify the your_service_bus_namespace, your_service_bus_owner, and your_service_bus_key placeholders to use your service bus namespace, Default Issuer and Default Key values, respectively.
  2. Esportare l'applicazione in un archivio Java eseguibile (JAR) e creare un pacchetto con le librerie richieste nell'archivio JAR generato.Export the application to a runnable JAR, and package the required libraries into the generated JAR. In questa esercitazione verrà usato TSPClient.jar come nome dell'archivio JAR generato.In this tutorial, we'll use TSPClient.jar as the generated JAR name.

// TSPClient.java

import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import com.microsoft.windowsazure.services.serviceBus.*;
import com.microsoft.windowsazure.services.serviceBus.models.*;
import com.microsoft.windowsazure.services.core.*;

public class TSPClient
{

    public static void main(String[] args)
    {
            try
            {

                DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
                Date date = new Date();
                System.out.println("Starting at " + dateFormat.format(date) + ".");

                String namespace = "your_service_bus_namespace";
                String issuer = "your_service_bus_owner";
                String key = "your_service_bus_key";

                Configuration config;
                config = ServiceBusConfiguration.configureWithWrapAuthentication(
                        namespace, issuer, key,
                        ".servicebus.windows.net",
                        "-sb.accesscontrol.windows.net/WRAPv0.9");

                ServiceBusContract service = ServiceBusService.create(config);

                BrokeredMessage message;

                int waitMinutes = 3;  // Use as the default, if no value is specified at command line.
                if (args.length != 0)
                {
                    waitMinutes = Integer.valueOf(args[0]);  
                }

                String waitString;

                waitString = (waitMinutes == 1) ? "minute." : waitMinutes + " minutes.";

                // This queue must have previously been created.
                service.getQueue("TSPQueue");

                int numRead;

                String s = null;

                while (true)
                {

                    ReceiveQueueMessageResult resultQM = service.receiveQueueMessage("TSPQueue");
                    message = resultQM.getValue();

                    if (null != message && null != message.getMessageId())
                    {

                        // Display the queue message.
                        byte[] b = new byte[200];

                        System.out.print("From queue: ");

                        s = null;
                        numRead = message.getBody().read(b);
                        while (-1 != numRead)
                        {
                            s = new String(b);
                            s = s.trim();
                            System.out.print(s);
                            numRead = message.getBody().read(b);
                        }
                        System.out.println();
                        if (s.compareTo("Complete") == 0)
                        {
                            // No more processing to occur.
                            date = new Date();
                            System.out.println("Finished at " + dateFormat.format(date) + ".");
                            break;
                        }
                    }
                    else
                    {
                        // The queue is empty.
                        System.out.println("Queue is empty. Sleeping for another " + waitString);
                        Thread.sleep(60000 * waitMinutes);
                    }
                }

        }
        catch (ServiceException se)
        {
            System.out.println(se.getMessage());
            se.printStackTrace();
            System.exit(-1);
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
            e.printStackTrace();
            System.exit(-1);
        }

    }

}

Come eseguire le applicazioni JavaHow to run the Java applications

Eseguire l'applicazione a elevato utilizzo di calcolo innanzitutto per creare la coda, quindi per risolvere il Problema del commesso viaggiatore, che consentirà di aggiungere l'attuale route migliore alla coda del bus di servizio.Run the compute-intensive application, first to create the queue, then to solve the Traveling Saleseman Problem, which will add the current best route to the service bus queue. Mentre l'applicazione a elevato utilizzo di calcolo è in esecuzione (oppure in seguito), eseguire il client in modo da visualizzare i risultati ottenuti dalla coda del bus di servizio.While the compute-intensive application is running (or afterwards), run the client to display results from the service bus queue.

Per eseguire l'applicazione a elevato utilizzo di calcoloTo run the compute-intensive application

  1. Accedere alla macchina virtuale.Log on to your virtual machine.
  2. Creare una cartella in cui eseguire l'applicazione,Create a folder where you will run your application. ad esempio c:\TSP.For example, c:\TSP.
  3. Copiare TSPSolver.jar in c:\TSP,Copy TSPSolver.jar to c:\TSP,
  4. Creare un file denominato c:\TSP\cities.txt con il seguente contenuto.Create a file named c:\TSP\cities.txt with the following contents.

     City_1, 1002.81, -1841.35
     City_2, -953.55, -229.6
     City_3, -1363.11, -1027.72
     City_4, -1884.47, -1616.16
     City_5, 1603.08, -1030.03
     City_6, -1555.58, 218.58
     City_7, 578.8, -12.87
     City_8, 1350.76, 77.79
     City_9, 293.36, -1820.01
     City_10, 1883.14, 1637.28
     City_11, -1271.41, -1670.5
     City_12, 1475.99, 225.35
     City_13, 1250.78, 379.98
     City_14, 1305.77, 569.75
     City_15, 230.77, 231.58
     City_16, -822.63, -544.68
     City_17, -817.54, -81.92
     City_18, 303.99, -1823.43
     City_19, 239.95, 1007.91
     City_20, -1302.92, 150.39
     City_21, -116.11, 1933.01
     City_22, 382.64, 835.09
     City_23, -580.28, 1040.04
     City_24, 205.55, -264.23
     City_25, -238.81, -576.48
     City_26, -1722.9, -909.65
     City_27, 445.22, 1427.28
     City_28, 513.17, 1828.72
     City_29, 1750.68, -1668.1
     City_30, 1705.09, -309.35
     City_31, -167.34, 1003.76
     City_32, -1162.85, -1674.33
     City_33, 1490.32, 821.04
     City_34, 1208.32, 1523.3
     City_35, 18.04, 1857.11
     City_36, 1852.46, 1647.75
     City_37, -167.44, -336.39
     City_38, 115.4, 0.2
     City_39, -66.96, 917.73
     City_40, 915.96, 474.1
     City_41, 140.03, 725.22
     City_42, -1582.68, 1608.88
     City_43, -567.51, 1253.83
     City_44, 1956.36, 830.92
     City_45, -233.38, 909.93
     City_46, -1750.45, 1940.76
     City_47, 405.81, 421.84
     City_48, 363.68, 768.21
     City_49, -120.3, -463.13
     City_50, 588.51, 679.33
    
  5. Al prompt dei comandi passare alla directory c:\TSP.At a command prompt, change directories to c:\TSP.
  6. Assicurarsi che la cartella Bin si trovi nella variabile di ambiente PATH.Ensure the JRE's bin folder is in the PATH environment variable.
  7. Sarà necessario creare la coda del bus di servizio prima di eseguire le permutazioni del risolutore TSP.You'll need to create the service bus queue before you run the TSP solver permutations. Eseguire il comando seguente per creare la coda del bus di servizio.Run the following command to create the service bus queue.

     java -jar TSPSolver.jar createqueue
    
  8. Dopo aver creato la coda è possibile eseguire le permutazioni del risolutore TSP.Now that the queue is created, you can run the TSP solver permutations. Ad esempio, usare il comando seguente per eseguire il risolutore per 8 città.For example, run the following command to run the solver for 8 cities.

     java -jar TSPSolver.jar 8
    

    Se non si specifica un numero, il risolutore verrà eseguito per 10 città.If you don't specify a number, it will run for 10 cities. Mano a mano che rileva le route attualmente più brevi, il risolutore le aggiunge alla coda.As the solver finds current shortest routes, it will add them to the queue.

Nota

Maggiore è il numero specificato, più lunga sarà l'esecuzione del risolutore.The larger the number that you specify, the longer the solver will run. Ad esempio, l'esecuzione per 14 città potrebbe richiedere diversi minuti, mentre l'esecuzione per 15 città potrebbe richiedere parecchie ore.For example, running for 14 cities could take several minutes, and running for 15 cities could take several hours. Se si specificano 16 o più città potrebbero essere necessari diversi giorni di runtime (settimane, mesi e anni).Increasing to 16 or more cities could result in days of runtime (eventually weeks, months, and years). Ciò è dovuto al rapido aumento del numero di permutazioni valutate dal risolutore di pari passo con l'aumento del numero di città.This is due to the rapid increase in the number of permutations evaluated by the solver as the number of cities increases.

Come eseguire l'applicazione client di monitoraggioHow to run the monitoring client application

  1. Accedere al computer dal quale si intende eseguire l'applicazione client,Log on to your machine where you will run the client application. che non deve essere necessariamente lo stesso computer su cui è in esecuzione l'applicazione c:\TSP\cities.txt.This does not need to be the same machine running the TSPSolver application, although it can be.
  2. Creare una cartella in cui eseguire l'applicazione,Create a folder where you will run your application. ad esempio c:\TSP.For example, c:\TSP.
  3. Copiare TSPClient.jar in c:\TSP,Copy TSPClient.jar to c:\TSP,
  4. Assicurarsi che la cartella Bin si trovi nella variabile di ambiente PATH.Ensure the JRE's bin folder is in the PATH environment variable.
  5. Al prompt dei comandi passare alla directory c:\TSP.At a command prompt, change directories to c:\TSP.
  6. Eseguire il comando indicato di seguito.Run the following command.

     java -jar TSPClient.jar
    

    Facoltativamente, specificare il numero di minuti di sospensione della verifica della coda passando un argomento della riga di comando.Optionally, specify the number of minutes to sleep in between checking the queue, by passing in a command-line argument. Il periodo di sospensione predefinito per la verifica della coda corrisponde a 3 minuti. Questo intervallo viene usato se non si passa un argomento della riga di comando a TSPClient.The default sleep period for checking the queue is 3 minutes, which is used if no command-line argument is passed to TSPClient. Se si desidera usare un valore differente per l'intervallo di sospensione, ad esempio un minuto, eseguire il comando indicato di seguito.If you want to use a different value for the sleep interval, for example, one minute, run the following command.

     java -jar TSPClient.jar 1
    

    Il comando verrà eseguito sul client finché non si riceverà il messaggio di coda completa.The client will run until it sees a queue message of "Complete". Si noti che se si eseguono più occorrenze del risolutore senza eseguire il client, può essere necessario eseguire il client più volte per svuotare completamente la coda.Note that if you run multiple occurrences of the solver without running the client, you may need to run the client multiple times to completely empty the queue. In alternativa, è possibile eliminare la coda e crearla di nuovo.Alternatively, you can delete the queue and then create it again. Per eliminare la coda, eseguire il comando TSPSolver (non TSPClient) seguente.To delete the queue, run the following TSPSolver (not TSPClient) command.

     java -jar TSPSolver.jar deletequeue
    

    Il risolutore eseguirà il comando finché non avrà terminato di esaminare tutte le route.The solver will run until it finishes examining all routes.

Come arrestare le applicazioni JavaHow to stop the Java applications

Per uscire dalle applicazioni risolutore e client e terminare prima del normale completamento, premere i tasti Ctrl+C .For both the solver and client applications, you can press Ctrl+C to exit if you want to end prior to normal completion.