コード例 #1
0
 public PrintJobArguments(double printJobId, CreateOutputParametersCollection documentCollection, string omId, string urlMain, string fallbackUrl)
 {
     this.printJobId         = printJobId;
     this.documentCollection = documentCollection;
     this.omId        = omId;
     this.urlMain     = urlMain;
     this.fallbackUrl = fallbackUrl;
 }
コード例 #2
0
        private void SendPrintJobThread(object argumentObject)
        {
            try
            {
                PrintJobArguments argument = (PrintJobArguments)argumentObject;
                if (argument != null)
                {
                    double printJobId = argument.printJobId;
                    CreateOutputParametersCollection documentCollection = argument.documentCollection;
                    string omId        = argument.omId;
                    string urlMain     = argument.urlMain;
                    string fallbackUrl = argument.fallbackUrl;

                    SendPrintJob(printJobId, documentCollection, omId, urlMain, fallbackUrl);
                }
            }
            catch (Exception ex)
            {
                Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error executing print job thread.\r\n\r\n{0}\r\n\r\n", ex.Message));
            }
        }
コード例 #3
0
        private void SendPrintJob(double printJobId, CreateOutputParametersCollection documentCollection, string omId, string urlMain, string fallbackUrl)
        {
            string almId      = string.Empty;
            string currentUrl = string.Empty;
            string fallback   = "0";
            CreateOutputResultCollection createOutputResultCollection = null;

            OutputManagerService.OutputHandlerServiceClient client = null;

            List <string> urls = new List <string>()
            {
                urlMain
            };

            if (!string.IsNullOrEmpty(fallbackUrl))
            {
                urls.Add(fallbackUrl);
            }

            try
            {
                int iteration = 0;

                client = new OutputManagerService.OutputHandlerServiceClient(_endpointName);

                while (iteration < urls.Count)
                {
                    almId = string.Empty;

                    if (client.State != CommunicationState.Created)
                    {
                        try
                        {
                            client.Close();
                        }
                        catch
                        {
                            try { client.Abort(); }
                            catch { }
                        }

                        client = new OutputManagerService.OutputHandlerServiceClient(_endpointName);
                    }

                    try
                    {
                        if (iteration == 1)
                        {
                            fallback = "1";
                        }
                        currentUrl = urls[iteration];

                        Tracing.TraceEvent(TraceEventType.Verbose, 0, String.Format("Sending print job {0} to {1}...", printJobId, currentUrl));

                        EndpointAddress currentEndpoint = client.Endpoint.Address;

                        EndpointAddress address = new EndpointAddress(new Uri(currentUrl), currentEndpoint.Identity, currentEndpoint.Headers);

                        client.Endpoint.Address = address;

                        createOutputResultCollection = client.CreateOutput(documentCollection);

                        iteration = urls.Count;
                        Tracing.TraceEvent(TraceEventType.Verbose, 0, String.Format("Dequeuing print job {0} to {1}...", printJobId, currentUrl));
                    }
                    catch (UriFormatException ex)
                    {
                        Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Incorrect Url format: job {0} to {1}\r\n\r\n{2}\r\n\r\n", printJobId, currentUrl, ex.Message));

                        almId = "OMS002";
                        iteration++;
                    }
                    catch (ActionNotSupportedException ex)
                    {
                        Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error sending print job {0} to {1}\r\n\r\n{2}\r\n\r\n", printJobId, currentUrl, ex.Message));

                        almId = "OMS003";
                        iteration++;
                    }
                    catch (ServerTooBusyException ex)
                    {
                        Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error sending print job {0} to {1}\r\n\r\n{2}\r\n\r\n", printJobId, currentUrl, ex.Message));

                        almId = "OMS004";
                        iteration++;
                    }
                    catch (EndpointNotFoundException ex)
                    {
                        Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error sending print job {0} to {1}\r\n\r\n{2}\r\n\r\n", printJobId, currentUrl, ex.Message));

                        almId = "OMS005";
                        iteration++;
                    }
                    catch (CommunicationException ex)
                    {
                        Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error sending print job {0} to {1}\r\n\r\n{2}\r\n\r\n", printJobId, currentUrl, ex.Message));

                        almId = "OMS006";
                        iteration++;
                    }
                    catch (ArgumentException ex)
                    {
                        Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error sending print job {0} to {1}\r\n\r\n{2}\r\n\r\n", printJobId, currentUrl, ex.Message));

                        almId = "OMS007";
                        iteration++;
                    }
                    catch (TimeoutException ex)
                    {
                        Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error sending print job {0} to {1}\r\n\r\n{2}\r\n\r\n", printJobId, currentUrl, ex.Message));

                        almId     = "OMS008";
                        iteration = urls.Count; //Do not use fallback for Timeout. To avoid double print outs.
                    }
                    catch (Exception ex)
                    {
                        Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error sending print job {0} to {1}\r\n\r\n{2}\r\n\r\n", printJobId, currentUrl, ex.Message));

                        almId = "OMS009";
                        iteration++;
                    }
                }
            }
            catch (Exception ex)
            {
                Tracing.TraceEvent(TraceEventType.Error, 0, String.Format("Error sending print job {0} \r\n\r\n{1}\r\n\r\n", printJobId, ex.Message));

                almId = "OMS010";
            }
            finally
            {
                if (_jobsPerOMCounter.ContainsKey(omId))
                {
                    _jobsPerOMCounter[omId]--;
                }

                if (client.State == CommunicationState.Opened || client.State == CommunicationState.Opening)
                {
                    try
                    {
                        client.Close();
                    }
                    catch
                    {
                        try { client.Abort(); }
                        catch { }
                    }
                }

                lock (_printQueue)
                {
                    UpdateDb(omId, printJobId, almId, fallback, createOutputResultCollection);
                }

                _totalNumOfConcurrentJobs--;
            }
        }
コード例 #4
0
        public CreateOutputResultCollection Execute(CreateOutputParametersCollection parameters)
        {
            List <OutputDocument> documentsToExecute   = new List <OutputDocument>();
            List <OutputDocument> documentsNotExecuted = new List <OutputDocument>();

            foreach (CreateOutputParameters parameter in parameters)
            {
                OutputDocument newDoc = new OutputDocument();

                newDoc.OutputJobId       = parameter.OutputJobIdentity;
                newDoc.OutputJobSequence = parameter.OutputJobSequenceNumber;

                XmlDocument doc = new XmlDocument();
                doc.LoadXml(parameter.OutputXML);

                newDoc.MetaParameters = new Dictionary <string, string>();
                newDoc.Parameters     = new Dictionary <string, string>();

                newDoc.Data = new MemoryStream();
                StreamWriter writer = new StreamWriter(newDoc.Data);
                writer.Write(parameter.OutputXML);
                writer.Flush();

                for (int i = 0; i < doc.ChildNodes.Count; i++)
                {
                    if (doc.ChildNodes[i].NodeType == XmlNodeType.Element)
                    {
                        newDoc.MetaParameters.Add(StdMetaParamNames.DocumentIDKey, doc.ChildNodes[i].Name);

                        foreach (XmlNode node in doc.ChildNodes[i].ChildNodes)
                        {
                            switch (node.Name)
                            {
                            case "MetaData":
                                foreach (XmlAttribute attribute in node.Attributes)
                                {
                                    newDoc.MetaParameters.Add(attribute.Name.ToUpper(), attribute.Value.Trim());
                                }
                                break;

                            case "Data":
                                break;

                            case "Parameters":
                                foreach (XmlNode paramNode in node.ChildNodes)
                                {
                                    if (paramNode.Name == "Parameter")
                                    {
                                        newDoc.Parameters.Add(paramNode.Attributes["name"].Value, paramNode.Attributes["value"].Value);
                                    }
                                }
                                break;
                            }
                        }
                    }
                }

                //Get configuration
                string configErrorText;

                if (newDoc.MetaParameters.ContainsKey(StdMetaParamNames.DocumentTypeIDKey) && newDoc.MetaParameters.ContainsKey(StdMetaParamNames.SubDocumentTypeIDKey) && newDoc.MetaParameters.ContainsKey(StdMetaParamNames.TerminalIDKey) && newDoc.MetaParameters.ContainsKey(StdMetaParamNames.PrinterIDKey))
                {
                    string        reportID;
                    byte[]        reportFile;
                    string        printerDeviceName;
                    string        printerID;
                    List <string> adapterIDs;

                    adapterIDs = _configDataHandler.GetAdapterID_PrinterDeviceName_PrinterID_ReportID_ReportFile(newDoc.MetaParameters[StdMetaParamNames.TerminalIDKey]
                                                                                                                 , newDoc.MetaParameters[StdMetaParamNames.DocumentTypeIDKey]
                                                                                                                 , newDoc.MetaParameters[StdMetaParamNames.SubDocumentTypeIDKey]
                                                                                                                 , newDoc.MetaParameters[StdMetaParamNames.PrinterIDKey]
                                                                                                                 , out printerID, out printerDeviceName, out reportID, out reportFile, out configErrorText);

                    newDoc.AdapterIDs        = adapterIDs;
                    newDoc.PrinterID         = printerID;
                    newDoc.PrinterDeviceName = printerDeviceName;
                    newDoc.ReportID          = reportID;
                    newDoc.ReportFile        = reportFile;
                }
                else
                {
                    configErrorText = "\r\n\r\nDocument Type, Sub Document Type, TerminalID or PrinterID are missing from the document meta data.";
                }

                if (string.IsNullOrEmpty(configErrorText))
                {
                    string nonExistingAdapters = string.Empty;
                    bool   allAdaptersExists   = true;
                    foreach (string adapterId in newDoc.AdapterIDs)
                    {
                        if (!_adapters.ContainsKey(adapterId))
                        {
                            allAdaptersExists    = false;
                            nonExistingAdapters += " [" + adapterId + "] ";
                        }
                    }

                    if (allAdaptersExists)
                    {
                        documentsToExecute.Add(newDoc);
                    }
                    else
                    {
                        newDoc.ErrorDescription = "Adapter(s):" + nonExistingAdapters + "do not exsist.";
                        documentsNotExecuted.Add(newDoc);
                    }
                }
                else
                {
                    newDoc.ErrorDescription += configErrorText;
                    documentsNotExecuted.Add(newDoc);
                }
            }

            Dictionary <string, int> numOfDocsPerPrinter = new Dictionary <string, int>();
            List <string>            usedAdapters        = new List <string>();

            foreach (OutputDocument doc in documentsToExecute)
            {
                //Collect the printers used.
                if (numOfDocsPerPrinter.ContainsKey(doc.PrinterDeviceName))
                {
                    numOfDocsPerPrinter[doc.PrinterDeviceName]++;
                }
                else
                {
                    numOfDocsPerPrinter.Add(doc.PrinterDeviceName, 1);
                }

                //Get all adapters used in job
                foreach (string adapterId in doc.AdapterIDs)
                {
                    if (!usedAdapters.Contains(adapterId))
                    {
                        usedAdapters.Add(adapterId);
                    }
                }
            }


            //Set sufficient adapter locks
            foreach (string adapterId in usedAdapters)
            {
                AcquireLock(adapterId, false, _adapterLockDictionary);
            }

            try
            {
                //Set sufficient printer locks
                foreach (string printerDeviceName in numOfDocsPerPrinter.Keys)
                {
                    bool exclusive = (numOfDocsPerPrinter[printerDeviceName] > 1);
                    AcquireLock(printerDeviceName, exclusive, _printerLockDictionary);
                }

                try
                {
                    CreateOutputResultCollection resultCollection = new CreateOutputResultCollection();

                    //Process each document
                    foreach (OutputDocument doc in documentsToExecute)
                    {
                        Dictionary <string, object> results = new Dictionary <string, object>();
                        try
                        {
                            //Adding overall results
                            results.Add(StdResultParamNames.PrinterDeviceNameKey, doc.PrinterDeviceName);
                            results.Add(StdResultParamNames.ReportIDKey, doc.ReportID);
                            results.Add(StdResultParamNames.PrinterIDKey, doc.PrinterID);
                            if (doc.MetaParameters.ContainsKey(StdMetaParamNames.UserIdentityKey))
                            {
                                results.Add(StdResultParamNames.UserIDKey, doc.MetaParameters[StdMetaParamNames.UserIdentityKey]);
                            }
                            results.Add(StdResultParamNames.TerminalIDKey, doc.MetaParameters[StdMetaParamNames.TerminalIDKey]);
                            if (doc.MetaParameters.ContainsKey(StdMetaParamNames.NumberOfCopiesKey))
                            {
                                results.Add(StdResultParamNames.NumberOfCopiesKey, doc.MetaParameters[StdMetaParamNames.NumberOfCopiesKey]);
                            }
                            results.Add(StdResultParamNames.SubDocumentTypeIDKey, doc.MetaParameters[StdMetaParamNames.SubDocumentTypeIDKey]);
                            results.Add(StdResultParamNames.DocumentTypeIDKey, doc.MetaParameters[StdMetaParamNames.DocumentTypeIDKey]);

                            foreach (string adapterId in doc.AdapterIDs)
                            {
                                Dictionary <string, object> adapterResults = _adapters[adapterId].Execute(doc, results);

                                if (results.Count == 0)
                                {
                                    results = adapterResults;
                                }
                                else
                                {
                                    foreach (string key in adapterResults.Keys)
                                    {
                                        if (results.ContainsKey(key))
                                        {
                                            results[key] = adapterResults[key];
                                        }
                                        else
                                        {
                                            results.Add(key, adapterResults[key]);
                                        }
                                    }
                                }
                            }

                            doc.Data.Close();
                        }
                        catch (Exception ex)
                        {
                            doc.ErrorDescription += "\r\nError while executing adapters.\r\n" + ex.Message;
                        }

                        CreateOutputResult documentResult = new CreateOutputResult();
                        documentResult.OutputJobIdentity       = doc.OutputJobId;
                        documentResult.OutputJobSequenceNumber = doc.OutputJobSequence;
                        documentResult.ErrorDescription        = doc.ErrorDescription;
                        documentResult.ResultProperties        = new List <CreateOutputResultProperty>();

                        foreach (KeyValuePair <string, object> result in results)
                        {
                            CreateOutputResultProperty resultProperty = new CreateOutputResultProperty(result.Key, result.Value);

                            documentResult.ResultProperties.Add(resultProperty);
                        }

                        resultCollection.Add(documentResult);
                    }

                    //Return error for non processed documents
                    foreach (OutputDocument doc in documentsNotExecuted)
                    {
                        CreateOutputResult documentResult = new CreateOutputResult();
                        documentResult.OutputJobIdentity       = doc.OutputJobId;
                        documentResult.OutputJobSequenceNumber = doc.OutputJobSequence;
                        documentResult.ErrorDescription        = doc.ErrorDescription;
                        documentResult.ResultProperties        = new List <CreateOutputResultProperty>();


                        //Adding overall results
                        documentResult.ResultProperties.Add(new CreateOutputResultProperty(StdResultParamNames.PrinterIDKey, doc.PrinterID));
                        documentResult.ResultProperties.Add(new CreateOutputResultProperty(StdResultParamNames.PrinterDeviceNameKey, doc.PrinterDeviceName));
                        documentResult.ResultProperties.Add(new CreateOutputResultProperty(StdResultParamNames.ReportIDKey, doc.ReportID));

                        if (doc.MetaParameters.ContainsKey(StdMetaParamNames.UserIdentityKey))
                        {
                            documentResult.ResultProperties.Add(new CreateOutputResultProperty(StdResultParamNames.UserIDKey, doc.MetaParameters[StdMetaParamNames.UserIdentityKey]));
                        }
                        if (doc.MetaParameters.ContainsKey(StdMetaParamNames.TerminalIDKey))
                        {
                            documentResult.ResultProperties.Add(new CreateOutputResultProperty(StdResultParamNames.TerminalIDKey, doc.MetaParameters[StdMetaParamNames.TerminalIDKey]));
                        }
                        if (doc.MetaParameters.ContainsKey(StdMetaParamNames.NumberOfCopiesKey))
                        {
                            documentResult.ResultProperties.Add(new CreateOutputResultProperty(StdResultParamNames.NumberOfCopiesKey, doc.MetaParameters[StdMetaParamNames.NumberOfCopiesKey]));
                        }
                        if (doc.MetaParameters.ContainsKey(StdMetaParamNames.SubDocumentTypeIDKey))
                        {
                            documentResult.ResultProperties.Add(new CreateOutputResultProperty(StdResultParamNames.SubDocumentTypeIDKey, doc.MetaParameters[StdMetaParamNames.SubDocumentTypeIDKey]));
                        }
                        if (doc.MetaParameters.ContainsKey(StdMetaParamNames.DocumentTypeIDKey))
                        {
                            documentResult.ResultProperties.Add(new CreateOutputResultProperty(StdResultParamNames.DocumentTypeIDKey, doc.MetaParameters[StdMetaParamNames.DocumentTypeIDKey]));
                        }


                        resultCollection.Add(documentResult);
                    }

                    return(resultCollection);
                }
                finally
                {
                    //Release printer locks
                    foreach (string printerDeviceName in numOfDocsPerPrinter.Keys)
                    {
                        bool exclusive = (numOfDocsPerPrinter[printerDeviceName] > 1);
                        ReleaseLock(printerDeviceName, exclusive, _printerLockDictionary);
                    }
                }
            }
            finally
            {
                foreach (string adapterId in usedAdapters)
                {
                    ReleaseLock(adapterId, false, _adapterLockDictionary);
                }
            }
        }