7. GDA配置?
7.1. 彈簧配置?
7.1.1. 這個 gda
命名空間?
7.1.1.1. 在XML文件中使用命名空間?
要使用中的元素,請執行以下操作 gda
命名空間,則需要通過將以下屬性添加到 <beans>
您的Spring配置中的元素:
xmlns:gda="http://www.diamond.ac.uk/schema/gda/gda"
您還需要將這些條目添加到 xsi:schemaLocation
屬性:
http://www.diamond.ac.uk/schema/gda/gda http://www.diamond.ac.uk/schema/gda/gda/gda-gda-1.0.xsd
7.1.1.2. 將命名空間添加到Eclipse中的XML目錄?
如果您使用 gda
命名空間,則應將 gda
將命名空間添加到Eclipse XML Catalog,以便Eclipse可以驗證包含這些自定義元素的XML文件。要執行此操作,請執行以下操作:
打開Eclipse首選項(Window→首選項)
轉到xml→xml目錄
單擊“添加.”
輸入以下詳細信息:
位置:單擊“工作區.”并選擇
uk.ac.gda.core/src/gda/spring/namespaces/gda/gda-gda-1.0.xsd
密鑰類型:選擇“命名空間名稱”
鍵:回車
http://www.diamond.ac.uk/schema/gda/gda/gda-gda-1.0.xsd
7.1.2. FindableNameSetterPostProcessor
?
這句話的意思是:
<bean class="gda.spring.FindableNameSetterPostProcessor" />
在Spring XML文件中導致所有 Findable
對象具有其 name
屬性設置為與Spring相同 id
。因此,您不需要(除少數特殊情況外):
<property name="name" value="..." />
7.1.3. 從創建屬性 java.properties
可獲得的?
使用以下命令:
<context:property-placeholder location="file:${gda.config}/properties/java.properties" />
它允許您在Spring XML文件中使用屬性。例如:
<property name="hostname" value="${gda.images.camerahost}" />
要在中制作標記,請執行以下操作 context
命名空間,則需要將以下屬性添加到 <beans>
您的Spring配置中的元素:
xmlns:context="http://www.springframework.org/schema/context"
您還需要將這些條目添加到 xsi:schemaLocation
屬性:
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
7.1.4. 直接實例化EPICS設備?
例如:
<bean id="S1_top_motor" class="gda.device.motor.EpicsMotor">
<property name="pvName" value="BL04J-AL-SLITS-01:Y:PLUS" />
</bean>
7.1.5. 使用EPICS接口“在幕后”實例化?
這是為那些不喜歡在其XML文件中包含PV的人準備的;-)
要使用在EPICS IOC構建過程中生成的Diamond的GDA-EPICS接口文件,
將其放在Spring XML文件中的某個位置(它不需要ID):
<bean class="gda.configuration.epics.EpicsConfiguration">
<constructor-arg value="${gda.config}/xml/epics-interface.xml" />
</bean>
然后執行以下操作:
<bean id="S1_top_motor" class="gda.spring.EpicsMotorFactoryBean">
<property name="deviceName" value="S1.YP" />
</bean>
EpicsMotorFactoryBean
是彈簧嗎? factory bean - S1_top_motor
對象實際上將是一個 EpicsMotor
.
除了 EpicsMotorFactoryBean
,還有 EpicsMonitorFactoryBean
和 EpicsPositionerFactoryBean
(他們都需要一個 deviceName
)
7.1.6. 將一個文件導入到另一個文件?
<import resource="S1.xml" />
實際上, <import>
替換為導入文件的內容。所有的豆子都在同一個春天里 語境 (即不需要復制 PropertyPlaceholderConfigurer
, the FindableNameSetterPostProcessor
等)。
7.1.7. 請使用 ref
屬性!?
而不是這樣:
<bean id="s1_bottom" class="gda.device.scannable.ScannableMotor">
<property name="motorName" value="S1_bottom_motor" />
</bean>
您可以執行以下操作:
<bean id="s1_bottom" class="gda.device.scannable.ScannableMotor">
<property name="motor" ref="S1_bottom_motor" />
</bean>
請注意,該屬性是 motor
不是 motorName
,并且這使用 ref
屬性-該屬性將 S1_bottom_motor
把馬達裝進 s1_bottom
對象(因此 ScannableMotor
不需要使用 Finder
來獲得底層的馬達-它已經使用Spring連接起來了)。
由于Spring具有此依賴項注入功能,因此不需要使用 Finder
在新的類中,可以使用Spring進行連接。
7.1.8. 通過CORBA使遠程對象可用?
您將在服務器端配置中需要以下內容:
<corba:export namespace="stnBase" />
您需要聲明 corba
通過將以下內容放在XML文件的頂部來創建命名空間:
xmlns:corba="http://www.diamond.ac.uk/schema/gda/corba"
并將這些條目添加到 xsi:schemaLocation
屬性:
http://www.diamond.ac.uk/schema/gda/corba http://www.diamond.ac.uk/schema/gda/corba/gda-corba-1.0.xsd
由于Spring的限制,屬性占位符不能在 namespace
屬性時使用 <corba:export />
。因此,舉個例子:
<corba:export namespace="${gda.beamline.name}" />
不會奏效的。(屬性占位符通常由 PropertyPlaceholderConfigurer
,這是一個 BeanFactoryPostProcessor
在應用程序上下文中對bean定義進行操作的。這個 <corba:export />
元素本身不會轉換為bean定義:它使用名稱空間值為遠程對象添加bean定義。這是不可能的 PropertyPlaceholderConfigurer
要解析中使用的占位符,請執行以下操作 namespace
屬性,然后使用該值查找遠程對象。)
7.1.9. 從其他對象服務器導入遠程對象?
您的客戶端配置中將需要以下內容:
<corba:import namespace="stnBase" />
和一樣 <corba:export />
,以使用 corba
命名空間,則需要在XML文件的頂部聲明它。
使用的好處是 corba:import
“隱藏”bean被添加到所有遠程對象的Spring上下文中,因此您可以在任何 ref="..."
文件中其他位置的屬性。
7.1.10. 使用啟用基于角色的訪問控制 <gda:rbac />
?
要啟用基于角色的訪問控制(RBAC),請將以下元素添加到Spring配置中:
<gda:rbac />
您還必須將 gda.accesscontrol.useAccessControl
屬性到 true
.
7.1.11. 這個 corba
命名空間?
如同 gda
命名空間,如果使用 <corba:export>
或 <corba:import>
元素,則應添加 corba
命名空間添加到Eclipse XML目錄。要執行此操作,請按照 gda
以上命名空間,但使用下列值:
位置:
uk.ac.gda.core/src/gda/spring/namespaces/corba/gda-corba-1.0.xsd
密鑰:
http://www.diamond.ac.uk/schema/gda/corba/gda-corba-1.0.xsd
由于SpringSource工具套件的問題,您可能仍會收到以下警告,可以忽略這些警告:
找不到架構命名空間‘http://www.diamond.ac.uk/schema/gda/corba’‘的元素’corba:export‘的Spring NamespaceHandler
7.1.12. SingletonRegistrationPostProcessor
?
<bean class="gda.spring.SingletonRegistrationPostProcessor" />
這會將您在Spring上下文中創建的某些對象注冊為應用程序范圍的單例實例(例如,元數據)。
(默認情況下,Spring XML文件中的對象是單例。在完美世界中,元數據和其他單例可以注入到其他對象中,而不是調用 Whatever.getInstance()
。在實踐中很難做到這一點,因為(1)需要單例的對象太多;(2)并非所有這些對象都將在Spring XML文件中定義。在Spring XML文件中定義對象很好,因為這使我們可以完全控制它們的配置,這意味著我們可以用模擬對象交換真實對象。但這意味著我們需要將這些對象注冊到某種注冊表中。)
7.1.13. 屬性編輯器?
PropertyEditor
(Javadoc) is a standard
Java interface concerned with converting text representations of property values into their 'real' types (among other
things).
在Spring中,它們用于將Spring配置文件中使用的文本值轉換為被實例化的bean所需的類型。Spring已經內置了對許多類型的支持,但是通過將其放入Spring配置中:
<import resource="classpath:gda/spring/propertyeditors/registration.xml" />
您還可以設置以下類型的屬性:
double[][]
-2D雙陣列
類支持的任何其他類型。 PropertyEditor
s列在 GdaPropertyEditorRegistrar
班級。
7.1.14. Spring配置示例?
鉆石I04.1光束線專門使用Spring進行配置。如果您有權訪問GDA Subversion存儲庫,則可以 view the I04.1 configuration 。這兩個對象服務器的Spring上下文被拆分為多個XML文件,這些文件都位于 servers/main/live 目錄。
7.2. 登錄?
日志記錄消息不僅可以由GDA類生成,還可以由第三方庫生成,例如 Apache Commons Configuration 。GDA類通常使用 SLF4J 用于日志記錄的接口。來自使用Commons日志記錄或Log4j的代碼的日志條目被重定向到SLF4J中,使用兩個 SLF4J bindings : SLF4J上的公共日志記錄 和 SLF4J上的Log4j .
GDA使用 Logback 作為SLF4J實現,因此日志記錄條目從SLF4J傳遞到Logback。
下圖顯示了一些DLS光束線上使用的日志記錄配置選項之一-集中式日志記錄服務

7.2.1. 日志服務器配置?
GDA提供了一個實用程序- gda.util.LogServer
-用于集中記錄來自服務器和客戶端上運行的其對象的消息,如上圖所示。您需要使用四個屬性配置日志服務器:
財產 |
描述 |
---|---|
|
日志服務器偵聽的端口 |
|
日志服務器的日志記錄配置文件,例如LogServer.xml |
|
要存儲GDA日志文件(例如gda.log)的目錄 |
|
日志查看器偵聽的端口,即日志服務器將消息轉發到的端口 |
雖然前兩個屬性是LogServer類所需且必不可少的,但后兩個屬性是可選的,僅在LogServer.xml文件中用于指定日志目的地。
LogServer.xml為日志服務器上的中央日志記錄服務定義日志記錄目的地(附加器)、記錄器級別篩選器和文件日志記錄規則。
7.2.2. GDA對象日志記錄配置?
GDA對象是系統中日志消息的來源。雖然可以配置不同于服務器對象的客戶端對象日志記錄,但這里我們描述了客戶端和服務器都將其日志記錄消息發送到中央日志服務器的情況,如上圖所示。
在這種情況下,客戶端和服務器共享在例如LoggingConfiguration.xml或logBack.xml中定義的相同日志記錄配置。需要設置四個屬性(上面已經定義了一個):
財產 |
描述 |
---|---|
|
將所有消息發送到的遠程端口,即日志服務器的偵聽端口 |
|
運行日志服務器的遠程主機。 |
|
GDA客戶端對象的日志記錄配置文件 |
|
GDA服務器對象的日志記錄配置文件 |
xml將Log Server定義為日志目的地,并為消息源的GDA對象中使用的所有/特定記錄器設置所需的記錄器級別過濾器。
系統中有兩個日志記錄配置文件屬性的原因是歷史的,因為我們過去配置客戶端的方式與配置服務器的方式不同。在我們這里討論的情況下,最后兩個屬性指向相同的LoggingConfiguration.xml文件。
7.2.3. 日志查看器配置?
GDA還提供了一個簡單的日志查看器實用程序- gda.util.LogPanel
用于查看從中央日志服務器接收的日志記錄消息。它通過屬性指定的端口上的套接字連接到日志服務器 gda.logPanel.logging.port
。此屬性是啟動日志面板查看器所必需的。
財產 |
描述 |
---|---|
|
日志查看器偵聽的端口,即日志服務器將消息轉發到的端口 |
|
此日志查看器的日志記錄配置文件,例如LogPanel.xml。 |
通過LogPanel.xml,您可以進一步配置顯示端GDA對象中使用的所有/特定記錄器的消息顯示級別。
7.2.4. 默認服務器端日志記錄配置?
服務器端日志記錄配置用于對象服務器和事件服務器。
GDA有一個默認的服務器端日志記錄配置文件,位于 uk.ac.gda.core
文件中的插件 src/gda/util/logging/configurations/server-default.xml
。它目前僅用于為GDA中使用的某些第三方庫指定日志過濾器。
特定GDA配置的服務器端日志記錄配置文件可以使用 gda.server.logging.xml
財產。將首先應用默認的服務器端配置,然后應用自定義配置。
7.2.5. 默認客戶端日志記錄配置?
GDA有一個默認的客戶端日志記錄配置文件,位于 uk.ac.gda.core
文件中的插件 src/gda/util/logging/configurations/client-default.xml
它目前僅用于為GDA中使用的某些第三方庫指定日志過濾器。
特定GDA配置的客戶端日志記錄配置文件可以使用 gda.client.logging.xml
財產。將首先應用默認客戶端配置,然后應用自定義配置。
7.2.6. 在登錄配置文件中使用屬性占位符?
您可以創建在中定義的屬性 java.properties
可在Logback配置文件中使用,方法是將以下元素添加到文件頂部(在 <configuration>
元素):
<property file="${gda.config}/properties/java.properties" />
(使用 ${{gda.config}}
在這里工作是因為 gda.config
是系統屬性。)
然后,您可以在文件中的其他位置使用屬性占位符。例如:
<appender name="SOCKET" class="ch.qos.logback.classic.net.SocketAppender">
<RemoteHost>${gda.logserver.host}</RemoteHost>
<Port>${gda.logserver.port}</Port>
...
</appender>
請注意,日志記錄系統不會讀取屬性文件中提供的include語句。要處理多個屬性文件,請添加多個 <property .../>
元素。
7.3. 記錄Jython終端輸出?
可以將服務器配置為將發送到客戶端的Jython終端的所有文本記錄到當前data/access目錄中的一個文件中。為此,應該在Spring中創建一個RedirectableFileLogger,并提供一個跟蹤data/access目錄的ObservablePathProvider。當文件位置更改時,將在最后一個文件中留下一個注釋,將讀者引導到新文件,并在新文件中記錄一個注釋,指明日志是從哪里傳輸過來的。然后,可以在JythonTerminal觀察到的相同觀測對象上使用適配器。
例如,假設已經創建了一個JythonServer(始終命名為‘command_server’),請嘗試執行以下操作以獲取JythonServerFacade引用::
<bean id="jython_server_facade" class="gda.jython.JythonServerFacade">
<constructor-arg ref="command_server" />
</bean>
然后執行以下操作來構建典型的記錄器:
<bean id="terminal_logger" class="gda.jython.logger.RedirectableFileLogger">
<constructor-arg ref="terminallog_path_provider" />
</bean>
<bean class="gda.jython.logger.OutputTerminalAdapter">
<constructor-arg ref="jython_server_facade" />
<constructor-arg ref="terminal_logger"/>
</bean>
<bean class="gda.jython.logger.InputTerminalAdapter">
<constructor-arg ref="command_server" />
<constructor-arg ref="terminal_logger"/>
</bean>
<bean class="gda.jython.logger.ScanDataPointAdapter">
<constructor-arg ref="jython_server_facade" />
<constructor-arg ref="terminal_logger"/>
</bean>
<bean class="gda.jython.logger.BatonChangedAdapter">
<constructor-arg ref="jython_server_facade" />
<constructor-arg ref="terminal_logger"/>
</bean>
何處 terminallog_path_provider
Bean可能是一個啞元::
<bean id="terminallog_path_provider" class="gda.data.SimpleObservablePathProvider">
<property name="path" value="${gda.data.scan.datawriter.datadir}/gdaterminal.log" />
<property name="local" value="true" />
</bean>
或跟蹤服務器的訪問元數據::
<bean id="terminallog_path_provider" class="gda.data.ObservablePathConstructor">
<property name="template" value="${gda.data.scan.datawriter.datadir}/gdaterminal.log" />
<property name="gdaMetadata" ref="GDAMetadata" />
<property name="local" value="true" />
</bean>
注: gda.data.ObservablePathConstructor
不支持Java屬性,僅支持特定于GDA的模板。也就是說,它不會正確解釋諸如 ${{gda.data.scan.datawriter.datadir}}
。相反,您必須將此屬性的值放在上面的Spring配置中,例如 /dls/i21/data/$year$/$visit$/spool/gdaterminal.log
.
注: InputTerminalAdapter
接收鍵入的命令 all 客戶端終端(通過命令服務器)。
7.4. Java屬性和自定義GDA?
要在整個代碼庫中共享的屬性作為名稱-值對存儲在 java.properties
文件位于 config/properties
文件夾。這是定制GDA行為的常用方式。
當以與Spring或Logback XML文件相同的方式定義Java屬性時,可以使用變量插值。
以下是可能需要定制的主要Java屬性。然而,還有更多。
假定在運行服務器進程時由-D標志設置的Java屬性:
財產 |
描述 |
---|---|
|
GDA安裝的插件目錄。假定要素目錄和第三方目錄處于同一級別 |
|
配置目錄的位置。假定此目錄具有標準子結構。 |
|
頂級數據目錄。實際寫入數據文件的子目錄由 |
請注意,RCP客戶端還將依賴于 gda.config
和 gda.data
變量在其 .ini
文件。
在運行GDA Java進程時必須由-D標志設置的屬性(第三方軟件要求);這些標志由Python啟動腳本自動添加:
財產 |
描述 |
---|---|
|
|
|
用于連接到EPICS PV的JCA庫屬性文件。 |
最有可能進行自定義的屬性:
財產 |
描述 |
---|---|
|
任何日志記錄進程的全局讀寫目錄。請注意,如上所述,主日志記錄系統有其自己的配置文件。 |
|
要寫入數據文件的目錄??梢詫⑵湓O置為動態的,方法是使用 |
|
掃描寫入的數據格式 |
|
其中為RCP客戶端創建工作區。如果要允許多個RCP客戶端,則需要使用變量插值。 |
使用讀取GDA屬性文件 Commons Configuration 。有關屬性文件格式的更多信息,請參閱 Properties files 公共配置部分 .
屬性文件可以包含另一個屬性文件,方法是使用 include
指令。有關更多信息,請參閱 Includes 用戶指南中的部分。
7.5. 元數據?
7.5.1. ICAT?
ICAT子系統與數據庫(RDBMS或XML文件)對話,該數據庫將用戶ID映射到光束線和實驗。它用于找出啟動每個客戶端的用戶屬于哪些實驗,因此在該客戶端的命令下收集的掃描應該將任何數據寫入哪些位置。
如果未使用ICAT,則數據始終寫入由 gda.data.scan.datawriter.datadir
Java屬性。
不同ICAT系統的一些示例:
要始終寫入同一數據目錄,請執行以下操作:
gda.data = /scratch/data
gda.data.scan.datawriter.datadir = ${gda.data}
不使用ICAT,但要在每個不同的實驗中更改數據目錄,請執行以下操作:
gda.data = /scratch/data
gda.data.metadata.icat.type = gda.data.metadata.icat.NullIcat
gda.data.scan.datawriter.datadir = ${gda.data}/$visit$
# change this for every experiment:
gda.defVisit = myVisit
要使用ICAT根據誰正在運行接力棒(控制光束線)的GDA客戶端來動態更改輸出目錄,請執行以下操作:
gda.data = /scratch/data
gda.data.scan.datawriter.datadir = ${gda.data}/$year$/$visit$
gda.data.metadata.icat.type = gda.data.metadata.icat.DLSIcat
gda.data.metadata.icat.url = jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(HOST=${oracle.host})(PROTOCOL=tcp)(PORT=${oracle.port}))(CONNECT_DATA=(SID=xe)))
gda.data.metadata.icat.shift_tolerance = 1440
gda.data.metadata.dlsicat.user = icatusername
gda.data.metadata.dlsicat.password = icatpassword
這個 DLSIcat
類提供到ICAT數據庫的連接。類中有一個備用類。 uk.ac.gda.core
已調用插件 XMLIcat
它使用XML文件作為數據庫。這主要用于單元測試或非現場演示,但如果其他設施將數據庫轉儲為該格式,也可以使用它。
在戴蒙德,其中的劇本 /dls_sw/dasc/bin/iKittenScripts
可用于診斷ICAT的問題。例如:
getCurrentVisit
將顯示當前訪問的ID(如果有)。getFedIdsForCurrentVisit
將顯示當前訪問的用戶詳細信息。getDetailsOfVisit
將顯示有關特定訪問的信息。
7.6. 基于角色的訪問控制?
7.6.1. 概念?
RBAC系統背后的想法不是為系統提供鐵一般的安全性,而是防止用戶在錯誤的時間意外操作硬件,這可能會破壞他們的實驗。例如防止用戶移動已經調諧的光學設備或在不同分支之間共享的硬件。
7.6.1.1. 設備保護?
可以為每臺設備(等級擴展設備)分配一個保護級別(默認值為1),并為每個用戶分配一個授權級別(默認值為1,但可以將其配置為不同的值)。當表示設備的對象的某些方法被調用時,則將用戶的授權與保護級別進行比較;如果授權等于或大于保護級別,則調用該方法,否則拋出gda.jython.accesscontrol.AccessDeniedException。
GDA開發人員不必在他們的設備類中編寫任何特殊代碼來實現此訪問邏輯。但是,如果類或接口中有一個方法需要保護(例如,Motor.moveTo()),那么在Java源代碼中,您應該使用標記注釋該方法:
@!MethodAccessProtected(isProtected=true)
RBAC系統將使用反射搜索源代碼以查找此類注釋。
其想法是,某些方法將始終檢查保護,而某些方法將始終被調用,而不管用戶的授權如何(例如,所有用戶都可以詢問任何電機的位置,但可能只能控制某些電機)。
7.6.1.2. 客戶授權?
當啟動GDA客戶端時,用戶id要么從操作系統獲取,要么可能輸入不同的用戶id和密碼。如果輸入了不同的詳細信息,則會根據已配置的任何授權者(鉆石的單點登錄LDAP系統)對它們進行身份驗證。
登錄信息通過InterfaceProvider類從客戶端傳遞到命令服務器(Jython Server)??蛻舳讼蛎罘掌鬟M行唯一注冊,以便可以識別每個命令的來源。然后,命令服務器通過將客戶端使用的FedID與該光束線上的XML數據庫進行比較來確定該客戶端的授權級別。如果FedID列在XML中,則使用存儲的授權級別,否則給客戶端提供默認值。
有一個工具(gda.jython.authiser.EditPermission)可供開發人員或光束線科學家用來設置和更改授權級別。建議在XML中僅列出具有提升授權的用戶或光束線員工。
7.6.1.3. 接力棒?
在實現RBAC系統的光束線上,如果光束線可能有多個客戶端在運行,則可以選擇使用指揮棒來確定哪個客戶端控制該光束線。手持指揮棒的客戶端根據其授權級別控制光束線,而其他客戶端無論其授權級別如何,都不能操作任何硬件的受保護方法。
接力棒持有者可以釋放接力棒,這樣任何客戶都可以拿起接力棒,也可以將接力棒交給特定的客戶。
如果接力棒持有者的授權級別較低,客戶也可以從接力棒持有者手中接過接力棒。
有一個GUI面板,其中列出了光束線上的所有客戶端,并具有釋放/拿起/傳遞接力棒的控件。
7.6.2. 配置選項?
7.6.2.1. Java屬性?
要打開RBAC,請將以下元素添加到Spring配置中:
<gda:rbac />
并設置以下java屬性:
gda.accesscontrol.useAccessControl = true
要打開指揮棒控件(如果將其設置為true,則必須在Swing UI中使用BatonPanel,默認情況下,它將在SWT UI中可用):
gda.accesscontrol.useBatonControl = true
要設置默認授權級別(默認值為1),請執行以下操作:
gda.accesscontrol.defaultAuthorisationLevel = 1
要設置員工的默認授權級別(默認值為2),請執行以下操作:
gda.accesscontrol.defaultStaffAuthorisationLevel = 2
對于服務器開始自動拿起接力棒后的第一個客戶端:
gda.accesscontrol.firstClientTakesBaton = true
告訴服務器使用哪個類進行授權(該類必須實現gda.jython.authiser.gda.jython.Authiser,這主要是為了區分用戶和員工):
gda.gui.AcquisitionGUI.authorisationMethod = gda.jython.authoriser.LdapAuthoriser
常見的實現是FileAuthoriser-事實上,提供的LDAPAuthoriser實現使用FileAuthoriser來提供本地覆蓋。FileAuthoriser使用XML文件,它在${gda.user.permissions.dir}中查找該文件(如果沒有定義第一個屬性,則在${gda.config}/xml/中查找)。兩者具有相同的格式,即:
<user_permissions>
<user_id>N</user_id>
</user_permissions>
其中,user_id標識特定用戶,N是數字權限級別。文件user_permissions.xml中的條目指示存在的用戶及其設備權限。
告訴服務器使用哪個類進行身份驗證(實現gda.jython.Authenticator.Authenticator接口。如果未定義,則不會出現登錄屏幕,并且將使用操作系統身份驗證-建議這樣做):
gda.gui.AcquisitionGUI.authenticationMethod = gda.jython.authenticator.LdapAuthenticator
(對于Diamond,我們現在使用LDAP,因為cclrc LDAP服務器也可用于區分員工和用戶帳戶)
7.6.2.2. XML文件?
要將特定帳戶標識為人員,應該在配置中放置一個XML文件,該文件列出LDAP服務器之外的所有人員(非用戶)帳戶。
這是xml/beamlinestaff.xml,示例配置中有此文件的副本。
RBAC系統中員工和用戶之間的不同之處在于,員工獲得不同的默認權限級別,如果在ICAT系統中找不到該用戶ID的訪問,則使用默認訪問(由java.property定義)。如果非員工帳戶在ICAT系統中沒有關聯的訪問,則UI將不會啟動。
7.6.2.3. XML標記?
在對象服務器XML文件中的設備和DOF上:
<protectionLevel>1</protectionLevel>
保護級別必須大于0!
在客戶端XML文件中(僅限Swing UI):
<!BatonPanel>
<name>Baton Control</name>
</BatonPanel>
7.6.3. 如何在鉆石上的光束線上設置RBAC?
按照上面列出的方式設置Java屬性。
為每個要控制訪問的硬件向服務器和客戶端XML配置文件添加適當的標記。
添加
beamlinestaff.xml
文件添加到您的配置中,以列出哪些帳戶應被視為員工如果要授予某些用戶高于用戶默認級別的權限,請運行該工具為該光束線構建授權數據庫:
java -Dgda.root=/dls/ixx/software/gda -Dgda.config=/dls/ixx/software/gda/config -Dgda.propertiesFiles=/dls/ixx/software/gda/config/properties/java.properties gda.jython.authoriser.EditPermissions
重新啟動GDA!
7.7. 新配置布局?
從GDA8.10開始,支持簡化的啟動機制,允許在使用 gda
發射器。
參數 |
默認設置 |
目的 |
---|---|---|
|
|
用于區分不同類型的GDA對象服務器或客戶端 |
|
|
允許配置的不同變體;例如,連接到真實硬件的“實時”模式,或使用虛擬設備的“虛擬”模式 |
要允許使用這些參數,配置必須使用新的目錄布局。以下所有目錄必須位于配置目錄的頂層:
號碼簿 |
目的 |
---|---|
|
包含與客戶端相關的XML配置文件 |
|
包含 |
|
包含 |
|
包含與服務器相關的XML配置文件 |
然后將自動確定以下設置,并且在運行時不需要指定這些設置 gda
啟動器:
設置 |
價值 |
---|---|
屬性文件 |
|
JacORB配置目錄 |
|
JCA配置文件 |
|
服務器XML文件 |
|
客戶端XML文件 |
|
關于新布局的注釋:
這個
properties
目錄必須包含每種模式的子目錄(例如dummy
和live
);每個子目錄必須包含java.properties
文件。這個
jacorb
目錄必須包含每種模式的子目錄;每個子目錄必須包含etc
JacORB所需的目錄(依次包含jacorb.properties
)這個
jca
目錄必須包含每種模式的子目錄;每個子目錄必須包含JCALibrary.properties
文件。中必須存在的唯一文件
servers
和clients
子目錄為<profile>/<mode>/server.xml
和<profile>/<mode>/client.xml
分別為。其他文件可以放在下面的任何級別servers
和clients
根據需要。
7.7.1. 對象服務器啟動文件?
啟動對象服務器或創建objectServerImpl的任何客戶端或服務器都將創建啟動文件。如果使用帶有配置文件名稱的新配置布局,則此文件的名稱不同。
<xmlfile>
是用于啟動客戶端或服務器的XML文件的基本名稱(不含路徑或后綴<initialisationCompleteFolder>
在Java屬性中定義gda.objectserver.initialisationCompleteFolder
,它指定創建此文件的位置。
布局格式 |
啟動文件名 |
---|---|
舊的 |
|
配置文件的新功能 |
|
7.8. 內存配置?
在GDA的最新版本中,默認的Java內存選項已不足以滿足RCP GDA客戶端的可靠操作。在此期間, gdaclient
腳本在 example-config
設置通用堆的起始大小和最大大?。?/p>
-Xms256m
-Xmx1024m
它不設置單獨的起始值或最大值 永久發電 堆大?。?/p>
-XX:PermSize=128m
-XX:MaxPermSize=256m
如果沒有至少一個 -XX:MaxPermSize
選項,比示例更復雜的RCP GDA客戶端可能很快就會耗盡 PermGen 空間和墜毀,幾乎沒有留下為什么它會墜毀的證據。
7.8.1. JVM選項?
有四個主要選項可以控制JVM垃圾收集器的行為:
參數和默認設置 |
目的 |
---|---|
|
永久生成堆的默認起始大小。 |
|
永久生成堆的默認最大大小。 |
|
JVM堆的默認起始大小。 |
|
JVM堆的默認最大大小。 |
此外,還有一些選項可以幫助監視JVM垃圾收集器并更改其行為。
參數 |
目的 |
---|---|
|
請求JVM打印每個垃圾收集的詳細信息。 |
|
導致打印附加信息。 |
|
將在每個集合的開始處添加時間戳 |
|
打印有關每個垃圾收集的更多信息。 |
|
JVM忽略的請求 |
|
使用不同的GC機制 |
7.8.2. JVM默認值?
可以使用以下命令查看當前的系統默認值:
$ java -server -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize'
uintx AdaptivePermSizeWeight = 20 {product}
uintx ErgoHeapSizeLimit = 0 {product}
uintx InitialHeapSize := 66328512 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 1063256064 {product}
uintx MaxPermSize = 67108864 {pd product}
uintx PermSize = 16777216 {pd product}
如果我們添加建議的內存配置選項,我們可以看到這些選項具有的效果:
$ java -server -Xms256m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m \
> -XX:+PrintFlagsFinal -version 2>&1 | grep -i -E 'heapsize|permsize'
uintx AdaptivePermSizeWeight = 20 {product}
uintx ErgoHeapSizeLimit = 0 {product}
uintx InitialHeapSize := 268435456 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 1073741824 {product}
uintx MaxPermSize := 268435456 {pd product}
uintx PermSize := 134217728 {pd product}
注意:如果以上命令沒有輸出或輸出減少,請嘗試添加參數:
-XX:+UnlockDiagnosticVMOptions
7.8.3. 優化起始值和最大值?
JVM允許您指定不同的起始值和最大值,以便優化應用程序中的內存使用。
選項 -Xms256m -Xmx1024m
請說:
首先為該應用程序的堆分配256MB的內存,但是如果應用程序需要的話,允許堆增長到1 GB。
如果應用程序所需的內存增加到256MB以上,那么JVM將從操作系統請求更多內存并調整應用程序堆的大小。如果應用程序所需的內存增加到1 GB以上,則最終應用程序將崩潰,并顯示 java.lang.OutOfMemoryError
例外。
遺憾的是,每次JVM增加堆的大小時,都需要時間來管理擴展。如果gda客戶端在啟動過程中分配了400MB的內存,它將從256MB開始,當它超過這個大小時會增加一個小擋路,當它超過這個新的限制時會再增加一點,并不斷增加大小,直到它不再需要增加堆為止。這些堆擴展中的每一個都會增加啟動GDA客戶端的時間。
要獲得最佳結果,最好使用 jvisualvm
要分析GDA客戶端通常需要多少內存,然后添加更多內存以供將來擴展。
例如,如果客戶端僅分配400MB用于啟動,在幾次基本掃描后上升到480MB,但在密集使用期間上升到1.6 GB,則 -Xms512m -Xmx2g
可能是個不錯的起點。
同樣的道理也適用于 永久發電 空間。
例如,如果 jvisualvm
顯示客戶端在使用Scan透視圖啟動時使用60MB,在打開PyDev腳本透視圖后上升到90MB,并在長時間會話期間達到150MB的峰值,然后 --XX:PermSize=96m -XX:MaxPermSize=192m
可能就足夠了。
7.8.4. 內存不足異常?
大多數內存不足異常都是JVM耗盡通用堆空間的簡單問題,通??梢酝ㄟ^增加 -Xmx
價值。
當堆空間用完時,錯誤形式為:
java.lang.OutOfMemoryError: Java heap space
不過,其他內存不足異常比較模糊。
在java6中,垃圾回收器將生成內存不足異常。 如果總時間的98%以上花在垃圾收集上,而回收的堆不到2% 。這可能表示您在已經內存受限的JVM中創建了過多的臨時對象。只需給JVM更多的堆空間就可以解決這個問題,但這也可能表明存在其他問題。
當垃圾收集接管您的應用程序時,錯誤形式為:
java.lang.OutOfMemoryError: GC overhead limit exceeded
當你用完的時候 PermGen 空格中,錯誤可能發生在隨機線程中,因此表單的任何錯誤:
java.lang.OutOfMemoryError: PermGen space
是一種跡象,表明 -XX:MaxPermSize=
可能需要增加。
由于MaxPermSize太低而導致的錯誤示例,記錄在 gda_output
日志文件為:
Logging exception:
java.lang.OutOfMemoryError: PermGen space
Exception in thread "jReality ToolSystem EventQueue" java.lang.OutOfMemoryError: PermGen space
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: PermGen space
最后,在32位RHEL機器上,當您將permgen空間和堆的總容量增加到2.6 GB左右時,似乎也會出現問題。
在一次測試中,使用 -Xmx2048m -XX:MaxPermSize=768m
,則JVM拒絕加載客戶端。這可以通過以下命令顯示:
$ java -Xmx2048m -XX:MaxPermSize=768m -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
用 -Xmx2048m -XX:MaxPermSize=640m
,JVM允許加載RCP GDA客戶端,但是在300到1000秒內,客戶端將崩潰,并在Java運行時出現致命錯誤:
# A fatal error has been detected by the Java Runtime Environment:
#
# java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate. Out of swap space?
#
# Internal Error (allocation.cpp:166), pid=6265, tid=69073808
# Error: ChunkPool::allocate
#
# JRE version: 6.0_24-b07
# Java VM: Java HotSpot(TM) Client VM (19.1-b02 mixed mode linux-x86 )
# An error report file with more information is saved as:
# /home/gfn74536/hs_err_pid6265.log
這是一個內部錯誤,而不是異常,因此無法捕獲或處理,而且似乎是JIT編譯器本身內存不足,即使有足夠的堆和PermGen空間也是如此。
尚未研究Windows 32位JVM和Windows或Linux 64位JVM的限制。
7.8.5. 由于垃圾收集而暫停?
如果您的GDA客戶端經常出現明顯的暫停,您可能需要嘗試添加以下選項:
-verbose:gc
這將記錄每次垃圾收集前后堆的詳細信息,以及收集所用的時間。由于JVM同時執行這兩種功能 少數的 和 full 對于集合,有些只需要很短的時間就可以完成,而另一些則可能需要幾秒鐘才能完成。
可以使用更多選項來在每次垃圾收集時提供更多信息。
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
雖然使用 System.gc()
不鼓勵調用,GDA軟件的某些部分仍在使用它。作為 System.gc()
強制立即顯式完全垃圾回收,則每次調用都可能導致RCP GDA客戶端暫停一秒以上。
如果顯式垃圾收集導致了問題,您可以指示JVM忽略對 System.gc()
通過使用選項:
-XX:DisableExplicitGC
另一種選擇 1 在Java 6中引入,似乎提供了介于完全顯式垃圾收集和無垃圾收集之間的折中方案:
-XX:+ExplicitGCInvokesConcurrent
此選項使用 并發標記掃描收集器 其目的是使垃圾收集引起的暫停保持較短時間。這還沒有經過測試,但可能值得研究一下禁用顯式垃圾收集和啟用它是否都會導致問題。