(1)用一个服务器运行一个Lmgrd(License文件的后台管理程序)和多个License文件;
(2)用一个服务器运行多个Lmgrd和License文件;
(3)运用多个服务器节点,每个服务器运行单独的Lmgrd和License文件。
第一种选择主要造用于高版本的Lmgrd,V6之前和FLEXlm,每个Lmgrd只能管理一个License文件;
第二种选择,将使用一台服务器,但需要运行多个Lmgrd第三种选择,必须使用多个License服务器。
一、服务器端设定
1.License文件的设定
在使用FLEXlm进行管理的License文件中一般有SERVER行,它通过SERVER行的hostname和hostID定义License服务器。
SERVER this_host 0050BB0F402 27000
hostname hostID post
2.服务颂丛闷方式的选择
(1)一个服务器运行一个Lmgrd和多个License文件如果多个License文件具有相同的hostID,则可以通过修改hostname进行合并。合并时,首先将多个License文件加到一个文件中,然后修改SERVER行,并且只保留一个SERVER行。对于Windows NT *** 作系统,应在各License的默认位置保存一个合并后的备份,这样每个软件将在其默认位置找到License信息,从而避免了对 LM_LICENSE_FILE的设定;对于UNIX *** 作系统,可以建立一个默认位置到License存放位置和Link。合并后的License文件,就可以使用同一个Lmgrd。
(2)一个服务器运行一个Lmgrd和一个别License文件如果HostID不一样,则这些License服务只能运行于不同的服务器节点上,并且License不能合并。可以选择使用一个服务器运行一个Lmgrd和License文件。
(3)一个服务器运行多个Lmgrd和License文件郑逗如果多个License未进行合并,可以通过在同一台机器上启动多个Lmgrd,每个 Lmgrd管理一个License文件。使用多个Lmgrd管理多个License文件对服务器的性能并没有明显影响。如果License是由不同版本的 FLEXlm产生的,一般是新版本可以管理旧版本的License文件。所以应使用最新的Lmgrd和Vendor daemon。另外,当用一个服务器的多个Lmgrd管理多个License文件时,应该注意任何二个License文件的post都不能一样,并且对于每个License而言,应选用合造的Lmgrd。
二、客户端设定
当使用客户端应用程序时(a Licensedapplication),可以通过在系统的环境变量中设定LM_LICENSE_FILE,使Application能够指向不同服务器上的License文件。如果要使a Licensed application使用不同服务器都有单独的一个License文件),客户端应将需要用到的License文件拷贝到本机目录下,并指定LM_LICENSE_FILE环境变量。UNIX: %setenv LM_LICENSE_FILE lfpath1 : lfpath2 :…… : lfpathN Windows: lfpath1 lfpath2:…… lfpathN LfpathN为第N个License的路径;UNIX下路径间用":"隔开;Windows/NT下路径间使用";"隔开;
这样,每个Licensed aplication在启动时将依次查询LM_LICENSE_FILE中野弯所指定的License文件,并向相应的License服务器申请许可,以使用户能从所列的服务器得到许可。LM_LICENSE_FILE也可以使用各License文件中所指定的"post@hostname"。下面以Windows NT为例介绍多个FLEXlm的安装。
三、同一机器上多个FLEXlm License Server的安装
(1) 以Administrator身分登录;
(2)在C盘建C:\\FLEXlm目录,并拷贝相关文件到其下;
(3)在C:\\FLEXlm下建立欲安装License Server的软件目录,放置各软件的License文件,Daemon和Daemon所需的动态连接库;
(4)修改License.dat和SERVER行和DAEMON的位置,并启动FLEXlm License Manager。
(5)在Setup修改Service Name,输入造当名称,以区别是何种License服务;利用Browse选择合适Lmgrd.exe和对应和License.dat并指定Debug.log和放置路径;
(6)选中"StartServer at Power-Up"与"Use NT Services",这样下次启动机器时,将自动启动该Li-cense服务;
(7)点击Control按钮检查Service Name是否与设定名称相同,如果不同,回到"Setup"重新选择Service Name如果一样,点击"Start"启动该Li-cense Server点击"Status"检查Licevse Server启动情况,若出现Server_name: License server UP (MASTER),表示License Server启动成功;
(8)安装另外的License Server:可依上述(3)~(7)重新执行一次即可;
(9)切换不同License Server:在"Setup"中选择适当的"Service Name",然后启动或停止相应的License服务;
(10)移除License Server:在"Setup"选择适当的"Service Name",然后按"Remove"即可。
题目信息:命令行参数解析计算正方形周长、面积import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--length', default = 10, type = float, help = '正方形边长')
args = parser.parse_args()
area = args.length * args.length
girth = 4 * args.length
print('面积 = ',area, '周长 = ', girth)
测试结果:
PS D:\CodeProject\PyCharm\work1\lab6>python 6-1.py --length 3.2
面积 = 10.240000000000002 周长 = 12.8
# 作者:JohnRothan
# 时间:2022-4-21
# 题目信息:命令行参数确认文件,读取并输出
import sys
filename = sys.argv[1]
f = open(filename, 'r', encoding = 'utf-8')
line_no = 0
while True:
line_no += 1
line = f.readline()
if line:
print(line_no, ":", line)
else:
break
f.close()
测试结果禅誉:
PS D:\CodeProject\PyCharm\work1\lab6>python 6-1.py C:\\Users\\JohnRothan\\Desktop\\test.txt
1 : Hello,World!
2 :Today is Friday.
3 : Let's do amazing things!
# 作者:JohnRothan
# 时间:2022-4-21
# 题目信息:命令行参数确认文件,with语句读取并输出
import sys
filename = sys.argv[1]
line_no = 0
with open(filename, 'r', encoding = 'utf-8') as f:
for line in f:
line_no += 1
print(line_no, ":", line)
f.close()
测试结果:
PS D:\CodeProject\PyCharm\work1\lab6>python 6-1.py C:\\Users\\JohnRothan\\Desktop\\test.txt
1 : Hello,World!
2 :Today is Friday.
3 : Let's do amazing things!
# 作者:JohnRothan
# 时间:2022-4-21
# 题目信息:利用with语句读取并输出文本文件,由命令行确认文件名
import sys
n = int(sys.argv[1])
power = 1
i = 0
f = open('D:\\CodeProject\皮袭森\flex\\log.txt', 'w')
sys.stdout = f
while i <= n:
double = i * 2
print(str(i), '', str(double), '', str(power))
power = 2 * power
i = i + 1
sys.stdout = sys.__stdout__
print('done!')
测试结果:
0 0 1
1 2 2
2 4 4
3 6 8
4 8 16
5 10 32
#7.7 上机实践-错误和异常
# 作燃亩者:JohnRothan
# 时间:2022-4-21
# 题目信息:语法错误
print("Good Luck!"
print("幸运数:",random.choice(range(10)))
测试结果:
File "D:\CodeProject\PyCharm\work1\lab6\6-1.py", line 6
print("幸运数:",random.choice(range(10)))
^
SyntaxError: invalid syntax
错误处理:
print("Good Luck!")
# 作者:JohnRothan
# 时间:2022-4-21
# 题目信息:运行时错误
print("Good Luck!")
print("幸运数:",random.choice(range(10)))
测试结果:
Traceback (most recent call last):
File "D:\CodeProject\PyCharm\work1\lab6\6-1.py", line 6, in <module>
print("幸运数:",random.choice(range(10)))
NameError: name 'random' is not defined
错误处理:
import random
# 作者:JohnRothan
# 时间:2022-4-21
# 题目信息:零除错误
a = 1
b = 0
c = a / b
测试结果:
Traceback (most recent call last):
File "D:\CodeProject\PyCharm\work1\lab6\6-1.py", line 7, in <module>
c = a / b
ZeroDivisionError: division by zero
错误处理:
除数不能为0
# 作者:JohnRothan
# 时间:2022-4-21
# 题目信息:逻辑错误
import math
a = 1b = 2c = 1
x1 = -b + math.sqrt(b*b - 4*a*c) / 2 * a
x2 = -b - math.sqrt(b*b - 4*a*c) / 2 * a
print(x1,x2)
测试结果:
-2.0 -2.0
错误处理:
一元二次方程计算公式错误,应修改为:
x1 = (-b + math.sqrt(b*b - 4*a*c)) / (2 * a)
x2 = (-b - math.sqrt(b*b - 4*a*c)) / (2 * a)
# 作者:JohnRothan
# 时间:2022-4-21
# 题目信息:常见异常
noname
测试结果:变量未声明
Traceback (most recent call last):
File "D:\CodeProject\PyCharm\work1\lab6\6-1.py", line 5, in <module>
noname
NameError: name 'noname' is not defined
int a
测试结果:语法错误
File "D:\CodeProject\PyCharm\work1\lab6\6-1.py", line 5
int a
^
SyntaxError: invalid syntax
a = 1
a.show()
测试结果:show()函数未定义
Traceback (most recent call last):
File "D:\CodeProject\PyCharm\work1\lab6\6-1.py", line 6, in <module>
a.show()
AttributeError: 'int' object has no attribute 'show'
11 + 'abc'
测试结果:类型错误
Traceback (most recent call last):
File "D:\CodeProject\PyCharm\work1\lab6\6-1.py", line 5, in <module>
11 + 'abc'
TypeError: unsupported operand type(s) for +: 'int' and 'str'
int('abc')
测试结果:数值错误
Traceback (most recent call last):
File "D:\CodeProject\PyCharm\work1\lab6\6-1.py", line 5, in <module>
int('abc')
ValueError: invalid literal for int() with base 10: 'abc'
1 / 0
测试结果:零除错误
Traceback (most recent call last):
File "D:\CodeProject\PyCharm\work1\lab6\6-1.py", line 5, in <module>
1 / 0
ZeroDivisionError: division by zero
a = [10,11,12]
a[3]
测试结果:索引越界
Traceback (most recent call last):
File "D:\CodeProject\PyCharm\work1\lab6\6-1.py", line 6, in <module>
a[3]
IndexError: list index out of range
m = {'1' : 'yes', '2' : 'no'}
m['3']
测试结果:字典关键字不存在
Traceback (most recent call last):
File "D:\CodeProject\PyCharm\work1\lab6\6-1.py", line 6, in <module>
m['3']
KeyError: '3'
# 作者:JohnRothan
# 时间:2022-4-21
# 题目信息:引发异常
a = input()
if a <0: raise ValueError("不能为负!")
测试结果:
-2
Traceback (most recent call last):
File "D:\CodeProject\PyCharm\work1\lab6\6-1.py", line 5, in <module>
if a <0: raise ValueError("不能为负!")
TypeError: '<' not supported between instances of 'str' and 'int'
# 作者:JohnRothan
# 时间:2022-4-21
# 题目信息:try-except-else-finally处理捕获异常
try:
f = open("test.txt", 'w')
f.write("测试文件")
f1 = open('test1.txt', 'r')
except IOError:
print("没有找到文件")
else:
print("写入成功")
finally:
f.close()
测试结果:
没有找到文件
# 作者:JohnRothan
# 时间:2022-4-21
# 题目信息:处理异常
try:
f = open('mytxt.txt', 'w')
while True:
s = input("请输入字符串(Q键结束):")
if s.upper() == 'Q' : break
f.write(s + '\n')
except KeyboardInterrupt:
print('程序中断!(Ctrl-C)')
finally:
f.close()
测试结果:
请输入字符串(Q键结束):cava
请输入字符串(Q键结束):dcav
请输入字符串(Q键结束):fe
请输入字符串(Q键结束):4
请输入字符串(Q键结束):Q
# 作者:JohnRothan
# 时间:2022-4-21
# 题目信息:自定义异常类
class NumberError(Exception): #自定义异常类,继承于Exception
def __init__(self,data):
Exception.__init__(self, data)
self.data = data
def __str__(self):#重载__str__方法
return self.data + ': 非法数值(<0)'
def total(data):
total = 0
for i in data:
if i <0: raise NumberError(str(i))
total += i
return total
#测试代码
data1 = (44, 78, 90, 80, 55)
print('总计=', total(data1))
data2 = (44, 78, 90, -80, 55)
print('总计=', total(data2))
测试结果:
Traceback (most recent call last):
File "D:\CodeProject\PyCharm\work1\lab6\6-1.py", line 21, in <module>
print('总计=', total(data2))
File "D:\CodeProject\PyCharm\work1\lab6\6-1.py", line 14, in total
if i <0: raise NumberError(str(i))
__main__.NumberError: -80: 非法数值(<0)
总计= 347
# 作者:JohnRothan
# 时间:2022-4-21
# 题目信息:断言
a = int(input("请输入整数a:"))
b = int(input("请输入整数b:"))
assert b != 0, '除数不能为0'
c = a / b
print(a, '/', b, '=', c)
测试结果:
请输入整数a:1
请输入整数b:0
Traceback (most recent call last):
File "D:\CodeProject\PyCharm\work1\lab6\6-1.py", line 7, in <module>
assert b != 0, '除数不能为0'
AssertionError: 除数不能为0
# 作者:JohnRothan
# 时间:2022-4-21
# 题目信息:输出信息跟踪逻辑错误调试:命令行参数分解为素数之积
import sys
n = int(sys.argv[1])
result=[]
factor = 2
while factor*factor <= n:
while (n % factor) == 0:
n //= factor
result.append(factor)
print(n, factor)
factor += 1
if n >1:
result.append(n)
print(result)
测试结果:
PS D:\CodeProject\PyCharm\work1\lab6>python 6-1.py 1364
682 2
341 2
31 11
[2, 2, 11, 31]
# 作者:JohnRothan
# 时间:2022-4-21
# 题目信息:默认配置直接输出
import logging
logging.debug("调试信息") #不会输出
logging.info("一般信息")
logging.warning("警告信息")
logging.error("错误信息")
logging.critical("严重错误")
测试结果:
WARNING:root:警告信息
ERROR:root:错误信息
CRITICAL:root:严重错误
# 作者:JohnRothan
# 时间:2022-4-22
# 题目信息:basicConfig配置输出日志到控制台
import logging
#配置logging
logging.basicConfig(level = logging.INFO
,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
#输出日志信息
logging.debug("调试信息") #不会输出
logging.info("一般信息")
logging.warning("警告信息")
logging.error("错误信息")
logging.critical("严重错误")
测试结果:
2022-04-22 10:16:14,345 - root - INFO - 一般信息
2022-04-22 10:16:14,345 - root - WARNING - 警告信息
2022-04-22 10:16:14,345 - root - ERROR - 错误信息
2022-04-22 10:16:14,345 - root - CRITICAL - 严重错误
# 作者:JohnRothan
# 时间:2022-4-21
# 题目信息:basicConfig配置输出日志到文件和控制台
import logging
#配置logging
logger = logging.getLogger(__name__)
logger.setLevel(level=logging.DEBUG)
handler = logging.FileHandler("logging_console_file.txt")
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
console = logging.StreamHandler()
console.setLevel(logging.ERROR)
logger.addHandler(handler)
logger.addHandler(console)
#输出日志信息
logger.debug("调试信息")
logger.info("一般信息")
logger.warning("警告信息")
logger.error("错误信息")
logger.critical("严重错误")
测试结果:
控制台:
错误信息
严重错误
文件:
2022-04-22 10:18:41,783 - __main__ - DEBUG - 调试信息
2022-04-22 10:18:41,783 - __main__ - INFO - 一般信息
2022-04-22 10:18:41,783 - __main__ - WARNING - 警告信息
2022-04-22 10:18:41,783 - __main__ - ERROR - 错误信息
2022-04-22 10:18:41,783 - __main__ - CRITICAL - 严重错误
基于blazeDS的flex4与spring的程序实例步骤环境:
jdk1.6
j2ee1.5
spring2.5.6
blazeDS3.3
tomcat6.0
flex4
myeclipse8.5
flashBuilder4
步骤:
一、 启动好blazeDS(即启动tomcat,在[tomcat]/webapps目录下产生一个blazeds文件夹(三个war包产生一个blazeds文件夹));
在myeclipse8.5新建一个web Project工程,工程名为webSpring;
把此工程加入blazeDS支持(即用blazeds下的WEB-INF文件夹替换掉web工程下简圆的WEB-INF文件夹);
加入spring支持(把spring相关的jar包拷贝到webSpring/WebRoot/WEB-INF/lib目录下即可)。
二、 1. 在javaWeb工程webSpring的str目录下薯裂分别新建一下两个包:
cn.xuediit.myFactory、cn.xuediit.myService;
2. 在cn.xuediit.myFctory包下新建两个类:FlexFactoryImpl.java和SpringFactoryInstance.java
(1). FlexFactoryImpl.java:
package cn.xuediit.myFactory
import org.apache.commons.logging.Log
import org.apache.commons.logging.LogFactory
import flex.messaging.FactoryInstance
import flex.messaging.FlexFactory
import flex.messaging.config.ConfigMap
public class FlexFactoryImpl implements FlexFactory {
private Log log = LogFactory.getLog(getClass())
/*override interface method*/
public void initialize(String id, ConfigMap configMap) {
System.out.println("1---flex工厂实现类重数咐闭写的方法initialize")
}
/*override interface method*/
public FactoryInstance createFactoryInstance(String id, ConfigMap properties) {
System.out.println("2---flex工厂实现类重写的方法createFactoryInstance")
log.info("Create FactoryInstance.")
SpringFactoryInstance instance = new SpringFactoryInstance(this, id, properties)
instance.setSource(properties.getPropertyAsString(SOURCE, instance.getId()))
return instance
}
/*override interface method*/
public Object lookup(FactoryInstance instanceInfo) {
System.out.println("4---flex工厂实现类重写的方法lookup")
log.info("Lookup service object.")
return instanceInfo.lookup()
}
}
(2).SpringFactoryInstance.java
package cn.xuediit.myFactory
import org.apache.commons.logging.Log
import org.apache.commons.logging.LogFactory
import org.springframework.beans.BeansException
import org.springframework.beans.factory.NoSuchBeanDefinitionException
import org.springframework.context.ApplicationContext
import org.springframework.web.context.support.WebApplicationContextUtils
import flex.messaging.FactoryInstance
import flex.messaging.FlexContext
import flex.messaging.FlexFactory
import flex.messaging.config.ConfigMap
import flex.messaging.services.ServiceException
public class SpringFactoryInstance extends FactoryInstance {
private Log log = LogFactory.getLog(getClass())
SpringFactoryInstance(FlexFactory factory, String id, ConfigMap properties) {
super(factory, id, properties)
}
public Object lookup() {
System.out.println("3---spring工厂类的方法lookup")
ApplicationContext appContext = WebApplicationContextUtils.getRequiredWebApplicationContext(FlexContext.getServletConfig().getServletContext())
String beanName = getSource()
try {
log.info("Lookup bean from Spring ApplicationContext: " + beanName)
return appContext.getBean(beanName)
} catch (NoSuchBeanDefinitionException nex) {
ServiceException e = new ServiceException()
String msg = "Spring service named '" + beanName + "' does not exist."
e.setMessage(msg)
e.setRootCause(nex)
e.setDetails(msg)
e.setCode("Server.Processing")
throw e
} catch (BeansException bex) {
ServiceException e = new ServiceException()
String msg = "Unable to create Spring service named '" + beanName + "'."
e.setMessage(msg)
e.setRootCause(bex)
e.setDetails(msg)
e.setCode("Server.Processing")
throw e
} catch (Exception ex) {
ServiceException e = new ServiceException()
String msg = "Unexpected exception when trying to create Spring service named '" + beanName + "'."
e.setMessage(msg)
e.setRootCause(ex)
e.setDetails(msg)
e.setCode("Server.Processing")
throw e
}
}
}
3. 在cn.xuediit.myService包下新建两个类:FService.java和FServicesImpl.java
(1). FService.java
package cn.xuediit.myService
public interface FService {
public String sayHello(String name)
}
(2). FServicesImpl.java
package cn.xuediit.myService
public class FServicesImpl implements FService {
public String sayHello(String name) {
System.out.println("5---服务层实现类(本质上的与flex交互的类)")
return "我是服务层的服务实现类==" + name
}
}
三、 1、 在javaWeb工程webSpring下,在文件webSpring/WebRoot/WEB-INF/web.xml的<web-app>标签下添加子节点:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
2、 在javaWeb工程webSpring下,在webSpring/WebRoot/WEB-INF目录下新建一个文件:applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="fServiceImplBeanID" class="cn.xuediit.myService.FServicesImpl"></bean>
</beans>
四、 1、 在javaWeb工程webSpring下,在WebRoot/WEB-INF/flex/remoting-config.xml文件中的<service>标签下添加:
<destination id="destinationID">
<properties>
<factory>flexFactoryImplID</factory>
<source>fServiceImplBeanID</source>
<scope>application</scope>
</properties>
</destination>
2、 在javaWeb工程webSpring下,在WebRoot/WEB-INF/flex/services-config.xml文件中的<services-config>标签下添加:
<factories>
<factory id="flexFactoryImplID" class="cn.xuediit.myFactory.FlexFactoryImpl"/>
</factories>
五、 给此javaWeb工程添加tomcat支持,启动tomcat(这个容易就不说了)。
六、 在flashBuilder下新建一个基于blazeDS的flex项目(以webSpring为后台工程),工程名为webFb;
webFb.mxml:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo"
minWidth="500" minHeight="200">
<fx:Script>
<![CDATA[
import mx.core.Application
import mx.rpc.events.FaultEvent
import mx.collections.ArrayCollection
import mx.rpc.remoting.mxml.RemoteObject
import mx.controls.Alert
import mx.rpc.events.ResultEvent
public function submit(name:String):void{
var remote:RemoteObject = new RemoteObject()
remote.destination = "destinationID"
remote.endpoint = "http://localhost:8080/webSpring/messagebroker/amf"
remote.addEventListener(ResultEvent.RESULT, myResult)
remote.addEventListener(FaultEvent.FAULT,fault)
remote.sayHello(name)
}
private function myResult(evt:ResultEvent):void{
Alert.show(evt.result.toString())
}
private function fault(evt:FaultEvent):void{
Alert.show(evt.fault.message)
}
]]>
</fx:Script>
<s:Button x="240" y="11" label="要发送到" click="submit(nameTxt.text)"/>
<s:Label x="16" y="11" text="姓名"/>
<s:TextInput id="nameTxt" x="100" y="100"/>
</s:Application>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)