LEADTOOLSライブラリ

フレームを表示

分散コンピューティング(ジョブプロセッサー)SDKのためにワーカーアセンブリを作成するために、以下の手順をとります。ジョブプロセッサーがLEADTOOLS画像化SDKの1つを用いて任意のサポートされた形式からPDFにイメージを変換することであると仮定します。このチュートリアルはもう一つのチュートリアル(ジョブプロセッサーにジョブスを追加する)とともに使われるはずです。そして、それはジョブをジョブプロセッサーにカスタムジョブ型と加える方法を説明します。このチュートリアルは、これらのジョブを実際に処理することができるワーカーアセンブリを作成します。単純さのために、クライアントとワーカーが同じマシンにあると仮定します。

  1. Visual Studioを開始します

  2. メニューからファイル->新規作成->プロジェクトを選択します

  3. 新しいプロジェクトダイアログボックスでは、プロジェクト型の並びで「Visual C#プロジェクト」か「Visual Basicプロジェクト」を選択します、そして、テンプレートリストから「クラスライブラリ」を選択します。

  4. プロジェクト名前フィールドの「JobProcessorCreatingWorkersTutorial」としてプロジェクト名を入力します、そして、「OK」をクリックします。新しいプロジェクトの場所を入力するか、[Browse]ボタンでディレクトリを選択し[OK]をクリックします

  5. x86にプロジェクトビルド構成を変更します。この構成が存在しないならば、以下の手順を実行することによって、それを追加します:

    1. 構成マネージャーを開きます。

    2. 『プラットホーム』の下で、[New]を選択します。

    3. 『新しいプラットホーム』のために『x86』を選択して、『OK』をクリックします。

  6. 「ソリューションエクスプローラー」ウィンドウでは、「参照」フォルダを右クリックします、そして、コンテキストメニューから「参照の追加...」を選択します。「参照の追加」ダイアログボックスでは、「.NET」タブを選択して、「#LEADTOOLS_INSTALLDIR#\Bin\DotNetまたはDotNet4\Win32」フォルダに閲覧して、以下のDLLを選択します:

    • Leadtools.JobProcessor.Job
    • Leadtools.dll
    • Leadtools.Codecs.dll
    • Leadtools.Codecs.Bmp.dll
    • Leadtools.Codecs.Cmp.dll
    • Leadtools.Codecs.Tif.dll
    • Leadtools.Codecs.Fax.dll
    • Leadtools.Pdf.Dll
  7. 存在するならば、Class1 codeビュー(ソリューションエクスプローラーのダブルクリックClass1.cs)に切り替えて、任意だったImportsあとファイルの始めに行に続くことまたはusing文を追加します。

    [Visual Basic]

    
                  Imports Leadtools.JobProcessor.Job
                  Imports System.IO
                  Imports System.Xml.Serialization
                  Imports Leadtools
                  Imports Leadtools.Codecs
                  Imports System.Threading
                       
                  
    

    [C#]

    
                  using Leadtools.JobProcessor.Job;
                  using System.IO;
                  using System.Xml.Serialization;
                  using Leadtools;
                  using Leadtools.Codecs;
                  using System.Threading;
                       
                  
    
  8. 『MyCustomWorker』に主要なクラスの名前を変更します、そして、このクラスを以下に示すようにJobBaseからクラスを継承してもらいます。

    
                    Public Class MyCustomWorker : Inherits JobBase
                    End Class
                       
                  
    

    [C#]

    
                    public class MyCustomWorker : JobBase
                    {
                    }
                       
                  
    
  9. MyCustomWorkerクラスに以下のメソッド、変数と構造体を追加します。

    
                   Public Sub New(ByVal job As IJob)
                      MyBase.New(job)
                      'If using a licensed copy, add your license information below.
                      Dim MY_LICENSE_FILE As String = "d:\temp\TestLic.lic"
                      Dim MY_DEVELOPER_KEY As String = "xyz123abc"
                      RasterSupport.SetLicense(MY_LICENSE_FILE, MY_DEVELOPER_KEY);
                   End Sub
                   'This method will be used to store the conversion settings (source and target file in this simple demo).
                   'The settings were serialized when the client submitted the job. Now, the worker assembly will deserialize it to obtain the settings.
                   Public Structure JobMetadata
                      Public SourceFile As String
                      Public TargetFile As String
                   
                      Public Sub New(ByVal _sourceFile As String, ByVal _targetFile As String)
                         SourceFile = _sourceFile
                         TargetFile = _targetFile
                      End Sub
                   End Structure
                   Private jobID As String = String.Empty
                   Private loadProgress As Integer = 0
                   Private saveProgress As Integer = 0
                   
                   'Deserialize the JobMetadata
                   Public Function DeserializeFromString(ByVal serializedString As String) As JobMetadata
                      Dim serializedBytes As Byte() = Encoding.Unicode.GetBytes(serializedString)
                      Using ms As MemoryStream = New MemoryStream(serializedBytes)
                         Dim xmlSerializer As XmlSerializer = New XmlSerializer(GetType(JobMetadata))
                         Return CType(xmlSerializer.Deserialize(ms), JobMetadata)
                      End Using
                   End Function
                      
                   Public Overrides Sub OnJobReceived(ByVal id As String, ByVal userToken As String, ByVal jobMetadata As String, ByVal jobType As String, ByVal progressRate As Integer)
                      Try
                         jobID = id
                         loadProgress = 0
                         saveProgress = 0
                      
                         ' Determine whether the job information and job metadata is valid
                         If String.IsNullOrEmpty(jobMetadata) Then
                            SetFailureStatus(id, CInt(RasterExceptionCode.InvalidParameter), Leadtools.RasterException.GetCodeMessage(RasterExceptionCode.InvalidParameter), Nothing)
                            Return
                         End If
                      
                         'Deserialize the jobMetadata in order to get the conversion settings
                         Dim conversionSettings As JobMetadata = DeserializeFromString(jobMetadata)
                         Using updateStatusTimer As Timer = New Timer(New TimerCallback(AddressOf UpdateStatusProc), Nothing, 0, progressRate * 1000)
                            Using codecs As RasterCodecs = New RasterCodecs()
                               codecs.Options.Save.RetrieveDataFromImage = true           
                               AddHandler codecs.LoadImage, AddressOf Of CodecsLoadImageEventArgs
                               AddHandler codecs.SaveImage, AddressOf Of CodecsSaveImageEventArgs
                               Using img As RasterImage = codecs.Load(conversionSettings.SourceFile)
                                  codecs.Save(img, conversionSettings.TargetFile, Leadtools.RasterImageFormat.RasPdfLzw, 0)
                                  SetCompletedStatus(id, jobMetadata)
                               End Using
                            End Using
                         End Using
                      Catch ex As Exception
                         SetFailureStatus(id, 0, ex.Message, Nothing)
                      End Try
                   End Sub
                   
                   Private Sub codecs_SaveImage(ByVal sender As Object, ByVal e As CodecsSaveImageEventArgs)
                      'Update the save progress
                      saveProgress = e.TotalPercent
                   End Sub
                   
                   Private Sub codecs_LoadImage(ByVal sender As Object, ByVal e As CodecsLoadImageEventArgs)
                      'Update the load progress
                      loadProgress = e.TotalPercent
                   End Sub
                   
                   Private Sub UpdateStatusProc(ByVal stateInfo As Object)
                      Try
                         ' Always report status when the report status interval elapses: otherwise,
                         ' the windows service will assume the job has hung and kill the process.
                   
                         'The load and save progress are separate, so we must combine them as 1
                         Dim totalProgress As Integer = (loadProgress / 2) + (saveProgress / 2)
                         UpdatePercentage(jobID, totalProgress, String.Empty)
                      Catch ex As Exception
                         SetFailureStatus(jobID, 0, ex.Message, Nothing)
                      End Try
                   End Sub
                 
                               
    

    [C#]

    
                    public MyCustomWorker(IJob job)
                    : base(job)
                    {
                       //If using a licensed copy, add your license information below.
                       string MY_LICENSE_FILE = "d:\\temp\\TestLic.lic";
                       string MY_DEVELOPER_KEY = "xyz123abc";
                       RasterSupport.SetLicense(MY_LICENSE_FILE, MY_DEVELOPER_KEY);
                    }
                    
                    //This method will be used to store the conversion settings (source and target file in this simple demo).
                    //The settings were serialized when the client submitted the job. Now, the worker assembly will deserialize it to obtain the settings.
                    public struct JobMetadata
                    {
                       public string SourceFile;
                       public string TargetFile;
                       public JobMetadata(string _sourceFile, string _targetFile)
                       {
                          SourceFile = _sourceFile;
                          TargetFile = _targetFile;
                       }
                    }
                    
                    string jobID = String.Empty;
                    int loadProgress = 0;
                    int saveProgress = 0;
                    
                    //Deserialize the JobMetadata
                    public JobMetadata DeserializeFromString(string serializedString)
                    {
                       byte[] serializedBytes = Encoding.Unicode.GetBytes(serializedString);
                       using (MemoryStream ms = new MemoryStream(serializedBytes))
                       {
                          XmlSerializer xmlSerializer = new XmlSerializer(typeof(JobMetadata));
                          return (JobMetadata)xmlSerializer.Deserialize(ms);
                       }
                    }
                    
                    public override void OnJobReceived(string id, string userToken, string jobMetadata, string jobType, int progressRate)
                    {
                       try
                       {
                          jobID = id;
                          loadProgress = 0;
                          saveProgress = 0;
                          
                          // Check if we have valid job information and job metadata
                          if (String.IsNullOrEmpty(jobMetadata))
                          {
                             SetFailureStatus(id, (int)RasterExceptionCode.InvalidParameter, Leadtools.RasterException.GetCodeMessage(RasterExceptionCode.InvalidParameter), null);
                             return;
                          }
                          
                          //Deserialize the jobMetadata to get the conversion settings
                          JobMetadata conversionSettings = DeserializeFromString(jobMetadata);
                          using (Timer updateStatusTimer = new Timer(new TimerCallback(UpdateStatusProc), null, 0, progressRate * 1000))
                          {
                             using (RasterCodecs codecs = new RasterCodecs())
                             {
                                codecs.Options.Save.RetrieveDataFromImage = true;
                                codecs.LoadImage += new EventHandler<CodecsLoadImageEventArgs>(codecs_LoadImage);
                                codecs.SaveImage += new EventHandler<CodecsSaveImageEventArgs>(codecs_SaveImage);
                                using (RasterImage img = codecs.Load(conversionSettings.SourceFile))
                                {
                                   codecs.Save(img, conversionSettings.TargetFile, Leadtools.RasterImageFormat.RasPdfLzw, 0);
                                   SetCompletedStatus(id, jobMetadata);
                                }
                             }
                          }
                       }
                       catch (Exception ex)
                       {
                          SetFailureStatus(id, 0, ex.Message, null);
                       }
                    }
                    void codecs_SaveImage(object sender, CodecsSaveImageEventArgs e)
                    {
                       //Update the save progress
                       saveProgress = e.TotalPercent;
                    }
                    void codecs_LoadImage(object sender, CodecsLoadImageEventArgs e)
                    {
                       //Update the load progress
                       loadProgress = e.TotalPercent;
                    }
                    
                    private void UpdateStatusProc(Object stateInfo)
                    {
                       try
                       {
                          // Always report status when the report status interval elapses: otherwise,
                          // the windows service will assume the job has hung and kill the process.
                       
                          //The load and save progress are separate, so we must combine them as 1
                          int totalProgress = (loadProgress / 2) + (saveProgress / 2);
                          UpdatePercentage(jobID, totalProgress, String.Empty);
                       }
                       catch (Exception ex)
                       {
                          SetFailureStatus(jobID, 0, ex.Message, null);
                       }
                    }
                                
    
  10. WorkerService WCFサービスのためのWorkers.configファイルは、この種のジョブを処理するためにアップデートされる必要があります。実行します以下ファイルをアップデートする手順。

    1. WorkerService WCFサービスのApp_Dataディレクトリで、Workers.xmlを開きます。

    2. ワーカー(下記参照)であるだろうマシンの下で、新しいジョブ型を追加します。ジョブプロセッサーにジョブスを追加する際に、『ConvertToPDF』のカスタムジョブ型を使ったので、その同じジョブ型をここで使う必要があります。

      <Workers> <Worker Name="MachineName" NewJobCheckPeriod="2"> <JobTypes> <JobType Name="ConvertToPDF" MaxNumberOfJobs="5" CpuThreshold="80" UseCpuThreshold="false" ProgressRate="10" AssumeHangAfter="60" Attempts="3"/> </JobTypes> </Worker> </Workers>
  11. ここで、新しいジョブ型でワーカー(app.config)の上でウィンドウサービス構成ファイルをアップデートする必要があって、新しいアセンブリ(たとえば下記参照)に関する若干の情報を追加します。ファイルをアップデートするために、以下の手順を実行します。

    1. ワーカー(app.config)の上で、ウィンドウサービス構成ファイルを開きます。

    2. 『ConvertToPDF』に『JobType』を更新します。

    3. それがよりカスタムワーカーアセンブリの位置をポイントするように、『UserDllPath』を更新します。

    4. 仕事(JobProcessorCreatingWorkersTutorial.MyCustomWorker)をするワーカーアセンブリで、名前空間とクラスの名前に、『UserClassTypeName』を更新します。

    <userSettings> <Leadtools.JobProcessor.WorkerService.Properties.Settings> <setting name="UserClassTypeName" serializeAs="String"> <value>JobProcessorCreatingWorkersTutorial.MyCustomWorker</value> </setting> <setting name="JobType" serializeAs="String"> <value>ConvertToPDF</value> </setting> <setting name="WorkerLayerPath" serializeAs="String"> <value>Path to Leadtools.JobProcessor.Workerlayer.exe</value> </setting> <setting name="UserDllPath" serializeAs="String"> <value>Path to your worker assembly</value> </setting> </Leadtools.JobProcessor.WorkerService.Properties.Settings> </userSettings>
  12. ワーカーアセンブリは、ここでジョブを処理する準備ができています。すでにそうしなかったならば、ジョブプロセッサーにジョブスを追加する際に作成したプロジェクトを使用してジョブプロセッサーにジョブを追加します。ジョブが追加されたあと、それが処理ジョブを開始することができるように、ワーカーの上でウィンドウサービスを開始します。

    注意:「無効なファイルフォーマット」または「機能サポートされていません」例外に遭遇するならば、無効なファイル形式/サポートされない機能トピックを参照します。

参照

LEADTOOLSジョブプロセッサー設定
LEADTOOLSジョブプロセッサーデータベースを理解すること
ジョブプロセッサワーカーアセンブリの作成
LEADTOOLS分散コンピューティング(JobProcessor)アプリケーションを展開すること
特殊なLEAD機能のアンロック