Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MSMQ配置说明 #92

Open
renyh opened this issue May 2, 2018 · 11 comments
Open

MSMQ配置说明 #92

renyh opened this issue May 2, 2018 · 11 comments

Comments

@renyh
Copy link
Contributor

renyh commented May 2, 2018

(有两种方法启用MSMQ组件。

第一种是在打开 控制面板/程序与功能,点击左上方的 启用或关闭windows功能,找到microsoft Message Queue,勾选MSMQ的服务组件。)

第二种是在dp2installer程序中,点击菜单下的library/工具/启动MSMQ。
通过dp2install安装msmq不一定能成功,如果安装成功应该如下
image


MSMQ(微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。

dp2系统发送微信公众号信息和验证码的过程是:dp2Library服务器将消息发送到MSMQ消息队列,这些消息暂存在MSMQ消息队列里面,然后这些消息被dp2capo发送出去。当dp2capo发送了消息之后,存储在MSMQ消息队列里面的消息相应减少。

如何查看消息队列里有没有信息:
在服务器上点windows菜单图标-向下箭头-从中点【计算机管理】-【服务和应用程序】-【消息队列】-【专用队列】,如下图,
image
如果某个实例中有消息未发出,该实例名称会出现在【专用队列】一栏。消息全部发送出去之后,就不会出现在这里。

存储在服务器消息队列里的消息是会占用一定空间的。特殊地,如果dp2capo因为某种原因断网,从dp2Library传送到消息队列里的消息就会一直保存着,发送不出去,这样占用的空间就会越来越大。这在维护dp2capo过程中需要特别注意。

@renyh
Copy link
Contributor Author

renyh commented May 2, 2018

问题描述

20180430在登录某单位实例准备做日志备份时,无法收到短信验证码,提示如下图:
image

解决过程

  1. 首先检查dp2library错误日志,发现没有当天日志。检查了最近几天的日志,也没有相关错误信息。
  2. 重启该实例,查看dp2library启动过程的日志,也未发现异常。
    image
  3. 检查是否安装了MSMQ组件,同时检查有没有dp2library实例对应的消息队列名称,注意这个名称要与library.xml的配置一致。

在服务器上点windows菜单图标-向下箭头-从中点【计算机管理】-【服务和应用程序】-【消息队列】-【专用队列】,如下图:
image
这里发现没有上面用户实例的消息队例。
4. 检查libary.xml是否配置了消息队例,message节点的defaultQueue属性。
<message dbname="消息" reserveTimeSpan="365day" defaultQueue=".\private$\dp2library_test" />
注意defaultQueue属性值应该是与消息队列中的名称一致的。
这里发现上面用户实例的library.xml的message节点未配置defaultQueue属性。
5. 至此问题原因找到了,上述不能发送短信是因为该用户实例未配置MSMQ。

扩展

中途也检查了dp2library服务使用的系统帐户,是否对消息队列拥有完整权限。

  1. 查看dp2library使用的帐户为local system
    image
    image
  2. 在计算机管理里面,看看消息队列的属性。(注意:消息队列的名字要从 dp2library 的 library.xml文件对应)
    image
    image
    上图是名为 dp2library 的消息队列的属性。可以看到,system 这个账户具有操作消息队列的所有权限

MSMQ配置

前提是安装好了微软的MSMQ服务器(通过windows组件界面启用)。

dp2libary实例安装好之后,再进入到实例配置界面,点击“自动配置MSMQ参数“
image

系统自动配置了下面加粗的4个地方:
<message dbname="消息" reserveTimeSpan="365day" defaultQueue=".\private$\dp2library_lib1" />

<arrived dbname="预约到书" reserveTimeSpan="2day" outofReservationThreshold="10" canReserveOnshelf="true" notifyTypes="dpmail,email,mq" />

<readersMonitor startTime="23:00" types="dpmail,email,mq" />

<circulation patronAdditionalFroms="证号,姓名" verifyBookType="true" verifyReaderType="true" notifyTypes="mq" verifyBarcode="true" verifyRegisterNoDup="no" />

如果要删除MSMQ配置,需要修改上述4个地方的配置,即删除message节点的defaultQueue属性,删除其它地方的mq。另外,如果在消息队列也要手工删除对应的名称。

这里有个小技巧,可以在dp2library实例配置界面,按下ctrl键再点”自动配置MSMQ参数“,则删除MSMQ配置,但发现目前只是删除了message节点的属性,未删除其它节点中的mq,也未删除消息队例中对应名称的队列,需要开发人员再检查一下自动删除配置的功能。


谢老师留言:

对 dp2library 的维护,主要是通过错误日志观察各种情况,出现问题,第一时间先看看日志文件,基本功要扎实,要理性,不要光凭直觉

上述日志截图里面,反映 dp2library 实例初始化的阶段,经过了初始化 Message Queue 的阶段。然后没有报错,仅此而已。注意,它并不表示“已经启用了 MSMQ 相关功能”,或者表示没有启用。注意只是说没有报错。

鉴于 MSMQ 是否被 dp2library 启用,这个信息很重要,我刚才修改了 dp2library 代码,让这里输出一条日志信息,即一旦没有启用 MessageQueue 的时候,会明确提示没有启用。从这个角度,显然是把“启用”当作一般情况了,启用的情况反而不输出信息。

归纳一下:如果 library.xml 中没有配置 MQ 相关的参数,那么就是未启用。以前的用户都是这种状态。而启用呢,差不多都是我们的认证用户单位,我们去帮他们配置启用的。第三种情况,启用了,也就是 library.xml 中有相关参数了,但 dp2library 初始化 MSMQ (比如第一次发现没有队列会自动创建一个队列)时候发现出错了,会明确报错。

然后,在 Login() API 中因为使用了手机短信验证码功能,导致会自动发出消息给 MQ,这个环节,我增补了代码,当发现 MQ 没有启用,也就是 library.xml 中没有配置相关参数的情况下,会明确报错,而不是像昨天截图看到那样抛出异常。这样对前端用户就友好多了。


等发包后,测试下新版本
1)当未配置MSMQ时,检查日志
2)登录时,使用手机短信码,是什么提示
3)配置上MSMQ,检查日志
4)登录时,使用手机验证码。

@renyh renyh changed the title MSMQ配置 MSMQ配置说明 May 2, 2018
@DigitalPlatform
Copy link
Owner

DigitalPlatform commented May 2, 2018

前提是安装好了微软的MSMQ服务器(通过windows组件界面启用)

dp2installer 菜单“dp2library/工具/启用 MSMQ” 可以用来在 Windows 上启用 MSMQ Service,就不用 Windows 组件配置界面了。只是这里的菜单距离 dp2library 实例配置对话框较远,不容易联系起来。

dp2libraryxe 的菜单里面也有对等的功能“工具/为 Windows 启用 MSMQ”。

任*
嗯,明白可以在dp2installer里启用MSMQ。我平时强调在windows组件启用MSMQ,是印象中有次通过dp2installer没启动成功,如下图,当时未细查原因,后面有空再测试下
image

@DigitalPlatform
Copy link
Owner

InstallHelper 类里面的 SetupMessageQueue() 函数有修改。

        public static int SetupMessageQueue(
            string strLibraryXmlFileName,
            string strInstanceName,
            bool bAdd,
            out string strError)

请测试一下。建议用 dp2libraryxe 测试即可。dp2libraryxe 菜单“工具/为 library.xml 首次配置 MQ 参数”。注意加上 Ctrl 键作用是移除 MQ 相关参数。

测试时候需从源代码中找出这个函数,根据函数中涉及到的元素和属性名进行测试。

测试要点:

  1. 观察相关元素不存在和存在的情况下,添加和删除参数的效果是否正确。
  2. 观察相关属性不存在和存在的情况下,添加和删除的效果是否正确。
  3. monitors/readersMonitor 元素的处理比较特殊,如果刚开始不存在 readersMonitor 元素,在添加参数的过程中不会自动去创建 readersMonitor 元素,而是直接放弃添加这个元素的属性。其他元素都是会自动添加元素。
  4. 可以先保存原有的 library.xml 文件,然后大胆手工修改 library.xml 制造测试环境。最后测试换成后恢复 library.xml 文件。

@renyh
Copy link
Contributor Author

renyh commented May 3, 2018

case1:初始安装,用菜单"为library.xml首次配置MQ" 添加或取消参数

dp2libraryxe初始安装完,未配置MSMQ参数时,library.xml相关节点和属性的值如下:

  • <message>节点没有defaultQuere属性
  • <arrived>节点的notifiTypes属性值里没有mq
  • <readersMonitor>节点没有types属性
  • <circulation>节点没有notifyTypes属性。
<message dbname="" reserveTimeSpan="365day" />
<arrived dbname="" reserveTimeSpan="2day" outofReservationThreshold="10" canReserveOnshelf="true" notifyTypes="dpmail,email" />
<readersMonitor startTime="23:00" />
<circulation patronAdditionalFroms="证号,姓名" verifyBookType="true" verifyReaderType="true" />

点击菜单 工具/为library.xml首次配置MQ

  • <message>节点增加了defaultQuere属性
  • <arrived>节点的notifiTypes属性值里增加了mq
  • <readersMonitor>节点增加了types属性,值为dpmail,email,mq,这里的值是否只加mq,为啥要加dpmail和email?
  • <circulation>节点增加了notifyTypes属性,值为mq。
<message dbname="" reserveTimeSpan="365day" defaultQueue=".\private$\dp2library_xe" />
<arrived dbname="" reserveTimeSpan="2day" outofReservationThreshold="10" canReserveOnshelf="true" notifyTypes="dpmail,email,mq" />
<readersMonitor startTime="23:00" types="dpmail,email,mq" />
<circulation patronAdditionalFroms="证号,姓名" verifyBookType="true" verifyReaderType="true" notifyTypes="mq" />

结果基本正常,就是readersMonitor节点的types属性多加了dpmail和email


在上面已配置好参数的基础上,用菜单删除MQ配置,按ctrl+为library.xml首次配置MQ

  • <message>节点删除了defaultQuere属性
  • <arrived>节点的notifiTypes属性值里删除了mq
  • <readersMonitor>节点的types属性值里删除了mq
  • <circulation>节点的notifyTypes属性值里删除了mq
<message dbname="" reserveTimeSpan="365day" />
<arrived dbname="" reserveTimeSpan="2day" outofReservationThreshold="10" canReserveOnshelf="true" notifyTypes="dpmail,email" />
<readersMonitor startTime="23:00" types="dpmail,email" />
<circulation patronAdditionalFroms="证号,姓名" verifyBookType="true" verifyReaderType="true" notifyTypes="" />

结果正常


在上在已经删除参数的基础上,再按ctrl+为library.xml首次配置MQ 取消参数
报已清除了相关参数
image


在上面删除MQ配置参数的基础上,再次点击菜单“为library.xml首次配置MQ”。

  • <message>节点增加了defaultQuere属性
  • <arrived>节点的notifiTypes属性值里增加了mq
  • <readersMonitor>节点的types属性值里增加了mq
  • <circulation>节点的notifyTypes属性值里增加了mq
<message dbname="" reserveTimeSpan="365day" defaultQueue=".\private$\dp2library_xe" />
<arrived dbname="" reserveTimeSpan="2day" outofReservationThreshold="10" canReserveOnshelf="true" notifyTypes="dpmail,email,mq" />
<readersMonitor startTime="23:00" types="dpmail,email,mq" />
<circulation patronAdditionalFroms="证号,姓名" verifyBookType="true" verifyReaderType="true" notifyTypes="mq" />

结果正常

case2:观察相关元素不存在和存在的情况下,添加和删除参数的效果是否正确。

手工修改libary.xml,删除<message>、<arrived>、<readersMonitor>、<circulation>4个节点,然后点击菜单 “为library.xml首次配置MQ”

  • 添加了<message>节点,并增加了defaultQuere属性
  • 添加了<arrived>节点,并增加了notifyTypes属性,但值为什么要多加上dpmail,mail呢?
  • 添加了<circulation>节点,并增加了notifyTypes属性
  • 未添加readersMonitor,符合下面这段开发说明:
    monitors/readersMonitor 元素的处理比较特殊,如果刚开始不存在 readersMonitor 元素,在添加参数的过程中不会自动去创建 readersMonitor 元素,而是直接放弃添加这个元素的属性。其他元素都是会自动添加元素。
  <message defaultQueue=".\private$\dp2library_xe" />
  <arrived notifyTypes="dpmail,mail,mq" />
  <circulation notifyTypes="mq" />

结果基本正常,就是arrived节点的notifyTypes属性同时加了dpmail,mail


在上面已有相关元素的基础上,按Ctrl+为library.xml首次配置MQ 删除参数

  • <message>节点删除了defaultQuere属性
  • <arrived>节点的notifiTypes属性值里删除了mq
  • <circulation>节点的notifyTypes属性值里删除了mq
  <message />
  <arrived notifyTypes="dpmail,mail" />
  <circulation notifyTypes="" />

结果正常


在上面没有相关属性的基础上,再按Ctrl+为library.xml首次配置MQ 删除参数
报已清除了相关参数

结果正常

case3:观察相关属性不存在和存在的情况下,添加和删除的效果是否正确。

手工修改libary.xml,去掉<message>、<arrived>、<readersMonitor>、<circulation>4个节点的相关属性,只是空元素,如下:

  <message />
  <arrived  />
  <readersMonitor>
  <circulation />

然后点击菜单 “为library.xml首次配置MQ”

  • <message>节点增加了defaultQuere属性
  • <arrived>节点增加了notifiTypes属性,值为dpmail,mail,mq,多加了dpmail和mail
  • <readersMonitor>节点增加了types属性,值为dpmai,mail,mq,多加了dpmail和mail
  • <circulation>节点增加了notifyTypes属性,值为mq
  <message defaultQueue=".\private$\dp2library_xe" />
  <arrived notifyTypes="dpmail,mail,mq" />
  <readersMonitor types="dpmail,email,mq" />
  <circulation notifyTypes="mq" />

结果基本正常,就是notifyTypes与types属性值同时加了dpmail和mail。


在上面已经存在相关属性的基础上,按ctrl+为library.xml首次配置MQ,取消参数

  • <message>节点删除了defaultQuere属性
  • <arrived>节点的notifiTypes属性值里删除了mq
  • <readersMonitor>节点的types属性值里删除了mq
  • <circulation>节点删除了notifyTypes属性
  <message />
  <arrived notifyTypes="dpmail,mail" />
  <readersMonitor types="dpmail,email" />
  <circulation notifyTypes="" />

结果正常

@renyh
Copy link
Contributor Author

renyh commented May 4, 2018

谢老师回复:

image

从源代码可以看出,如果 readersMonitor 元素的 types 属性缺省,那么实际效果是 "dpmail,email"。也就是说这个属性是有缺省值的。“缺省值”顾名思义就是缺了它其实暗中还有个默认值的。

如果我们为 types 属性值添加 mq,那添加完成以后应该是 "dpmail,email,mq",而不应该是 "mq"。这样才能保证和以前的效果一致

@renyh
Copy link
Contributor Author

renyh commented May 4, 2018

对话:后面有精力再测types属性为空 或 值为空的情况

数字平台谢*
一旦 types 属性值具备以后(也就是说不是缺省状态),就比较好说了,从里面可以直接看出有什么消息类型。这里考一下你:types="" 代表什么?
这个问题很重要值得思考一下。因为属性不存在,和属性值为空,两种情况经常是容易导致逻辑问题的。写代码尤其要注意

数字平台任** 2018/5/4 21:49:03

这里考一下你:types="" 代表什么?

表示没有设置消息类型

这个问题很重要值得思考一下。因为属性不存在,和属性值为空,两种情况经常是容易导致逻辑问题的。写代码尤其要注意

嗯,属性不存在默认值是dpmail,email;属性值为空是没有设置消息类型

2018/5/4 23:00:11
数字平台谢* 2018/5/4 23:00:11

表示没有设置消息类型

本来应该是这样的。但旧版本的代码有问题,这个还不能确保。我今天修改了代码,应该好一点了,后面找机会测试。可能需要制造一些案例用源代码跟踪进去测试。(因为通过最后是否发送了消息来判断测试结果,链条太长了)。或者说这里需要单元测试。

这些细节比较深了。后面开发 dp3 的时候,我们最好用不弱于这个强度的编码和测试精神去开发,确保一开始系统的质量就是好的。在结对编程的情况下,可以安排一个人专门去推敲这些细节,并且在项目早期就写好技术 wiki 和安排单元测试。

项目一般都面临很大的“发布”压力,各方面都要求产品赶紧出来。但项目组内部是知道产品质量到底如何的,直觉肯定有。要做到不欺骗自己,如果感觉不行,就放慢一点节奏,把焦点聚集到一个一个这样的细节上面,夯实产品内部。实际上是为自己良心开发,不是为了敷衍客户。

一般来说,质量较好,推敲较多的代码,也经得起后期的需求修改。更容易变化。因为考虑的细节比较深入比较扎实,里面肯定是花了不少精力去思考边界,思考合理性问题。

如果人力充沛了,对“遗产”代码也可以重新花精力看看,能够慢慢重构。重构以前先搞好分析和单元测试。其实遗产系统里面的函数库,拆散了完全是可以用到新项目里面的。所以这里实际上也是可以节省精力的。看你从什么角度去看这些问题。

数字平台任** 2018/5/5 6:51:18

本来应该是这样的。但旧版本的代码有问题,这个还不能确保。我今天修改了代码,应该好一点了,后面找机会测试。
如果人力充沛了,对“遗产”代码也可以重新花精力看看,能够慢慢重构。

嗯,我先把 关于types属性不存在和值为空 这个事记到issue,有时间了再进一步测试。

@renyh
Copy link
Contributor Author

renyh commented May 4, 2018

用标准版服务器测试

初始安装完成后,各个节点的情况如下: 与xe版本不同的是<message>没有reserveTimeSpan="365day" 属性。是不是这个属性不存在的话,缺省值为365day呢

<message dbname="" />
<arrived dbname="" reserveTimeSpan="2day" canReserveOnshelf="true" />
<readersMonitor startTime="23:00" />
<circulation patronAdditionalFroms="证号,姓名" verifyBookType="true" verifyReaderType="true" />

自动配置MSMQ参数后,结果如下,正确

<message dbname="" defaultQueue=".\private$\dp2library_test1" />
<arrived dbname="" reserveTimeSpan="2day" canReserveOnshelf="true" notifyTypes="dpmail,mail,mq" />
<readersMonitor startTime="23:00" types="dpmail,email,mq" />
<circulation patronAdditionalFroms="证号,姓名" verifyBookType="true" verifyReaderType="true" notifyTypes="mq" />

按ctrl+自动配置MSMQ参数,取消配置,结果如下,正确

<message dbname="" reserveTimeSpan="365day" />
<arrived dbname="" reserveTimeSpan="2day" outofReservationThreshold="10" canReserveOnshelf="true" notifyTypes="dpmail,mail" />
<readersMonitor startTime="23:00" types="dpmail,email" />
<circulation patronAdditionalFroms="证号,姓名" verifyBookType="true" verifyReaderType="true" notifyTypes="" />

@renyh
Copy link
Contributor Author

renyh commented May 5, 2018

任**
测试发现,单机版在配置了MQ参数后,会立即创建对应的队列;而标准版实列,配置了MQ参数,没有立即创建队列

数字平台谢 2018/5/4 17:46:00

而标准版,配置了MQ参数,没有立即创建队列

dp2library 第一次启动的时候,会根据 library.xml 中的配置参数去自动创建 MSMQ 中的队列对象。这一点无论是单机版还是标准版都是一样的。你可以留意一下 dp2library 的错误日志,印象里,里面会记载第一次创建队列对象的动作。

单机版在配置了MQ参数后,会立即创建对应的队列

这个有可能是,单机版的 library 模块被刺激了起来;标准版的 library service 处于未真正启动状态,需要专门用内务刺激一次。上面刚说了,dp2library 第一次启动会自动创建队列对象。

为啥 dp2libraryxe 刚安装就被刺激起来了呢?因为 dp2libraryxe 每次 .exe 启动以后,它自己会扮演前端去探测一次 library 模块中的 supervisor 账户是否有密码,这样就刺激了 library 模块真正启动了。所谓真正启动,可以从错误日志中看出。如果仅仅是安装完没有真正启动,是不会写错误日志的。

dp2libraryxe.exe 启动时候自己检查 supervisor 密码,是为了警告这时候启动 dp2OPAC 服务的危险性,因为外界的用户可以访问 dp2OPAC,用 supervisor 干一些坏事损害系统。但 dp2libraryxe 如果没有安装 dp2OPAC 模块,而且 dp2libraryxe 是单机版而不是小型版的话,是不存在这种危险的,也就是说 supervisor 账户没有密码也不危险。

因为单机版用内务只能本机访问,基本可以确保就是该访问的人一个人在访问。但 dp2OPAC 页面就不同了,你卡不住它的,至少局域网里面其他机器有可能访问这台 dp2libraryxe 机器。


任**针对谢老师回复,做了下列测试和检查,未发现异常

case1:dp2初始创建时,配置MSMQ,同时创建4个库,创建库这个过程使得dp2library启动起来,启动过程会创建队列对象
步骤如下:
1)重新创建一套实例test1,dp2library在实例配置界面创建完成,回到实例管理界面;
2)然后再次点击test1实例到配置界面,配置MSMQ参数,关闭配置界面,到实例管理界面
3)关闭实例管理界面,询问是否创建4个库,点是,创建数据库过程使dp2library启动起来。
4)dp2library启动时在MSMQ创建了对应的队列对象。dp2library日志如下:

2018/5/5 7:21:41 INFO: Message Queue
2018/5/5 7:21:41 首次创建 MSMQ 队列 '.\private$\dp2library_test1' 成功

5)然后从消息队列界面看查,确实有了对应的队列
image

case2:dp2library创建时,未配置MSMQ参数,同时创建4个库,查看dp2library启动日志
步骤如下:
1)重新创建一套实例test2,dp2library在实例配置界面创建完成,回到实例管理界面;
2)关闭实例管理界面,询问是否创建4个库,点是,创建数据库过程使dp2library启动起来。
3)如果dp2library未配置MSMQ参数,启动日志如下:

2018/5/5 8:49:00 INFO: Message Queue
2018/5/5 8:49:00 INFO: Message Queue 未被启用

case3:dp2初始创建时,配置MSMQ,不创建4个库,dp2library没有立即启动起来,通过dp2内务登录刺激dp2library启动
步骤如下:
1)重新创建一套实例test3,dp2library在实例配置界面创建完成,回到实例管理界面;
2)然后再次点击test3实例到配置界面,配置MSMQ参数,关闭配置界面,到实例管理界面
3)关闭实例管理界面,询问是否创建4个库,点
4)dp2library不有立即启动,查看数据目录,还没有初始化的内容。此时数据目录是这样的:
image
5)通过dp2内务登录test3,刺激dp2library启动起来,数据目录有了更多内容,日志记录了启动过程。
image
6)查看消息队列,启动过程创建了队列
image

@renyh
Copy link
Contributor Author

renyh commented May 5, 2018

关于MSMQ中队列的帐户权限

谢老师,再反馈个问题,单机版对应的队列,有自己的帐户,可以手动删除。

image

标准版服务器实例 对应的消息队列,安全里只有everyone,system,anonymous login,没有像单机版对应实例的 renyh那个帐户,没法手动删除。

image

数字平台谢 2018/5/4 17:53:19

标准版服务器实例 对应的消息队列,安全里只有everyone,system,anonymous login,没有像单机版对应实例的 renyh那个帐户

标准版是 Windows Service 模块。记住用“服务”打开 library service 属性看看,这个 service 是 local system 账户!
这是个权限很高的账户。所以可以完全操作 MSMQ 没有问题。你从 MSMQ 管理界面也能看出这一点。

任**:
这个我知道怎么查看,如下图
image

谢*:

没有像单机版对应实例的 renyh那个帐户

单机版 dp2libraryxe.exe 也是以 Administrator 身份运行的。dp2libraryxe.exe 启动的时候有个 UAC 对话框,做了一次提权。但这个单机版它操作 MSMQ 有没有权限障碍,是不是要给 (Windows) MQ对象添加什么自己的权限,我记不清楚了,可能要查一下代码

image

InitialMsmq() 这个函数里面注释很清楚,可以看看它做了哪些事情

// 当前用户已经是 LocalSystem 了,需要额外给 Everyone 添加权限,以便让 dp2Capo 的控制台方式运行能访问这个 Queue

// 如果当前是 Administrator,表示可能是 dp2libraryxe 启动的方式,那么需要专门给 LocalSystem 操作 Queue 的权限,以便 Windows Service 方式的 dp2Capo 能访问 Queue

记得这些地方当时编程和测试的时候还是满费劲的

之所以做成 library.xml 里面随时配置了队列对象名,启动实例时候就自动去创建队列对象(如果不存在的话),主要是考虑到兼容以前的老用户的环境。因为对这些用户,早已错过了安装环节,不太可能要求他们再走一遍添加了创建队列对象的安装环节。所以等于是安装要做的事情下放到平时了。

任 补充:注意这里不是说library.xml配置后就立即创建队列,而是dp2library实际启动时创建队列。

这种开发思路是比较野蛮的,对开发者要求高一些,对用户要求低一些。实际上也是满足敏捷开发发布的需要,你面对的是一个复杂混乱的用户运行环境。类似于互联网公司做网站那种思路,而不是做应用软件的思路

我在想,是否取消MQ参数配置时,也要检查是否实际创建了消息队例,如果有的话,也要删除。

这个,有点怎么说呢。你添加队列对象比较容易,删除起来比较麻烦。因为 MQ 对象里面可能有残余的信息。如果是系统管理员手痒随便修改一下 library.xml 文件,你就把对应的 MQ 对象删除了,可能风险比较大。我是选择不删除它。当然如果是 dp2installer 确定要卸载一个实例了,那这个时候应该删除 MQ 对象,后面我记着加一下这个动作

@Jason.Liao 我们都不能以system的角色登录到电脑啊

嗯,是有这个问题。当时我测试时候怎么删除的,我也记不清了。用 Service 模块自己解决删除是最好的
类似的还有 Service 对 SQL Server 创建的数据库,也只有它才能删除。

dp2libraryxe 在卸载的时候,我也故意没有删除“用户目录”。用户目录里面存有 SQLite 的数据库文件。兴许用户误操作了以后咨询我们,还能找回来数据。
dp2circulation 在卸载的时候,也故意没有删除“用户目录”。里面残留了一些登录时候留存的用户名和密码什么的,下次再安装 dp2circulation 应该是马上就能用起来

用户目录的位置,和 Windows 登录时候的账户关联,应该是当前 Windows 用户才能访问,基本上没有安全性(隐私)担忧,从逻辑上来说的话

@renyh
Copy link
Contributor Author

renyh commented May 5, 2018

当然如果是 dp2installer 确定要卸载一个实例了,那这个时候应该删除 MQ 对象,后面我记着加一下这个动作

希望加上此功能,或者有什么办法可以删除MSMQ里的队列。现在测试建了很多实例的队列,没法删除了。
image

@renyh
Copy link
Contributor Author

renyh commented May 5, 2018

如何删除一个Queue?

如果是dp2library的Windows Service模块自动创建的队列,则一般的MMC控制台删除不了这样的队列。可用下面方法删除:

1)安装psexec工具:
https://docs.microsoft.com/zh-cn/sysinternals/downloads/psexec
下载后展开到一个目录,就安装好了。

2)用Administrator身份启动一个Windows命令提示符,然后到上述安装目录,
执行:psexec –i –s cmd.exe
这样就启动了一个特殊的Windows命令提示符窗口,它的身份是LocalSystem账号。

3)在这个特殊的Windows命令提示符窗口中,到Windows系统目录打开计算机管理控制台:
C:\windows\system32>mmc compmgmt.msc
然后在这里就可以删除队列了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants