Application Server-related Problems

Memory Issues Running Under Tomcat

These steps might solve problems related to the release of memory or to container tag pooling:

1. Set the following parameter in the global $CATALINA_BASE/conf/web.xml:

enablepooling = false

2. Restart Tomcat.

Java Out of Memory Error

If you encounter a Java out of memory error, try increasing your Java heap size setting. See Setting JVM Options for Application Servers. As a minimum, add -Xms1024m -Xmx2048m to your JAVA_OPTS setting.

This Java option is set within the application server, so you must restart your application server.

Configuration File Locations

You'll find JasperReports Server configuration properties specific to your application server in the following files.

Tomcat:

<tomcat>/webapps/jasperserver-pro/META-INF/context.xml

<tomcat>/webapps/jasperserver-pro/WEB-INF/hibernate.properties

<tomcat>/apache-tomcat/webapps/jasperserver-pro/WEB-INF/web.xml        (JNDI config)

<tomcat>/apache-tomcat/config/Catalina/localhost/jasperserver-pro.xml        (delete: see below)

JBoss:

<jboss>/standalone/deployments//jasperserver-pro.war/WEB-INF/js-jboss7-ds.xml

<jboss>/standalone/deploymentsjasperserver-pro.war/WEB-INF/hibernate.properties

<jboss>/standalone/deployments/jasperserver-pro.war/WEB-INF/web.xml

<jboss>/standalone/deployments/jasperserver-pro.war/WEB-INF/jboss-web.xml

GlassFish:

<glassfish>/domains/domain1/autodeploy/jasperserver-pro.war/WEB-INF/hibernate.properties

<glassfish>/domains/domain1/autodeploy/jasperserver-pro.war/WEB-INF/js.quartz.properties

<glassfish>/domains/domain1/config/domain.xml

Context.xml on Tomcat: Special Case

If you deploy multiple instances of JasperServer to Tomcat, the context.xml (database connection configuration) can be superseded by a file in this location:  <tomcat>/conf/Catalina/localhost/jasperserver-pro.xml. This is the case with some Tomcat versions before Tomcat 7.

When JasperServer is deployed, the context.xml will be copied to <tomcat>/conf/Catalina/localhost/jasperserver-pro.xml (Tomcat does this by default).

Now, if you make changes to your <tomcat>/webapps/jasperserver-pro/META-INF/context.xml, Tomcat will not “see” them. Instead, the jasperserver-pro.xml will be used. This is confusing, but it's the way Tomcat operates.

If you edit your context.xml to fix a database problem:

<tomcat>/webapps/jasperserver-pro/META-INF/context.xml

Remember to delete the jasperserver-pro.xml file:

<tomcat>/conf/Catalina/localhost/jasperserver-pro.xml           (delete this file)

Tomcat Installed Using apt-get/yum

Setting CATALINA_HOME

If you're installing JasperReports Server to an instance of Tomcat that was installed using a package manager like apt-get, yum, or rpm, you can use the CATALINA_HOME and CATALINA_BASE properties found in your default_master.properties file.

Go to the section of the default_master.properties that looks like this:

# Tomcat app server root dir
appServerDir = C:\\Program Files\\Apache Software Foundation\\Tomcat 7.0
# appServerDir = /home/devuser/apache-tomcat-7.0.26
# if linux package managed tomcat instance, set two properties below
# CATALINA_HOME = /usr/share/tomcat6
# CATALINA_BASE = /var/lib/tomcat6

and change it to this:

# Tomcat app server root dir
# appServerDir = C:\\Program Files\\Apache Software Foundation\\Tomcat 7.0 
# appServerDir = /home/devuser/apache-tomcat-7.0.26
# if linux package managed tomcat instance, set two properties below
CATALINA_HOME = /usr/share/tomcat6
CATALINA_BASE = /var/lib/tomcat6

Note that you must set both CATALINA_HOME and CATALINA_BASE.

Database Driver Location

After installing JasperReports Server, make sure there's a copy of the database driver file in the /usr/share/tomcat7/webapps/jasperserver-pro/WEB-INF/lib directory. If it's not there, copy the driver to this location. For example, for PostgreSQL, you can copy the driver from the
<js-install>/buildomatic/conf_source/db/postgresql/jdbc directory.

GlassFish Modifications

Using a Custom Domain

If GlassFish is your application server and you’re using a custom domain, set up the following authentication information in the default_master.properties:

# Glassfish domain name (default is domain1)
glassfishDomain=domain1
 
# Glassfish domain port (default is 4848), user (default is admin) and password.
# Uncomment and set up next parameters if you install JasperServer to the custom Glassfish domain (not default)
#glassfishPort=4848
#glassfishUser=admin
#AS_ADMIN_PASSWORD=adminadmin

Requests to Single Permissions REST2 Service fail on GlassFish

Requests to Single Permissions REST2 service are failing on GlassFish with the following error:

400 Invalid URI: Encoded slashes are not allowed by default. To enable encodedslashes, set the property com.sun.grizzly.util.buf.UDecoder.ALLOW_ENCODED_SLASH to true

To fix this issue, run this command:

./bin/asadmin create-jvm-options -Dcom.sun.grizzly.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

BufferOverflowException When Working With Input Controls

In some cases, adding a large number of values to an input control causes an overflow error like this:

Request URI is too large.

java.nio.BufferOverflowException

To fix this, increase the allowed URI size in the GlassFish admin console. Go to Configurations > cluster-config > Network Config > Transports > tcp > Buffer Size and increase the value to 131072 or more.

JBoss Modifications

JBoss 7 Startup Error

JBoss 7 has a default startup time period. If your JBoss 7 takes longer than 60 seconds to start or deploy, you may receive the following error:

“(DeploymentScanner-threads - 1) Did not receive a response to the deployment operation within the allowed timeout period [60 seconds]. Check the server configuration file and the server logs to find more about the status of the deployment”.

To fix this, you need to increase your deployment-timeout setting as follows:

1. Change to the JBoss standalone configuration directory.

cd <jboss>/standalone/configuration

2. Open the standalone.xml file.
3. Look for the <subsystem xmlns="urn:jboss:domain:deployment-scanner:1.1"> element, for example:

<subsystem xmlns="urn:jboss:domain:deployment-scanner:1.1">

<deployment-scanner path="deployments" relative-to="jboss.server.base.dir" scan-interval="5000"/>

</subsystem>

4. Edit this to add or set the attribute deployment-timeout to the preferred time in seconds, for example:

<subsystem xmlns="urn:jboss:domain:deployment-scanner:1.1">

<deployment-scanner path="deployments" relative-to="jboss.server.base.dir" scan-interval="5000" deployment-timeout="600"/>

</subsystem>

5. Save the file.

On server restart, your system will have the specified time to start up.

JBoss 7 ReservedCodeCacheSize Error

If you get a fatal error like this:

"out of space in CodeCache for adapters"

It may be the result of a too-low a memory setting for the ReservedCodeCacheSize flag. This error has been observed when running the Oracle JDK, version 1.6 (no longer supported).

You can set a higher value as shown in the example below:

Linux

export JAVA_OPTS="$JAVA_OPTS -DReservedCodeCacheSize=128m"

Windows

set JAVA_OPTS=%JAVA_OPTS% -DReservedCodeCacheSize=128m

JBoss Large INFO Log Message on Drill-through

JBoss has an internal mechanism to track and log information on unclosed JDBC connections. Jaspersoft OLAP Views leaves a connection open for performance reasons when doing a drill-through. In this case, JBoss puts a large INFO level message in the server.log.

To silence this INFO message:

1. Open the JBoss log4j configuration file for editing:

<jboss>/server/default/conf/jboss-log4j.xml

2. Set the logging level for the CachedConnectionManager class to this value:
<category name="org.jboss.resource.connectionmanager.CachedConnectionManager">
<priority value="WARN"/>
</category>

Using a Non-default JBoss Profile

If JBoss is your application server, and you’re using a profile other than the default, you need to set the jboss.profile property before running the js-install script in Installing the WAR File Using js-install Scripts:

1. Open this buildomatic property file:

<js-install>/buildomatic/build_conf/default/app.srv.properties

2. Uncomment the jboss.profile property and change the profile name as follows:

from

# jboss.profile = default

to

jboss.profile = <your_profile>

Using JBoss with Non-Latin Characters

If JBoss is your application server, and your organization is created with non-Latin characters, you will need to edit the standalone.xml configuration file.

1. Edit <jboss-home>/standalone/configuration/standalone.xml
2. Add a new <system-properties> tag after the <extensions> tag:
<extensions>
......
</extensions>
 
<system-properties>
  <property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8"/>
  <property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true"/>
</system-properties>

Maximum Post Size in Wildfly

If you're upgrading or importing on some versions of Wildfly and your repository or other import file is large, the import may fail and the connection may be reset. In this case, you may need to set max-post-size. To do this, open the file <wildfly-home>/wildfly/standalone/configuration/standalone.xml and add or change the max-post-size attribute of the http-listener property, for example:

<http-listener name="default" socket-binding="http" max-header-size="974247881" 
     max-post-size="974247881"/>

Performance Issues with JBoss EAP 6.1

A known defect in JBoss EAP 6.1 on Windows causes significant performance issues with JasperReports Server. The workaround is to remove the -XX:+TieredCompilation option from the <jboss‑install>\bin\standalone.bat file. This defect has been fixed in later versions of JBoss EAP.

WebSphere Modifications

Page Not Found Error on Login

You may see this error during a WebSphere installation when a user attempts to log into JasperReports Server. After typing in a correct user ID and password, the user sees an error page: Page cannot be found, HTTP 404

Some WebSphere versions or fix packs have modified code that processes web server filters incorrectly. Components with the /* URL pattern get affected by this. JasperReports Server uses the Spring framework for authentication and it is mapped using a filter chain with the /* URL pattern. You need to set a special property that WebSphere provides to solve this problem.

To solve the Page Not Found Error on Login:

1. Login into WebSphere Administrative Console.
2. Navigate to Application Servers > <server> > Web Container Settings > Web Container > Custom Properties.
3. Create a new property with the following attributes:

name: com.ibm.ws.webcontainer.invokefilterscompatibility

value: true

4. Save the master configuration.
5. Restart the WebSphere server.

WebLogic Modifications

Schema Validation Error

You may see an error like the following on some WebLogic installations:

<Critical> <WebLogicServer> <BEA-000362> <Server failed. Reason: [Management:141245]Schema Validation Error in /u01/app/oracle/WLS/user_projects/domains/x2o_uat_01/config/config.xml

This may be caused by the configuration of the <stuck-thread-max-time>element in the designated configuration file. In this case, removing stuck-thread-max-time may resolve the error.

Disabling User Session Persistence in Application Servers

JasperReports Server stores non-serializable data in its user sessions, which can cause errors after restarting your application server:

Exception loading sessions from persistent storage

Cause: java.io.NotSerializableException ...

The errors appear in the JasperReports Server log when users log in after the application server has been restarted. Users don't see the errors, and they have no impact on JasperReports Server operations.

Because JasperReports Server user sessions are not persistent, you can configure your application server to disable persistence and avoid the error. For example, in Apache Tomcat, edit the file <tomcat>/conf/context.xml and locate the following lines.

<!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

Remove the comment markers from lines 2 and 4 above, then restart Apache-Tomcat activate the change. For other application servers, refer to the product documentation.

Session Error Using JasperReports Server and Tomcat 7

On some versions of Tomcat 7, a session error might occur while running reports, with the log error “A request has been denied as a potential CSRF attack.” This is due to a known conflict between security settings in Direct Web Remote library (DWR) 2.x and some versions of Tomcat 7.0.x:

Tomcat 7 sets httpOnly on session ID cookies to safeguard against cross-site scripting (XSS) attacks.
DWR 2.x uses session ID cookies to safeguard against cross-site request forgery (CSRF).

To work around this problem, you must modify these safeguards by doing one of the following:

Disabling httpOnly for cookies in Tomcat

OR

Allowing requests from other domains in DWR

For more information on the security impact and relative risks of these two choices, see, for example, the Cross-site Scripting and Cross-site Request Forgery pages at the Open Web Application Security Project (OWASP).

Disabling httpOnly for Cookies in Tomcat

The application server hosting JasperReports Server handles the session cookie. To prevent malicious scripts on a client from accessing the session cookie and the user connection, Tomcat 7 is set to use httpOnly cookies. This tells the browser that only the server may access the cookie, not scripts running on the client. When enabled, this setting safeguards against XSS attacks.

You can disable this by setting httpOnly in the file <tomcat>/conf/context.xml:

<Context useHttpOnly="false">
...
</Context>

Allowing Requests from Other Domains in DWR

DWR is a server-side component used for Input Controls. By default, DWR uses session ID cookies to prevent cross-site request forgery. You can disable the protection in DWR by setting the crossDomainSessionSecurity parameter for the dwr servlet in the file <tomcat>\webapps\jasperserver-pro\WEB-INF\web.xml:

<servlet>
    <servlet-name>dwr</servlet-name>
<servlet-class>org.directwebremoting.spring.DwrSpringServlet</servlet-class>
    ...
    <init-param>
      <param-name>crossDomainSessionSecurity</param-name>
      <param-value>false</param-value>
    </init-param>
  </servlet>
Feedback