#Region "Microsoft.VisualBasic::d0f2a280299395ecc58c7ec21f9c7af9, ComputingServices\Taskhost.d\Invoke\TaskInvoke.vb"
' Author:
'
' asuka (amethyst.asuka@gcmodeller.org)
' xie (genetics@smrucc.org)
' xieguigang (xie.guigang@live.com)
'
' Copyright (c) 2018 GPL3 Licensed
'
'
' GNU GENERAL PUBLIC LICENSE (GPL3)
'
'
' This program is free software: you can redistribute it and/or modify
' it under the terms of the GNU General Public License as published by
' the Free Software Foundation, either version 3 of the License, or
' (at your option) any later version.
'
' This program is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
' GNU General Public License for more details.
'
' You should have received a copy of the GNU General Public License
' along with this program. If not, see .
' /********************************************************************************/
' Summaries:
' Class TaskInvoke
'
' Properties: FileSystem, LinqProvider, Portal
'
' Constructor: (+1 Overloads) Sub New
'
' Function: __invoke, Free, GetNodeLoad, Handshake, (+2 Overloads) Invoke
' InvokeLinq, LinqSelect, Run, TryInvoke
'
' Sub: (+2 Overloads) Dispose
'
'
' /********************************************************************************/
#End Region
Imports System.Reflection
Imports Microsoft.VisualBasic.Linq
Imports Microsoft.VisualBasic.Net
Imports Microsoft.VisualBasic.Net.Http
Imports Microsoft.VisualBasic.Net.Protocols
Imports Microsoft.VisualBasic.Net.Protocols.Reflection
Imports Microsoft.VisualBasic.Serialization.JSON
Imports Microsoft.VisualBasic.Win32
Imports sciBASIC.ComputingServices.ComponentModel
Imports sciBASIC.ComputingServices.FileSystem
Namespace TaskHost
'''
''' Running on the server cluster nodes.
'''
Public Class TaskInvoke : Inherits IHostBase
Implements IRemoteSupport
Implements IDisposable
'''
'''
'''
''' You can suing function to initialize this server object.
Sub New(Optional port As Integer = 1234)
Call MyBase.New(port)
__host.Responsehandler = AddressOf New ProtocolHandler(Me).HandleRequest
FileSystem = New FileSystemHost(GetFirstAvailablePort)
End Sub
Public Function Run() As Integer
Return __host.Run()
End Function
Public Overrides ReadOnly Property Portal As IPEndPoint
Get
Return Me.GetPortal
End Get
End Property
'''
''' 远程文件系统
'''
'''
Public ReadOnly Property FileSystem As FileSystemHost Implements IRemoteSupport.FileSystem
Public ReadOnly Property LinqProvider As LinqPool = New LinqPool
'''
''' Invoke the function on the remote server.(远程服务器上面通过这个方法执行函数调用)
'''
'''
'''
Public Shared Function Invoke(params As InvokeInfo) As Rtvl
Dim rtvl As Rtvl
Try
Dim rtvlType As Type = Nothing
Dim value As Object = __invoke(params, rtvlType)
rtvl = New Rtvl(value, rtvlType)
Catch ex As Exception
ex = New Exception(params.GetJson, ex)
rtvl = New Rtvl(ex)
End Try
Return rtvl
End Function
'''
''' A common function of invoke the method on the remote machine
'''
''' 远程主机上面的函数指针
''' value's
'''
Private Shared Function __invoke(params As InvokeInfo, ByRef value As Type) As Object
Dim func As MethodInfo = params.GetMethod
Dim paramsValue As Object() = params.Parameters.Select(Function(arg) arg.GetValue).ToArray
Dim x As Object = func.Invoke(Nothing, paramsValue)
value = func.ReturnType
Return x
End Function
Public Shared Function TryInvoke(info As InvokeInfo) As Object
Return __invoke(info, Nothing)
End Function
Private Function Invoke(CA As Long, args As RequestStream, remote As System.Net.IPEndPoint) As RequestStream
Dim params As InvokeInfo = JsonContract.LoadObject(Of InvokeInfo)(args.GetUTF8String)
Dim value As Rtvl = Invoke(params)
Return New RequestStream(value.GetJson)
End Function
Private Function Free(CA As Long, args As RequestStream, remote As System.Net.IPEndPoint) As RequestStream
Dim uid As String = args.GetUTF8String
Call LinqProvider.Free(uid)
Return NetResponse.RFC_OK ' HTTP/200
End Function
'''
''' 执行远程Linq代码
'''
''' SSL证书编号
'''
'''
'''
Private Function InvokeLinq(CA As Long, args As RequestStream, remote As System.Net.IPEndPoint) As RequestStream
Dim params As InvokeInfo = JsonContract.LoadObject(Of InvokeInfo)(args.GetUTF8String) ' 得到远程函数指针信息
Dim type As Type = Nothing
Dim value As Object = __invoke(params, type)
Dim source As IEnumerable = DirectCast(value, IEnumerable)
Dim svr As String = LinqProvider.OpenQuery(source, type).GetJson ' 返回数据源信息
Return New RequestStream(svr)
End Function
'''
'''
'''
'''
''' ``{source, args}``
'''
'''
Private Function LinqSelect(CA As Long, args As RequestStream, remote As System.Net.IPEndPoint) As RequestStream
Dim params As InvokeInfo = JsonContract.LoadObject(Of InvokeInfo)(args.GetUTF8String) ' 得到远程函数指针信息
Dim func As MethodInfo = params.GetMethod
Dim paramsValue As Object() = params.Parameters.Select(Function(arg) arg.GetValue).ToArray
Dim source As IEnumerable = DirectCast(paramsValue(Scan0), IEnumerable)
Dim type As Type = func.ReturnType
source = From x As Object
In source.AsParallel
Let inputs As Object() =
{x}.Join(paramsValue.Skip(1)) _
.ToArray
Select func.Invoke(Nothing, inputs)
Dim svr As String = LinqProvider _
.OpenQuery(source, type) _
.GetJson
Return New RequestStream(svr) ' 返回数据源信息
End Function
'''
''' This node is alive
'''
'''
'''
'''
'''
Private Function Handshake(CA&, args As RequestStream, remote As System.Net.IPEndPoint) As RequestStream
Return NetResponse.RFC_OK ' HTTP/200
End Function
Private Function GetNodeLoad(CA&, args As RequestStream, remote As System.Net.IPEndPoint) As RequestStream
Return RequestStream.CreatePackage(TaskManager.ProcessUsage)
End Function
#Region "IDisposable Support"
Private disposedValue As Boolean ' To detect redundant calls
' IDisposable
Protected Overridable Sub Dispose(disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: dispose managed state (managed objects).
Call _LinqProvider.Free
End If
' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
' TODO: set large fields to null.
End If
Me.disposedValue = True
End Sub
' TODO: override Finalize() only if Dispose(disposing As Boolean) above has code to free unmanaged resources.
'Protected Overrides Sub Finalize()
' ' Do not change this code. Put cleanup code in Dispose(disposing As Boolean) above.
' Dispose(False)
' MyBase.Finalize()
'End Sub
' This code added by Visual Basic to correctly implement the disposable pattern.
Public Sub Dispose() Implements IDisposable.Dispose
' Do not change this code. Put cleanup code in Dispose(disposing As Boolean) above.
Dispose(True)
' TODO: uncomment the following line if Finalize() is overridden above.
' GC.SuppressFinalize(Me)
End Sub
#End Region
End Class
End Namespace