0 关注者 · 3 帖子

文件传输协议 (FTP) 是一种标准的网络协议,用于在计算机网络上的客户端和服务器之间传输计算机文件。

了解更多信息

文章 Tete Zhang · 十月 26, 2022 3m read

“池大小”(PoolSize)设置的值决定了一个组件的作业的量和启动方式。在这篇文章中我们将具体讨论对于不同类型的组件来说“池大小”设置的可能值和这些值所代表的含义。

Pool Size = 1

对于所有的组件来说,运行池大小为1的含义都是一样的: 该组件有且只有一个作业,单独运行该组件的代码,顺序处理发送到该组件的消息(FIFO)。

Pool Size > 1

对于业务进程(BP)和业务操作(BO)来说,当运行池大小大于1时,该组件将运行多个作业(作业数=运行池大小设置数)。每个作业都只运行该组件的代码,但消息处理的顺序将被打乱。将运行池的大小设为大于1的值可以在一定程度上提升组件处理消息的性能,但是每个作业的性能还是受限于系统资源的,所以并不是说组件的性能可以随着运行池的大小增加而无限提升。

对于轮询类业务服务(Polling BS)来说,当运行池大小大于1时,该服务也将运行多个作业(作业数=运行池大小设置数)。但这种配置会导致多个进程对轮询结果产生竞争(race condition),所以一般情况下轮询服务不应将运行池大小设为大于1的数值。

1
0 285
文章 姚 鑫 · 五月 31, 2021 4m read

第十二章 IBM WebSphere MQ检索邮件

检索邮件

要检索邮件,请执行以下操作:

  1. 按照“创建连接对象”中的说明创建连接对象。在这种情况下,请创建%Net.MQRecv的实例。Connection对象有一个消息队列,可以从中检索消息。
  2. 根据需要调用以下方法:
  • %Get()-通过引用返回字符串消息作为第一个参数。
  • %GetStream()-给定初始化的文件字符流,此方法从队列中检索消息,并将其放入与该流关联的文件中。请注意,必须设置流的Filename属性才能对其进行初始化。不支持二进制流。
  1. 检查调用的方法返回的值。请参阅“获取错误代码”。请记住,当队列为空时,IBM WebSphere MQ返回2033
  2. 检索完消息后,调用Connection对象的%Close()方法以释放动态链接库的句柄。

示例1:ReceiveString()

下面的类方法从mqtest队列检索消息。

///Method returns string or null or error message
ClassMethod ReceiveString() As %String
{
 Set recv=##class(%Net.MQRecv).%New()
 Set queue="mqtest"
 Set qm="QM_antigua"
 Set chan="S_antigua/TCP/antigua(1414)"
 Set logfile="c:\mq-recv-log.txt"
 
 Set check=recv.%Init(queue,qm,chan,logfile)
 If 'check  Quit recv.%GetLastError()

 Set check=recv.%Get(.msg)
 If 'check {
     Set reasoncode=recv.%GetLastError()
     If reasoncode=2033 Quit ""
     Quit "ERROR: "_reasoncode
     }
 
 Quit msg
}

示例2:ReceiveCharacterStream()

以下方法可以检索更长的消息,因为它使用%GetStream()

/// Method returns reason code from IBM WebSphere MQ
ClassMethod ReceiveCharacterStream() As %Integer
{
 Set recv=##class(%Net.MQRecv).%New()
 Set queue="mqtest"
 Set qm="QM_antigua"
 Set chan="S_antigua/TCP/antigua(1414)"
 Set logfile="c:\mq-recv-log.txt"

 Set check=recv.%Init(queue,qm,chan,logfile)
 If 'check  Quit recv.%GetLastError()
 
 //initialize the stream and tell it what file to use
 //make sure filename is unique we can tell what we received
 Set longmsg=##class(%FileCharacterStream).%New()
 Set longmsg.Filename="c:\mq-received"_$h_".txt"

 Set check=recv.%GetStream(longmsg)

 If 'check  Quit recv.%GetLastError()
 Quit check
}

更新消息信息

%Net.MQSend%Net.MQRecv类还提供以下方法:

%CorId()

(通过引用)更新上次读取的邮件的关联ID。

%ReplyQMgrName()

(通过引用)更新上次读取的消息的回复队列管理器名称。

%ReplyQName()

(通过引用)更新上次读取的消息的回复队列名称。

Troubleshooting

如果在使用IBM WebSphere MQ的InterSystems IRIS接口时遇到问题,应该首先确定客户端是否安装正确并且可以与服务器通信。要执行这样的测试,可以使用IBM WebSphere MQ提供的示例程序。可执行文件位于IBM WebSphere MQ客户端的bin目录中。

以下步骤介绍如何在Windows上使用这些示例程序。在其他操作系统上,细节可能会有所不同;请参考IBM文档并检查您的客户端中存在的文件的名称。

  1. 创建一个名为MQSERVER的环境变量。它的值的格式应该是channel_name/Transport/server,其中channel_name是要使用的通道的名称,Transport是指示要使用的传输的字符串,而server是服务器的名称。例如:S_Antigua/TCP/Antigua
  2. 在命令行中,输入以下命令:
amqsputc queue_name queue_manager_name

其中,QUEUE_NAME是要使用的队列的名称,QUEUE_MANAGER_NAME是队列管理器的名称。例如:

amqsputc mqtest QM_antigua

如果amqsputc命令无法识别,请确保已更新PATH环境变量以包括IBM WebSphere MQ客户端的bin目录。

  1. 应该会看到几行代码,如下所示:
Sample AMQSPUT0 start
target queue is mqtest
  1. 现在可以发送消息了。只需键入每条消息,然后在每条消息后按Enter键即可。例如:
sample message 1
sample message 2
  1. 发送完邮件后,按两次Enter键。然后,将看到如下所示的行:
Sample AMQSPUT0 end
  1. 要完成此测试,我们将检索发送到队列的消息。在命令行中键入以下命令:
amqsgetc queue_name queue_manager_name

其中,QUEUE_NAME是要使用的队列的名称,QUEUE_MANAGER_NAME是队列管理器的名称。例如:

  1. 然后,应该看到一个起始行,后跟之前发送的消息,如下所示:
Sample AMQSGET0 start
message <sample message 1>
message <sample message 2>
  1. 此示例程序短暂等待接收任何其他消息,然后显示以下内容:
no more messages
Sample AMQSGET0 end

如果测试失败,请参考IBM文档。问题的可能原因包括以下几个方面:

  • 安全问题
  • 队列定义不正确
  • 队列管理器未启动
0
0 174
文章 姚 鑫 · 五月 29, 2021 4m read

第十章 使用FTP

IRIS提供了一个类%Net.FtpSession,可以使用它从InterSystems IRIS内建立与FTP服务器的会话。

建立FTP会话

要建立FTP会话,请执行以下操作:

  1. 创建%Net.FtpSession的实例。
  2. 可以选择设置此实例的属性,以控制会话的常规行为:
  • Timeout 超时指定等待FTP服务器回复的时间(以秒为单位)。
  • SSLConfiguration指定用于连接的激活的SSL/TLS配置(如果有)。如果FTP服务器使用HTTPS,请使用此选项。
  • TranslateTable指定在读取文件内容或写入文件内容时要使用的转换表。
  • UsePASV启用PASV模式。
  • FTP服务器使用https时,SSLCheckServerIdentity适用。默认情况下,当%Net.FtpSession的实例连接到SSL/TLS服务器时,它会检查证书服务器名称是否与用于连接到服务器的DNS名称匹配。如果这些名称不匹配,则不允许连接。

若要禁用此检查,请将SSLCheckServerIdentity属性设置为0。

  1. 调用Connect()方法以连接到特定的FTP服务器。
  2. 调用ascii()binary()方法将传输模式分别设置为ASCII模式或二进制模式。要查看当前传输模式,请检查实例的Type属性的值。

注意:%Net.FtpSession的每个方法都返回一个状态,应该检查该状态。这些方法还设置提供有关会话状态的有用信息的属性的值:

  • 如果当前已连接,则CONNECTED为TRUE,否则为FALSE。
  • ReturnCode包含上次与FTP服务器通信时的返回代码。
  • ReturnMessage包含上次与FTP服务器通信时的返回消息。

Status()方法返回(通过引用)FTP服务器的状态。

命令的转换表

%Net.FtpSession在FTP服务器上查看文件名和路径名时,使用RFC 2640中介绍的技术自动处理字符集转换。当%Net.FtpSession的实例连接到FTP服务器时,它会使用Feat消息来确定服务器是否使用UTF-8字符。如果是,它将命令通道通信切换到UTF-8,以便所有文件名和路径名都可以正确地与UTF-8相互转换。

如果服务器不支持FEAT命令或未报告支持UTF-8%Net.FtpSession实例将使用RAW模式并读取或写入RAW字节。

在极少数情况下,如果需要指定要使用的转换表,请设置%Net.FtpSession实例的CommandTranslateTable属性。一般情况下,应该没有必要使用此属性。

FTP文件和系统方法

一旦建立了FTP会话,就可以调用会话实例的方法来执行FTP任务。%Net.FtpSession提供以下读写文件的方法:

Delete()

删除文件。

Retrieve()

将文件从FTP服务器复制到InterSystems IRIS流中,并通过引用返回该流。要使用此流,请使用标准流方法:Write()WriteLine()Read()ReadLine()Rewind()MoveToEnd()Clear()。还可以使用流的Size属性。

RetryRetrieve()

允许继续检索文件,因为给定的流是由上一次使用Retrieve()创建的。

Store()

将 IRIS流的内容写入FTP服务器上的文件。

Append()

将流的内容追加到指定文件的末尾。

Rename()

重命名文件。

此外,%Net.FtpSession提供了导航和修改FTP服务器上的文件系统的方法:GetDirectory()SetDirectory()SetToParentDirectory()MakeDirectory()

要检查文件系统的内容,请使用list()NameList()方法。

  • List()创建一个流,其中包含其名称与给定模式匹配的所有文件的列表,并通过引用返回该流。
  • NameList()创建文件名数组并通过引用返回该数组。

还可以使用ChangeUser()方法更改为其他用户;这比注销并再次登录要快。使用Logout()方法注销。

System()方法返回(通过引用)有关托管FTP服务器的计算机类型的信息。

Size()MDTM()方法分别返回文件的大小和修改时间。

使用通用sendCommand()方法向FTP服务器发送命令并读取响应。此方法可用于发送%Net.FtpSession中未明确支持的命令。

使用链接的流上载大文件

如果要上传大文件,请考虑使用流接口的LinkToFile()方法。也就是说,不是创建流并将文件读入其中,而是创建流并将其链接到文件。在调用%Net.FtpSessionStore()方法时使用此链接流。


Method SendLargeFile(ftp As %Net.FtpSession, dir As %String, filename As %String)
{
    Set filestream=##class(%FileBinaryStream).%New()
    Set sc=filestream.LinkToFile(dir_filename)
    If $$$ISERR(sc) {do $System.Status.DisplayError(sc) quit }
    
    //上传的文件将与原始文件同名
    Set newname=filename

    Set sc=ftp.Store(newname,filestream)
    If $$$ISERR(sc) {do $System.Status.DisplayError(sc) quit }
}

自定义FTP服务器发出的回调

可以自定义FTP服务器生成的回调。例如,通过这样做,可以向用户提供服务器仍在处理大型传输的指示,或允许用户中止传输。

要自定义FTP回调,请执行以下操作:

  1. 创建%Net.FtpCallback的子类。
  2. 在这个子类中,实现RetrieveCallback()方法,该方法在从FTP服务器接收数据时定期调用。
  3. 还要实现StoreCallback()方法,在将数据写入FTP服务器时会定期调用该方法。
  4. 创建FTP会话时(如“建立FTP会话”中所述),将回调属性设置为等于的子类%Net.FtpCallback
0
0 247