Important: It is strongly discouraged to run other applications on WildFly Enterprise Application Platform (WF) with LSPS since LSPS is using a customized Hibernate.
To set up WildFly 9.0.2 with LSPS, do the following:
<module xmlns="urn:jboss:module:1.0" name="com.whitestein.lsps.security"> <resources> <resource-root path="lsps-security-jboss-${lsps.version}.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> <module name="org.picketbox" /> </dependencies> </module>Take a note of the module name since it is used later for security realm configuration.
Create a WildFly module with your JDBC driver. Type IV JDBC drivers are recommended.
<module xmlns="urn:jboss:module:1.0" name="com.mysql"> <resources> <resource-root path="mysql-connector-java-8.0.15-bin.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
For Microsoft SQL server, get the Microsoft SQL driver sqljdbc4.jar and copy it to $WF_HOME/modules/com/microsoft/sqlserver/mainr. Additional steps may be required to enable the XA transaction support on Microsoft SQL server. Refer to the relevant Microsoft documentation for information on your version of Microsoft SQL server and JDBC driver; for example, for Windows Server 2003 and sqljdbc4.jar, refer to http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=11774 and http://msdn.microsoft.com/en-US/library/aa342335(v=sql.90). You may also need to install MSDTC in Windows (Add/remove Windows components -> Application Server -> Details -> Enable network DTC access).
Also consider adding the sendStringParametersAsUnicode=false
property.
<module xmlns="urn:jboss:module:1.0" name="com.microsoft.sqlserver"> <resources> <resource-root path="sqljdbc4.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
<module xmlns="urn:jboss:module:1.0" name="com.oracle.jdbc"> <resources> <resource-root path="ojdbc6.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
The module name will be used later for creating data source.
Configure JMS in the server profile file (typically, $WF_HOME/standalone/configuration/standalone-full.xml):
<persistence-enabled>true</persistence-enabled>
. <subsystem xmlns="urn:jboss:domain:messaging:3.0"> <hornetq-server> <persistence-enabled>true</persistence-enabled> <journal-file-size>102400</journal-file-size> <connectors> <http-connector name="http-connector" socket-binding="http"> <param key="http-upgrade-endpoint" value="http-acceptor"/> </http-connector>
<jms-queue name="LSPS_QUEUE"> <entry name="java:jboss/jms/LSPS_QUEUE"/> </jms-queue> <jms-topic name="LSPS_TOPIC"> <entry name="java:jboss/jms/LSPS_TOPIC"/> </jms-topic>
LSPS will use the default JMS connection factory.
Configure your data source in the server profile file (typically, $WF_HOME/standalone/configuration/standalone-full.xml).
The data source must be an XA-datasource with the transaction isolation TRANSACTION_READ_COMMITTED and the JNDI name must be jdbc/LSPS_DS.
<xa-datasource jndi-name="java:/jdbc/LSPS_DS" pool-name="LSPS_DS" enabled="true" use-java-context="false"> <driver>mysqlxa</driver> <xa-datasource-property name="URL">jdbc:mysql://localhost:3306/lsps</xa-datasource-property> <security> <user-name>lsps</user-name> <password>lsps</password> </security> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> <xa-pool> <min-pool-size>10</min-pool-size> <max-pool-size>20</max-pool-size> <prefill>true</prefill> </xa-pool> </xa-datasource>
<xa-datasource jndi-name="java:/jdbc/LSPS_DS" pool-name="LSPS_DS" enabled="true" use-java-context="true"> <driver>mssqlxa</driver> <xa-datasource-property name="URL">jdbc:sqlserver://localhost;databaseName=lsps</xa-datasource-property> <security> <user-name>lsps</user-name> <password>lsps</password> </security> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> <xa-pool> <min-pool-size>10</min-pool-size> <max-pool-size>20</max-pool-size> <prefill>true</prefill> </xa-pool> <new-connection-sql>select 1</new-connection-sql> <validation> <check-valid-connection-sql>select 1</check-valid-connection-sql> </validation> </xa-datasource>
<xa-datasource jndi-name="java:/jdbc/LSPS_DS" pool-name="LSPS_DS" enabled="true" use-java-context="true"> <driver>oraclexa</driver> <xa-datasource-property name="URL">jdbc:oracle:thin:@localhost:1521:XE</xa-datasource-property> <security> <user-name>lsps</user-name> <password>lsps</password> </security> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> <xa-pool> <min-pool-size>10</min-pool-size> <max-pool-size>20</max-pool-size> <prefill>true</prefill> </xa-pool> <validation> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/> <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"/> <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/> </validation> </xa-datasource>
<drivers>
element, make sure to delete the h2 driver (driver with the name="h2"
attribute) and add <driver>
referred to from the data source definition:<driver name="mysqlxa" module="com.mysql"> <!-- for version 8: --> <xa-datasource-class>com.mysql.cj.jdbc.MysqlXADataSource</xa-datasource-class> </driver>
<driver name="mssqlxa" module="com.microsoft.sqlserver"> <xa-datasource-class>com.microsoft.sqlserver.jdbc.SQLServerXADataSource</xa-datasource-class> </driver>
<driver name="oraclexa" module="com.oracle.jdbc"> <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class> </driver>
<mail-session name="lspsmail" jndi-name="java:jboss/mail/LSPS_MAIL"> <smtp-server outbound-socket-binding-ref="mail-smtp"/> </mail-session>
Set up the login module for the LSPS realm: add the following to the "security-domains" of the security subsystem tag in $WF_HOME/standalone/configuration/standalone-full.xml or the respective WildFly config referencing the security module from step 2:
<security-domain name="lspsRealm" cache-type="default"> <authentication> <login-module code="com.whitestein.lsps.security.jboss.LSPSRealm" flag="required" module="com.whitestein.lsps.security"> <module-option name="dsJndiName" value="/jdbc/LSPS_DS"/> </login-module> </authentication> </security-domain>
The attribute cache-type of the security-domain element turns on caching of user login data. As a side effect, changes to user credentials will not be used until after the cache is flushed; for example, if a user changes user's password through the web console but the user is already using PDS, they will be able to connect PDS to the server with the old credentials. You can turn the cache off by omitting the cache-type attribute of the security-domain element. The security domain definition will look as follows:
<security-domain name="lspsRealm"> <authentication> <login-module code="com.whitestein.lsps.security.jboss.LSPSRealm" flag="required" module="com.whitestein.lsps.security"> <module-option name="dsJndiName" value="/jdbc/LSPS_DS"/> </login-module> </authentication> </security-domain>
For additional module options, refer to the JavaDoc of the implementing class and super classes. You can also plug in your own authentication module.
Configure bean pools.
The application requires configuration of bean and data source connection pools. The configuration depends on the expected load as well as other performance parameters. You can change the configuration in the $WF_HOME/standalone/configuration/standalone-full.xml or the respective WildFly config.
<bean-instance-pools> <!-- A sample strict max pool configuration --> <strict-max-pool name="slsb-strict-max-pool" max-pool-size="200" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/> <strict-max-pool name="mdb-strict-max-pool" max-pool-size="20" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/> <thread-pools> <thread-pool name="default"> <max-threads count="10"/>
> <session-bean> > <stateless> > <bean-instance-pool-ref pool-name="slsb-strict-max-pool"/> > </stateless> >
Configure networking (optional).
By default WildFly binds to the local host. You can change the configuration in $WF_HOME/standalone/configuration/standalone-full.xml (or the WildFly config you use). For example, to bind WildFly to any IPv4 address use the following setting:
<interface name="management"> <any-ipv4-address/> </interface> <interface name="public"> <any-ipv4-address/> </interface> <interface name="unsecure"> <any-ipv4-address/> </interface>
Set up Java memory options:
JVM might require larger amount of memory depending on the uploaded and used LSPS modules.
JAVA_OPTS="$JAVA_OPTS -Dorg.eclipse.emf.ecore.EPackage.Registry.INSTANCE=org.eclipse.emf.ecore.impl.EPackageRegistryImpl"
JAVA_OPTS="-Dorg.apache.el.parser.COERCE_TO_ZERO=false $JAVA_OPTS"LSPS needs the system property org.apache.el.parser.COERCE_TO_ZERO to be set to "false" (see https://jsp-spec-public.dev.java.net/issues/show_bug.cgi?id=183). Without the property, empty input in numeric fields in the web application is interpreted as 0. This interpretation causes some functionalities not to work.
<logger category="com.vaadin.ui.ConnectorTracker" use-parent-handlers="true"> <level name="ERROR"/> </logger>
Important: It is strongly discouraged to run other applications on WildFly (WF) along with the LSPS Application since LSPS is using a customized Hibernate.
To set up WildFly 10.0.0 with LSPS, do the following:
<module xmlns="urn:jboss:module:1.0" name="com.whitestein.lsps.security"> <resources> <resource-root path="lsps-security-jboss-${lsps.version}.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> <module name="org.picketbox" /> </dependencies> </module>Take a note of the module name since it is used later for security realm configuration.
Create a WildFly module with your JDBC driver. Type IV JDBC drivers are recommended.
<module xmlns="urn:jboss:module:1.0" name="com.mysql"> <resources> <resource-root path="mysql-connector-java-8.0.15-bin.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
For Microsoft SQL server, get the Microsoft SQL driver sqljdbc4.jar and copy it to $WF_HOME/modules/com/microsoft/sqlserver/mainr. Additional steps may be required to enable the XA transaction support on Microsoft SQL server. Refer to the relevant Microsoft documentation for information on your version of Microsoft SQL server and JDBC driver; for example, for Windows Server 2003 and sqljdbc4.jar, refer to http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=11774 and http://msdn.microsoft.com/en-US/library/aa342335(v=sql.90). You may also need to install MSDTC in Windows (Add/remove Windows components -> Application Server -> Details -> Enable network DTC access).
Also consider adding the sendStringParametersAsUnicode=false
property.
<module xmlns="urn:jboss:module:1.0" name="com.microsoft.sqlserver"> <resources> <resource-root path="sqljdbc4.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
<module xmlns="urn:jboss:module:1.0" name="com.oracle.jdbc"> <resources> <resource-root path="ojdbc6.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
The module name will be used later for creating data source.
Configure JMS in the server profile file (typically, $WF_HOME/standalone/configuration/standalone-full.xml):
<server name="default" persistence-enabled="true">
.LSPS will use the default JMS connection factory.
Configure your data source in the server profile file (typically, $WF_HOME/standalone/configuration/standalone-full.xml).
The data source must be an XA-datasource with the transaction isolation TRANSACTION_READ_COMMITTED and the JNDI name must be jdbc/LSPS_DS.
<xa-datasource jndi-name="java:/jdbc/LSPS_DS" pool-name="LSPS_DS" enabled="true" use-java-context="false"> <driver>mysqlxa</driver> <xa-datasource-property name="URL">jdbc:mysql://localhost:3306/lsps</xa-datasource-property> <security> <user-name>lsps</user-name> <password>lsps</password> </security> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> <xa-pool> <min-pool-size>10</min-pool-size> <max-pool-size>20</max-pool-size> <prefill>true</prefill> </xa-pool> </xa-datasource>
<xa-datasource jndi-name="java:/jdbc/LSPS_DS" pool-name="LSPS_DS" enabled="true" use-java-context="true"> <driver>mssqlxa</driver> <xa-datasource-property name="URL">jdbc:sqlserver://localhost;databaseName=lsps</xa-datasource-property> <security> <user-name>lsps</user-name> <password>lsps</password> </security> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> <xa-pool> <min-pool-size>10</min-pool-size> <max-pool-size>20</max-pool-size> <prefill>true</prefill> </xa-pool> <new-connection-sql>select 1</new-connection-sql> <validation> <check-valid-connection-sql>select 1</check-valid-connection-sql> </validation> </xa-datasource>
<xa-datasource jndi-name="java:/jdbc/LSPS_DS" pool-name="LSPS_DS" enabled="true" use-java-context="true"> <driver>oraclexa</driver> <xa-datasource-property name="URL">jdbc:oracle:thin:@localhost:1521:XE</xa-datasource-property> <security> <user-name>lsps</user-name> <password>lsps</password> </security> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> <xa-pool> <min-pool-size>10</min-pool-size> <max-pool-size>20</max-pool-size> <prefill>true</prefill> </xa-pool> <validation> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/> <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"/> <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/> </validation> </xa-datasource>
<drivers>
element, make sure to delete the h2 driver (driver with the name="h2"
attribute) and add <driver>
referred to from the datasource definition:<driver name="mysqlxa" module="com.mysql"> <!-- for version 8: --> <xa-datasource-class>com.mysql.cj.jdbc.MysqlXADataSource</xa-datasource-class> </driver>
<driver name="mssqlxa" module="com.microsoft.sqlserver"> <xa-datasource-class>com.microsoft.sqlserver.jdbc.SQLServerXADataSource</xa-datasource-class> </driver>
<driver name="oraclexa" module="com.oracle.jdbc"> <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class> </driver>
<mail-session name="lspsmail" jndi-name="java:jboss/mail/LSPS_MAIL"> <smtp-server outbound-socket-binding-ref="mail-smtp"/> </mail-session>
Set up the login module for the LSPS realm: add the following to the "security-domains" of the security subsystem tag in $WF_HOME/standalone/configuration/standalone-full.xml or the respective WildFly config referencing the security module from step 2:
<security-domain name="lspsRealm" cache-type="default"> <authentication> <login-module code="com.whitestein.lsps.security.jboss.LSPSRealm" flag="required" module="com.whitestein.lsps.security"> <module-option name="dsJndiName" value="/jdbc/LSPS_DS"/> </login-module> </authentication> </security-domain>
The attribute cache-type of the security-domain element turns on caching of user login data. As a side effect, changes to user credentials will not be used until after the cache is flushed; for example, if a user changes user's password through the web console but the user is already using PDS, they will be able to connect PDS to the server with the old credentials. You can turn the cache off by omitting the cache-type attribute of the security-domain element. The security domain definition will look as follows:
<security-domain name="lspsRealm"> <authentication> <login-module code="com.whitestein.lsps.security.jboss.LSPSRealm" flag="required" module="com.whitestein.lsps.security"> <module-option name="dsJndiName" value="/jdbc/LSPS_DS"/> </login-module> </authentication> </security-domain>
For additional module options, refer to the JavaDoc of the implementing class and super classes. You can also plug in your own authentication module.
Configure bean pools.
The application requires configuration of bean and data source connection pools. The configuration depends on the expected load as well as other performance parameters. You can change the configuration in the $WF_HOME/standalone/configuration/standalone-full.xml or the respective WildFly config. Example settings:
<bean-instance-pools> <!-- A sample strict max pool configuration --> <strict-max-pool name="slsb-strict-max-pool" max-pool-size="200" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/> <strict-max-pool name="mdb-strict-max-pool" max-pool-size="20" instance-acquisition-timeout="5" instance-acquisition-timeout-unit="MINUTES"/> <thread-pools> <thread-pool name="default"> <max-threads count="10"/>
Configure networking (optional).
By default WildFly binds to the local host. You can change the configuration in $WF_HOME/standalone/configuration/standalone-full.xml (or the WildFly config you use). For example, to bind WildFly to any IPv4 address use the following setting:
<interface name="management"> <any-address/> </interface> <interface name="public"> <any-address/> </interface> <interface name="unsecure"> <any-address/> </interface>
Set up Java memory options:
JVM might require larger amount of memory depending on the uploaded and used LSPS modules.
JAVA_OPTS="$JAVA_OPTS -Djboss.server.default.config=standalone-full.xml"
JAVA_OPTS="$JAVA_OPTS -Dorg.eclipse.emf.ecore.EPackage.Registry.INSTANCE=org.eclipse.emf.ecore.impl.EPackageRegistryImpl"
<logger category="com.vaadin.ui.ConnectorTracker" use-parent-handlers="true"> <level name="ERROR"/> </logger>
The server returns the following XA exception:
To remedy the situation, do the following:
The above assumes that the user is the user defined to connect from WildFly to Oracle. It also assumes that either Oracle 10g R2 (patched for bug 5945463) or 11g is used. If an unpatched version, that is, a version older that 11g, is used, change the last GRANT EXECUTE to the following:
If on MySQL with the JDBC driver, you might get the following exception:
To remedy the situation, set the time zone:
<xa-datasource-property name="URL">jdbc:mysql://localhost:3306/lsps? useUnicode=true& characterEncoding=utf-8 &useJDBCCompliantTimezoneShift=true &useLegacyDatetimeCode=false &serverTimezone=UTC </xa-datasource-property>