2 部署FAQ
1 Linux部署问题
1.1 Linux下没有配置X11图形选项导致出错
没有配置Headless属性在linux环境下会报错,错误如下:
Could not initialize class sun.awt.X11GraphicsEnvironment
详细错误:
java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:169) java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:68)
java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1135)
com.neusoft.report.engine.export.util.CellShapeAdjuster.<init>(Unknown Source)
com.neusoft.report.engine.export.split.SplitterHelper.getCellHeight(Unknown Source)
com.neusoft.report.engine.export.split.SplitterHelper.getScaleHeight(Unknown Source)
com.neusoft.report.engine.export.split.SplitterHelper.getRowInfo(Unknown Source)
com.neusoft.report.engine.export.split.LinageSplitter.split(Unknown Source)
com.neusoft.report.engine.export.html.HtmlExporter.makePage(Unknown Source)
com.neusoft.report.engine.export.html.HtmlExporter.buildHtml(Unknown Source)
com.neusoft.report.engine.export.html.HtmlExporter.export(Unknown Source)
com.neusoft.report.engine.core.NeuReport.exportToHtml(Unknown Source)
com.neusoft.report.server.util.ReportCreate.exportHtmlResult(Unknown Source)
com.neusoft.report.server.util.ReportCreate.generateRealTimeReport(Unknown Source)
com.neusoft.report.server.util.ReportCreate.generateReport(Unknown Source)
com.neusoft.report.server.view.ReportAction.generateReport(Unknown Source)
com.neusoft.report.server.view.EntryReportAction.execute(Unknown Source)
错误原因:由于Linux环境下图形处理都需要X Server服务,如果Linux上没有安装图形模块,则没有X Server服务;另外一方面,即使有X Server服务,在Linux系统内存不够的时候,也会出现此错误。
解决方法:使用JDK自带的图形处理服务。
具体做法如下:
不同的应用服务器需要配置不同的文件。
1.Tomcat
编辑bin\catalina.sh,在JAVA_OPTS中加上 -Djava.awt.headless=true。
2.weblogic
编辑startWebLogic.sh,加入参数JAVA_OPTIONS=-Djava.awt.headless=true。
3.websphere
进入websphere的console控制台->应用服务器->server1->java与进程管理->进程定义->java虚拟机->通用 JVM 参数
添加 -Djava.awt.headless=true
1.2 Linux服务器上报表打印单元格行高不正确
如图所示的打印结果,在Linux环境下(左侧)的打印结果,比正常(右侧)的单元格行高偏高。
这个现象是服务器端字体问题在特定报表中体现的结果。服务端Linux上缺少报表定义中使用的对应Windows字体,导出报表时,服务器按照固定的默认字体(family)进行单元格内容宽高(包括文字折行)等计算,而客户端通常在Windows下包含定义时指定的字体,在打印时会使用定义中的字体大小进行打印,最终导致单元格高度与实际打印文字大小不匹配。
解决该问题,需要将报表所需字体放置到Linux服务器的字体目录(默认系统配置为/usr/share/fonts/)下。
经测试,该方法在Sun(Oracle) JVM 1.6、Oracle JRocket JVM 1.6、IBM JVM 1.6下字体高度参数均可保证正确一致,而Open JDK 1.6下字体高度参数与宽度较其他JVM会有差异。因此如果服务端使用OpenJDK,还需要调整报表定义。(测试使用Windows 7 SP1内置5.03版TrueType宋体simsun.ttc)
1.3 Linux下“Too many open files”问题解决办法
系统运行的时候会创建并打开一定数量的实例缓存文件(默认的最大缓存数为1000),如果系统中同时运行的其他程序也打开一些文件,就有可能超出系统同时打开文件数的限制,此时就会出现“Too many open files”错误。这个错误有可能由UniEAP Report引起,也有可能由其他程序引起。
1.3.1 调整操作系统设置
Linux操作系统在系统和用户两个级别对最大打开文件数进行了限制。
系统级设置
系统级设置对所有用户有效。可以通过两种方式查看系统最大文件数限制:
- cat /proc/sys/fs/file-max。
sysctl –a,查看结果中fs.file-max项的值。
如果需要增加配置数量,就修改/etc/sysctl.conf文件,配置fs.file-max属性,如果该属性不存在则添加。
配置完成后要使用sysctl –p命令使配置生效。
用户级设置:
Linux限制每个登录用户的可连接文件数。可通过 ulimit -n来查看当前有效设置。如果想修改这个值就使用 ulimit -n
对于文件描述符增加的比例,资料推荐是以2的幂次为参考。如当前文件描述符数量是1024,可增加到2048,如果不够,可设置到4096,依此类推。
1.3.2 调整WebLogic设置
WebLogic中也有对于最大打开文件数的配置,如果是使用WebLogic部署服务,则还需要设置${SERVER_DIR}/common/bin/commEnv.sh文件中的值,如:ulimit –n 4096。${SERVER_DIR}为WebLogic的安装目录。
1.4 Weblogic12c部署报表启动调度器出错
- 启动调度器出错:仅可以为插入 LONG 列的 LONG 值赋值
####<2016-5-14 下午02时25分37秒 CST> <Error> <HTTP> <admin-PC> <AdminServer> <[ACTIVE] ExecuteThread: '11' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <81958bd5-e2c7-430b-a175-314ce6280caa-00000013> <1463207137129> <[severity-value: 8] [rid: 0] [partition-id: 0] [partition-name: DOMAIN] > <BEA-101216> <Servlet: "configSchedular" failed to preload on startup in Web application: "report.war".
com.neusoft.unieap.newscheduler.NewSchedulerException: (13112)启动调度器出错:;Failure occured during job recovery.;Couldn't recover jobs: ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值
;ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值
;(13112)启动调度器出错:;Failure occured during job recovery.;Couldn't recover jobs: ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值
;ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值
at com.neusoft.unieap.newscheduler.server.ConfigSchedular.init(ConfigSchedular.java:84)
at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:343)
at weblogic.servlet.internal.StubSecurityHelper$ServletInitAction.run(StubSecurityHelper.java:294)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:326)
at weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:196)
at weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203)
在tomcat下可以运行,在weblogic下报错
解决方法:
这个是Weblogic自身连接Oracle驱动jar和报表的Oracle驱动jar冲突导致的,设置先加载报表工程中对应的jar,需要创建一个weblogic.xml文件,内容如下,拷贝到报表应用的WEB-INF目录下.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>false</prefer-web-inf-classes>
<prefer-application-resources>
<resource-name>META-INF/services/javax.xml.ws.spi.Provider</resource-name>
</prefer-application-resources>
<prefer-application-packages>
<package-name>oracle.*</package-name>
</prefer-application-packages>
</container-descriptor>
</weblogic-web-app>
2 集群部署问题
2.1 集群环境下如何配置粘滞会话或共享文件夹
集群环境下系统会因为不同的请求由负载均衡分配到不同的服务器而找不到临时文件。 解决方法有两种:
粘滞会话
配置方法:负载均衡器开启会话粘滞,不同的负载均衡器如何开启会话粘滞请参考具体的产品文档。共享文件夹
配置方法:首先需要设置一个共享目录,本文采用samba在搭建共享文件服务器:
$ yum install samba
配置文件为/etc/samba/smb.conf,修改过程如下:
1.在“Standalone Server Options”区域查找“security = user”处,修改为“security = share”;
2.在“Share Definitions”区域添加如下配置:
[share]
comment = Share Directories
path = /home/share
browseable =yes
public = yes
writable = yes
directory mask = 0777
force directory mode = 0777
directory security mask = 0777
force directory security mode = 0777
create mask = 0777
force create mode = 0777
security mask = 0777
force security mode = 0777
其中path为共享存储目录,可以根据实际进行修改。
path必须具有最高权限。
3.启动smb服务器:
$ /etc/rc.d/init.d/smb start
通过如下指令挂载共享目录:
$ mount –t cifs //【samba服务器IP或主机名】/【共享目录名称】【挂载点位置】-o username=【用户名】%【密码】
2.2 集群环境下配置任务调度模块
要在集群环境下使用调度模块,需要修改\WEB-INF\conf\unieap\newscheduler目录下的dataviz-schedular.properties文件,也就是调度模块的主配置文件,使用如下配置。这样可以避免同一个任务被执行多次。
org.quartz.jobStore.isClustered = true
3 其他详细配置
3.1 配置临时文件存储位置
临时文件存储位置在report-engine-config.properties中进行配置。
文件位置:WEB-INF/conf/unieap/report/report-engine-config.properties
#报表临时文件管理根目录,<<表示写的绝对路径
report_temp_file_path=/unieap/pages/report/temp/
临时文件默认是放在应用内部的目录中,用户可以修改该属性的值,将缓存文件保存至指定目录下。 比如放到D盘下的temp目录下,可修改为
#报表临时文件管理根目录,<<表示写的绝对路径
report_temp_file_path=<<D:/temp
建议用户将缓存保存至剩余空间较大的磁盘中。
此路径是服务器上的临时文件的根目录,所有临时文件都存放在根目录下的相应文件夹内:
缓存文件存放在根目录下的cache文件夹下。
调度产生的临时文件存放在根目录下的native_file文件夹下。
报表导出功能(excel,pdf等)产生的临时文件存放在根目录下的export_temp文件夹内。
批量导入导出产生的临时文件存放在根目录下的export_import_temp文件夹内。
文件上传产生的临时文件存放在根目录下的uploadtemp文件夹内。
3.2 配置单一数据集最大数据量
在日常应用中,由于系统缺陷等情况,用户可能会造成不必要的大数据量查询,会造成系统压力过大导致运行缓慢甚至内存溢出。为了避免以上情况,用户可以在dataset-config.properties中进行配置,对单次操作数据库的最大数据量进行限制。
文件位置:WEB-INF/conf/unieap/report/dataset-config.properties
#单次查询数据集条数上限
dataset_overflow_row_size=50000
在以上配置中设定单次最大数据量为50000,如果单次数据量超过50000条,系统会抛出异常信息。
如果用户有特殊需求,可以额外增加数据量上限。
3.3 配置日志
- 日志配置文件的位置
WEB-INF/classes/log4j.xml 如果没有该文件,可以新建,或在WEB-INF/lib/unieap-report-engine-版本号.jar解包进行修改替换。 - 配置日志的目的
日志能在系统出现问题是提供重要的分析依据,因此日志的存在具有非同寻常的重要意义。
当出现问题时,通过分析日志就可以精确地知道,在问题发生前做了哪些动作,分析问题出现的原因,然后根据日志进行修改、调试,进而解决问题。 - 如何配置日志
首先,提供一个样例以供参考:
文件名称为:log4j.xml
代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "http://log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="Console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{yyyy/MM/dd-HH:mm:ss} >> %5p >> %t >> %l >> %m%n" />
</layout>
</appender>
<appender name="File" class="org.apache.log4j.FileAppender">
<param name="File" value="C:/out.log" />
<layout class="org.apache.log4j.PatternLayout">
value="%d{yyyy/MM/dd-HH:mm:ss} >> %5p >> %t >> %l >> %m%n" />
</layout>
</appender>
<logger name="UniEAP_Report">
<level value="info" />
<appender-ref ref="Console" />
</logger>
<logger name="UniEAP_DataSet">
<level value="info" />
<appender-ref ref="Console" />
</logger>
<root>
<priority value="info" />
<appender-ref ref="Console" />
<appender-ref ref="File" />
</root>
</log4j:configuration>
报表的日志配置:
- report:报表引擎计算逻辑;
- dataset:数据集模块,sql执行部分;
尽量不要修改 日志级别
日志级别主要分为debug,info,warn,error,fatal。
在出现问题时,需要诊断时配置为debug;一般情况下,推荐配置为info。
当日志级别配置为fatal时,debug,info,warn,error级别的日志都不会输出;当日志级别配置为error时,debug,info,warn级别的日志不会输出;当日志级别配置为warn时,debug,info级别的日志不会输出;当日志级别配置为info时,debug级别的日志不会输出。