26.10 25.09
26.10 25.09

Data Bridge deployment

Configuring your NexJ CRM server to work with Data Bridge

Before you can deploy Data Bridge, you must have the following prerequisites for NexJ CRM:

  • NexJ Bridge Adapter (nexj-meta-bridgeadapter*.jar provided in your Data Bridge release package)

  • Supported JDK as specified in the NexJ Data Bridge Release Notes for your release

Setting up the NexJ CRM environment file

To set up the NexJ CRM environment file:

  1. In NexJ Studio, in the Deployment layer's Environment tab, open your environment file for the current NexJ CRM deployment.

  2. Ensure that the uowListenerEnabled attribute is set to "true" in the Environment tag. For example:
    <Environment … uowListenerEnabled="true" …>

  3. Add the NexJ Bridge Adapter mixin to the environment file as shown below:    

    <Environment … uowListenerEnabled="true" …><Mixins>      <Mixin namespace="nexj:model:dai:bridgeadapter" version="{bridgeadapter mixin version}"/></Mixins> ...</Environment>
    
  4. Add the following DataSource name to the same RelationalDatabaseConnection as DefaultRelationalDatabase is on:

    <DataSource name="brgadapter:BRGadapter"/> 
    
  5. Add the following required channel connection:

    <HTTPConnection channel="brgadapter:NexJBridgeSender" password="<password>" url="<DataBridgeURL/nexj/channel/brg:BridgeReceiver>" user="brgadmin"/>
    
  6. Add the following required channel connection:

    <HTTPConnection authentication="basic" channel="brgadapter:CRMReceiver" secure="true" trust="<bridgeTrust>"/>
    
  7. Save your changes.

The password should be set according to your specific environment requirements.

Data Bridge upgrade notes

To ensure that the export output directory does not get reset during an upgrade, do the following:

  1. Prior to upgrade, navigate to the Global Settings workspace and note the value in the Export Path field on the Export Configuration tab.

  2. In the environment file, set the bridge.exportDirectory property to the above value.

  3. Upgrade Data Bridge.

  4. After the upgrade, verify that the value in the Export Path field is correct.

Example NexJ CRM environment file

The examples provided in this topic are included for reference purposes only. You should not copy them and edit them for direct use.

Click to expand...
<Environment ajp.port="portNumber" authDomain="NEXJQA.LOCAL" authService="HTTP/localhost.nexjsystems.local" batchEmailRecipientListEnabled="${crm.standalone.batchEmailRecipientListEnabled:false}" batchNotifications="${crm.standalone.batchNotifications:false}" birthdayMailerEnabled="${crm.standalone.birthdayMailerEnabled:false}" callRecordsEnabled="${crm.standalone.callRecordsEnabled:false}" clientPerfStatusEnabled="true" clientPerfStatusMobileRedCriteria="1500 45 400 30" clientPerfStatusMobileYellowCriteria="750 45 200 15" currencyConversionEnabled="${crm.standalone.currencyConversionEnabled:false}" dai.adapter.securityEnabled="${crm.standalone.dai.adapter.securityEnabled:true}" dai.adapter.softDeletedLoadEnabled="${crm.standalone.dai.adapter.softDeletedLoadEnabled:false}" debug="true" description="Local machine with the bootstrap container in the default location" emailDraftEnabled="${crm.standalone.emailDraftEnabled:false}" emailSignatureEnabled="${crm.standalone.emailSignatureEnabled:false}" hierarchySecurityEnabled="${crm.standalone.hierarchySecurityEnabled:false}" httpForbiddenEnabled="true" httpReportURL="${crm.standalone.reporting.httpURL}" httpURL="${crm.standalone.httpURL}" journalDirectory="tx${crm.standalone.test.clone}" location="ssh://qa-rpt-scrum2.nexjqa.local/opt/local/teee/node" materialDesign="${crm.standalone.materialDesign}" messagePort="portNumber" messageUser="brgadmin" bireport.enabled="false" bireport.isStandAlone="false" test="true" nameChangeContextAudit="${crm.standalone.nameChangeContextAudit:true}" password="text:scrum166" persistentSession="true" port.offset="${crm.standalone.port.offset:${crm.standalone.test.clone}00}" previewThreshold="202400" pushPassword="text:nexj" pushRedirectorURL="${crm.standalone.pushRedirectorURL}" pushServerURLs="${crm.standalone.pushServerURLs}" pushType="${crm.standalone.pushType}" pushUser="brgadmin" readAudit="${crm.standalone.readAudit:none}" rpcPrivilege="InternalManage" ruleSLA="${crm.standalone.ruleSLA:false}" sampleData="${crm.standalone.sampleData}" secureTransport="false" tagsEnabled="${crm.standalone.tagsEnabled:false}" test="true" test.clones="${crm.standalone.cloneCount}" type="Generic" uowListenerEnabled="true" updateAudit="${crm.standalone.updateAudit:false}" user="root"><Mixins><Mixin checksum="aaeef780" namespace="nexj:model:dai:bridgeadapter" version="0.1.1"/></Mixins><PKIKeyPairs><PKIKeyPair keystore="<keystore_value>" name="brgadmin" password="testPass"/></PKIKeyPairs><Hosts><Host name="dai" trusted="true" url="${crm.standalone.reporting.httpURL}"/></Hosts><DataSourceConnections><RelationalDatabaseConnection adapter="${crm.standalone.RelationalDatabaseConnection.Adapter}" database="${crm.standalone.RelationalDatabaseConnection.DEF.Db.Name}${crm.standalone.test.clone}" host="${crm.standalone.RelationalDatabaseConnection.Db.Host}" password="${crm.standalone.RelationalDatabaseConnection.Db.Password}" path="${crm.standalone.RelationalDatabaseConnection.Db.Path}" port="${crm.standalone.RelationalDatabaseConnection.Db.Port}" user="${crm.standalone.RelationalDatabaseConnection.Db.User}"><DataSource name="DefaultRelationalDatabase"/><DataSource name="rules:Rules"/><DataSource name="uicomp:UIComponent"/><DataSource name="Conversation"/><DataSource name="ecr:ECR"/><DataSource name="msg:Messaging"/><DataSource name="SessionDatabase"/><DataSource name="flow:Flow"/><DataSource name="StagingDatabase"/><DataSource name="call:Call"/><DataSource name="sso:SSO"/><DataSource name="StatDatabase"/><DataSource name="ObjectQueueDatabase"/><DataSource name="AuditLogDatabase"/><DataSource name="LockDatabase"/><DataSource name="bp:CPM"/><DataSource name="insights:Insights"/><DataSource name="brgadapter:BRGadapter"/><Fragments/></RelationalDatabaseConnection><FileStorageConnection adapter="Generic" dataDirectory="C:\NexJ\FileChannels\Attachment\data${crm.standalone.test.clone}" temporaryDirectory="C:\NexJ\FileChannels\Attachment\temp${crm.standalone.test.clone}"><DataSource name="Attachment"/><DataSource name="FileExport"/></FileStorageConnection></DataSourceConnections><ChannelConnections><MailConnection channel="Mail" from="mailtest@nexjsystems.com" inFolder="INBOX" inHost="tor-ex10-hub.NEXJ2K10.LOCAL" inProtocol="pop3" outHost="tor-ex10-hub.NEXJ2K10.LOCAL" outProtocol="smtp" password="password" user="brgadmin-exc2010@nexj2k10.local"/><HTTPConnection authentication="basic" channel="ExchangeEWSSender" password="text:NJ@test" secure="true" trust="-----BEGIN CERTIFICATE-----
<certificate_value>-----END CERTIFICATE-----" url="https://tst-ex2016.nexjtest.local/ews/Exchange.asmx" user="nexj-sync@nexjtest.local"/><HTTPConnection authentication="credential" channel="ExchangeEWSSender2" password="text:password" secure="true" trust="-----BEGIN CERTIFICATE-----
<certificate_value>
-----END CERTIFICATE-----" url="https://tor-qa-ex10cas1.nexjqa.local/ews/Exchange.asmx" user="nexj-sync@nexjqa.local"/><HTTPConnection authentication="basic" channel="ExchangeEWSSender3" password="text:P@ssw0rd" secure="true" trust="-----BEGIN CERTIFICATE-----
<certificate_value>
-----END CERTIFICATE-----" url="http://sv-2k13-cas2.nexj2k13.local/ews/Exchange.asmx" user="nexjsync@nexj2k13.local"/><HTTPConnection authentication="basic" channel="ExchangeEWSSender4" password="text:nj@123" secure="true" trust="-----BEGIN CERTIFICATE-----
<certificate_value>-----END CERTIFICATE-----
" url="https://tst2-2016exc1.nexjtest2.local/ews/Exchange.asmx" user="nexjsync@nexjtest2.local"/><HTTPConnection authentication="basic" channel="ExchangeEWSSender5" password="text:P@ssw0rd" secure="true" url="https://sv-njdev2013-ex.nexjdev2013.com/ews/Exchange.asmx" user="nexj.sync@nexjdev2013.com"/><HTTPConnection authentication="none" channel="ExchangeEWSNotificationReceiver"/><HTTPConnection channel="BESNotificationSender" password="text:123456" secure="true" trust="-----BEGIN CERTIFICATE-----
<certificate_value>
-----END CERTIFICATE-----" user="BESPushTest"/><HTTPConnection authentication="none" channel="JasperReportData"/><HTTPConnection authentication="perimeter" channel="JasperServer"/><HTTPConnection authentication="none" channel="NotificationUnsubscribeChannel" password="text:"/><FileConnection channel="ReportingOutputFileChannel" outgoingDirectory="C:\NexJ\FileChannels\Reporting\"/><HTTPConnection channel="insights:ArticleSearch" trust="-----BEGIN CERTIFICATE-----
<certificate_value>
-----END CERTIFICATE-----" url="https://uat.typecast6.com/api/v1/searchinterests?token=98c3b3be650c432eb6b7d4196f4115a1"/><HTTPConnection channel="insights:ArticleTrackingUrl" trust="-----BEGIN CERTIFICATE-----
<certificate_value>
-----END CERTIFICATE-----" url="https://uat.typecast6.com/api/v1/getsurl?token=98c3b3be650c432eb6b7d4196f4115a1"/><HTTPConnection authentication="basic" channel="brgadapter:CRMReceiver" secure="false"/><HTTPConnection authentication="basic" channel="brgadapter:NexJBridgeSender" password="text:nexj" secure="false" url="http://qa-dtbrdg-scrum1.nexjqa.local:7080/nexj/channel/brg:BridgeReceiver" user="brgadmin"/></ChannelConnections><SOAConnections><SOAConnection auth="perimeter" binding="context" service="nexj:act:ActivityPlan:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:act:ActTemplate:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:act:ApprovalObject:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:act:DocumentService:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:act:Task:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:call:InboundCall:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:crm:AssignmentModel:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:crm:EntityParticipation:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:crm:UserPerson:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:flow:FlowObject:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:flow:QuestionnaireService:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:flow:SecurityDelegateService:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:ilm:DistributeActionCommandClient:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:ilm:Lead:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:leaf:Leaflet:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:rules:CreateActivityPlanCommandClient:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:rules:CreateTaskCommandClient:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:rules:MessageActionCommandClient:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:rules:Rule:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:rules:SetActionCommandClient:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:soa:Audit:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:soa:Bulletin:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:soa:ConversationService:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:soa:DataMatchService:1.0"><Properties><Property name="system" value="#t"/></Properties></SOAConnection><SOAConnection auth="perimeter" binding="context" service="nexj:soa:DataMatchServiceConfiguration:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:soa:DesktopBeaconPushService:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:soa:DesktopPushService:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:soa:DesktopStreamRefreshPushService:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:soa:EmailNotificationService:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:soa:MobilePushService:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:soa:PortalIntegration:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:soa:PortletRegistry:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:soa:Registry:1.0"><Properties><Property name="system" value="#t"/></Properties></SOAConnection><SOAConnection auth="perimeter" binding="context" service="nexj:soa:SubscriptionEngineService:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:soa:UserRegistry:1.0"><Properties><Property name="system" value="#t"/></Properties></SOAConnection><SOAConnection auth="perimeter" binding="context" service="nexj:soa:UserRegistryClient:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:ui:ObjectComponentClient:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:ui:UIComponent:1.0"><Properties><Property name="system" value="#t"/></Properties></SOAConnection><SOAConnection auth="perimeter" binding="context" service="nexj:sso:Authentication:1.0"><Properties><Property name="system" value="#t"/></Properties></SOAConnection><SOAConnection auth="perimeter" binding="context" service="nexj:crm:Person:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:crm:User:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:crm:Household:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:crm:Task:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:ui:WorkQueueItemRelatedObject:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:crm:ScheduleItem:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:crm:Note:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:crm:Interaction:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:soa:NotificationService:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:ui:UIComponentClient:1.0"/></SOAConnections></Environment> 

Example NexJ CRM properties file

Click to expand...
config=Scrum.deployment crm.RelationalDatabaseConnection.Adapter=MSSQL crm.RelationalDatabaseConnection.BI.Db.Name=<databaseName> crm.RelationalDatabaseConnection.DEF.Db.Name=<databaseName> crm.RelationalDatabaseConnection.Db.Host=<hostName> crm.RelationalDatabaseConnection.Db.Password=<password> crm.RelationalDatabaseConnection.Db.Path=jtds-1.2.2-7.jar crm.RelationalDatabaseConnection.Db.Port=<portNumber> crm.RelationalDatabaseConnection.Db.User=<userName> crm.callRecordsEnabled=true crm.cloneCount=1 crm.deploy.location=c\:\\java\\container\\deploy-integrated crm.hierarchySecurityEnabled=true crm.http.authorizationDelegate.url=<URL> crm.http.monitor.influxdb.url= crm.httpAnonymousURL=/nexj/anon crm.httpReportURL=<http://localhost:port/nexj> crm.httpURL=<URL> crm.pushRedirectorURL=<URL> crm.pushServerURLs=<URL> crm.pushType=streaming crm.reporting.RelationalDatabaseConnection.Adapter=MSSQL crm.reporting.RelationalDatabaseConnection.BI.Db.Name=<databaseName> crm.reporting.RelationalDatabaseConnection.DEF.Db.Name=<databaseName> crm.reporting.RelationalDatabaseConnection.Db.Host=<hostName> crm.reporting.RelationalDatabaseConnection.Db.Password=<password> crm.reporting.RelationalDatabaseConnection.Db.Path=jtds-1.2.2-7.jar crm.reporting.RelationalDatabaseConnection.Db.Port=<portNumber> crm.reporting.RelationalDatabaseConnection.Db.User=<userName> crm.reporting.callRecordsEnabled=true crm.reporting.cloneCount=1 crm.reporting.deploy.location=c\:\\java\\container\\deploy-integrated crm.reporting.hierarchySecurityEnabled=true crm.reporting.http.authorizationDelegate.url=<URL> crm.reporting.http.monitor.influxdb.url= crm.reporting.httpAnonymousURL=/nexj/anon crm.reporting.httpReportURL=<URL> crm.reporting.httpURL=<URL> crm.reporting.pushRedirectorURL=<URL> crm.reporting.pushServerURLs=<URL> crm.reporting.pushType=streaming crm.reporting.sampleData=true crm.reporting.standalone.httpURL=<URL> crm.reporting.test.clone= crm.sampleData=true crm.standalone.RelationalDatabaseConnection.Adapter=MSSQL crm.standalone.RelationalDatabaseConnection.BI.Db.Name=<databaseName> crm.standalone.RelationalDatabaseConnection.DEF.Db.Name=<databaseName> crm.standalone.RelationalDatabaseConnection.Db.Host=<hostName> crm.standalone.RelationalDatabaseConnection.Db.Password=<password> crm.standalone.RelationalDatabaseConnection.Db.Path=jtds-1.2.2-7.jar crm.standalone.RelationalDatabaseConnection.Db.Port=<portNumber> crm.standalone.RelationalDatabaseConnection.Db.User=<userName> crm.standalone.callRecordsEnabled=true crm.standalone.cloneCount=1 crm.standalone.deploy.location=c\:\\java\\container\\deploy-integrated crm.standalone.hierarchySecurityEnabled=true crm.standalone.http.authorizationDelegate.url=<URL> crm.standalone.http.monitor.influxdb.url= crm.standalone.httpAnonymousURL=/nexj/anon crm.standalone.httpReportURL=<URL> crm.standalone.httpURL=<URL> crm.standalone.pushRedirectorURL=<URL> crm.standalone.pushServerURLs=<URL> crm.standalone.pushType=streaming crm.standalone.reporting.httpURL=<URL> crm.standalone.sampleData=true crm.standalone.test.clone= crm.test.clone= 

Setting up the databases

For an initial deployment of the NexJ Bridge Adapter on an existing NexJ CRM instance, you must create the brgadapter:BRGadapter data source by running the recreate command in the Data Load Tool in NexJ Studio. For subsequent deployments of the Bridge Adapter, generating and running the upgrade script may be required.

Reseed the object queue database for NexJ CRM when installing the Data Bridge Adapter. Use the following SQL step:

SQL
Update OQVersion set loaded=0

By default, triggering a reseed of the NexJ CRM database, adds the brgadmin user name (Data Bridge specific user) to the model. If necessary another user name can be used and it requires the brdadapter:gBridgeUser privilege, which enables a Data Bridge user to communicate with NexJ CRM.

Configuring your Data Bridge server

The following information describes how to configure your Data Bridge server.

Setting up Data Bridge with basic authentication

Data Bridge should be initially configured with basic authentication. After your initial deployment, you can change your authentication configuration. For example, the Data Bridge UI supports OAuth 2.0 authentication. 

The following are required to set up Data Bridge:

  • Data Bridge build package

  • Database setup script as generated through NexJ Studio

  • ssl.keystore file

  • Supported JDK as specified in the NexJ Data Bridge Release Notes for your release

For more information, see “Setting up Model Server” in NexJ CRM Developer and Deployment Documentation.

Initial database setup

  1. In NexJ Studio, select Run > Run tool > Database Schema Tool to set up the brg:DefaultRelational database.

  2. Under Options and in the Command field, select setup - generate and SQL script for setting up the database.

  3. To run the generated scripts against your database server, click Run.

Configuring the Data Bridge environment file

  1. In NexJ Studio, in the Deployment layer's Environment tab, open your environment file for the current Data Bridge deployment.

  2. Set the dng.enabled flag to true.

  3. (Optional) To enable Data Bridge to access NexJ CRM model attributes that are not persisted in a database, and display them in the Advanced tab in the Add Fields dialog on the Create View page in the Data Bridge client application, set the dng.useNonPersistedAttributes flag to true. This is an advanced use case and should only be done after consulting the NexJ project or support team.

  4. Add the required channel connections, modify the required URL, context root, and the trust certificate for the NexJ CRM server, as shown in the following example code.

    The brg:KafkaSender channel is used for publishing Kafka messages.

    <KafkaConnection authentication="none" channel="brg:KafkaSender" servers="${kafka.server}"><SenderProperties><Property name="schema.registry.url" value="${kafka.schema.registry}"/></SenderProperties></KafkaConnection><HTTPConnection channel="brg:CRMSender" password="brgadmin" trust="${crm.httpURL.trust}" url="${NexJCRMURL}/nexj/channel/brgadapter:CRMReceiver" user="brgadmin"/>
    
  5. Save your changes.

The dng.useNonPersistedAttributes flag must be set to true in order for the path attribute of the Attachments subject area to be shown in the Add Fields dialog.

The default user name and password values for the brg:CRMSender channel should be set to brgadmin or the values for a NexJ CRM user that has the brdadapter:gBridgeUser privilege. The brg:CRMSender channel holds outgoing RPC requests to the NexJ CRM application. Specify the complete URL of the CRM API endpoint in the brg:CRMSender channel.

Example Data Bridge environment file

Click to expand...
<Environment authDomain="NEXJSYSTEMS.LOCAL" authService="HTTP/localhost.nexjsystems.local" batchEmailRecipientListEnabled="false" batchNotifications="false" birthdayMailerEnabled="false" callRecordsEnabled="false" clientInsights="false" clientPerfStatusEnabled="true" clientPerfStatusMobileRedCriteria="1500 45 400 30" clientPerfStatusMobileYellowCriteria="750 45 200 15" clusterKeystore="<cluster_keystore_value>" clusterPassword="clusterpass" currencyConversionEnabled="false" debug="false" description="Local machine with the bootstrap container in the default location" distributed="${distributed:true}" dng.model.location="${dng.model.location:}" dng.sarea.augment.location="${dng.sarea.augment.location:}" dng.sarea.location="${dng.sarea.location:}" em2srSystemUserLogin="em2sr" em2srSystemUserName="Nexj EM2SR" em2srSystemUserPassword="U9;XpwM9" emailDraftEnabled="false" emailSignatureEnabled="false" emailToServiceRequest="false" hierarchySecurityEnabled="false" httpForbiddenEnabled="true" httpGZip="true" httpReportURL="${httpReportURL}" httpURL="${httpURL}" journalDirectory="tx" location="${location}" materialDesign="false" messageUser="brgadmin" bridge.exportDirectory="${bridge.exportDirectory://brg-export}" bridge.isChunked="${bridge.isChunked:false}" bridge.pageSize="${bridge.pageSize:1000}" dng.enabled="${dng.enabled:true}" dng.useNonPersistedAttributes="${dng.useNonPersistedAttributes:false}" test="true" nameChangeContextAudit="true" password="${deploymentPassword}" persistentSession="true" pollPeriod="300000" port.offset="00" previewThreshold="202400" pushPassword="text:nexj" pushRedirectorURL="${pushRedirectorURL}" pushServerURLs="${pushServerURLs}" pushUser="brgadmin" readAudit="none" rest.configMetadata="CRMRestAPIConfig" rest.schemaBase="CRMSchemaBaseJSON" rest.version="1.0.0" rpcPrivilege="InternalManage" ruleSLA="false" sampleData="true" secureTransport="false" tagsEnabled="false" test="true" test.clones="1" theme="${theme:bridge}" type="Generic" uowListenerEnabled="true" updateAudit="false" user="root"><PKIKeyPairs><PKIKeyPair keystore="<keystore_value>" name="brgadmin" password="testPass"/></PKIKeyPairs><Hosts><Host name="dai" trusted="true" url="${httpURL}"/></Hosts><DataSourceConnections><RelationalDatabaseConnection adapter="${RelationalDatabaseConnection.Adapter}" database="${RelationalDatabaseConnection.BI.Db.Name}" host="${RelationalDatabaseConnection.Db.Host}" password="${RelationalDatabaseConnection.Db.Password}" path="${RelationalDatabaseConnection.Db.Path}" port="${RelationalDatabaseConnection.Db.Port}" user="${RelationalDatabaseConnection.Db.User}"><DataSource name="AuditLogDatabase"/><DataSource name="DefaultRelationalDatabase"/><DataSource name="LockDatabase"/><DataSource name="ObjectQueueDatabase"/><DataSource name="SessionDatabase"/><DataSource name="StatDatabase"/><DataSource name="sso:SSO"/><DataSource name="brg:DefaultRelational"/><DataSource name="ecr:ECR"/></RelationalDatabaseConnection></DataSourceConnections><ChannelConnections><KafkaConnection authentication="${kafka.auth:none}" channel="brg:KafkaSender" password="${kafka.password}" secure="${kafka.secure:false}" servers="${kafka.server}" user="${kafka.user}"><SenderProperties><Property name="schema.registry.url" value="${kafka.schema.registry}"/></SenderProperties></KafkaConnection><MessageQueueConnection channel="ErrorQueue" password="nexj" user="brgadmin"/><MessageQueueConnection channel="RetryQueue" password="nexj" user="brgadmin"/><MailConnection channel="Mail" from="mailtest@nexjsystems.com" inFolder="INBOX" inHost="tor-ex10-hub.NEXJ2K10.LOCAL" inProtocol="pop3" outHost="tor-ex10-hub.NEXJ2K10.LOCAL" outProtocol="smtp" outReadTimeout="60000" outWriteTimeout="60000" password="password" user="brgadmin-exc2010@nexj2k10.local"/><HTTPConnection channel="rest:OpenAPI"/><HTTPConnection channel="rest:REST"/><HTTPConnection channel="rest:SelectionOptions"/><HTTPConnection authentication="basic" channel="brg:CRMSender" password="${crm.brg.password}" secure="${crm.secure:true}" trust="${crm.httpURL.trust}" url="${crm.httpURL}/channel/brgadapter:CRMReceiver" user="${crm.brg.user}"/></ChannelConnections><SOAConnections><SOAConnection auth="basic" service="nexj:soa:Audit:1.0"/><SOAConnection auth="basic" service="nexj:soa:UserRegistryClient:1.0"/><SOAConnection auth="perimeter" binding="context" service="nexj:soa:Registry:1.0"><Properties><Property name="system" value="#t"/></Properties></SOAConnection><SOAConnection auth="perimeter" binding="context" service="nexj:soa:UserRegistry:1.0"><Properties><Property name="system" value="#t"/></Properties></SOAConnection><SOAConnection auth="perimeter" binding="context" service="nexj:sso:Authentication:1.0"><Properties><Property name="system" value="#t"/></Properties></SOAConnection></SOAConnections></Environment> 

Preparing a shared filesystem

When Data Bridge is deployed in a distributed (clustered) application environment, it is necessary to provide a shared filesystem location, such as a NAS disk, that will be accessible to all Data Bridge application server nodes. A shared filesystem directory must be configured for each of the .environment file variables mentioned below:

Environment property

Example directory path

Description

dng.model.location

/nexj/bridge/metaclass

Metaclass Path – This refers to the file path from where the data engine metaclass is being loaded.

dng.sarea.location

/nexj/bridge/sarea

Subject Area Path – This refers to the file path from where the subject areas are being loaded.

dng.sarea.augment.location

/nexj/bridge/augment

Subject Area Augment Path - This refers to the file path from where the subject area augments are being loaded.

bridge.exportDirectory

/nexj/bridge/export

The directory where exported CSV files will be saved to.

Output file parameters

The delimited files that are generated from snapshots that use the File (Delimited) publishing target have the file extension that you have configured for delimited files. Use the following environment file flags to configure the defaults for delimited file format settings, and then you can change these settings using Data Bridge System Admin Console, as described at Using the Global Settings workspace.

Flag

Value

bridge.exportDirectory

The absolute path of the output directory (for example, C:\demo).

bridge.pageSize

For Kafka snapshots and delimited file snapshots this flag governs the request page size when data is retrieved from CRM. When isChunked = #t, each snapshot file chunk will contain an approximately equal number of records.

The allowed range of values is 1 - 4096.

Configuring the Data Bridge properties file

The following example shows properties that are included in a Data Bridge properties file.

Example Data Bridge properties file

Click to expand...
config=Scrum.environment dng.csvDelimiter=, dng.csvIsQuoted=true dng.csvQuoteCharacter=" dng.csvShowHeader=true dng.model.location=/nexj/bridge/metaclass dng.sarea.augment.location=/nexj/bridge/augment dng.sarea.location=/nexj/bridge/sarea httpURL=<URL> httpReportURL=<URL> location=ssh\://<localhost>/opt/local/teee/node pushRedirectorURL=<URL> pushServerURLs=<URL> RelationalDatabaseConnection.Adapter=MSSQL RelationalDatabaseConnection.BI.Db.Name=<databaseName> RelationalDatabaseConnection.DEF.Db.Name=<databaseName> RelationalDatabaseConnection.Db.Host=<hostName> RelationalDatabaseConnection.Db.Password=<password> RelationalDatabaseConnection.Db.Path=jtds-1.2.2-7.jar RelationalDatabaseConnection.Db.Port=<portNumber> RelationalDatabaseConnection.Db.User=<userName> bridge.csvFileExtension=csv bridge.exportDirectory=/nexj/bridge/export bridge.isChunked=true bridge.pageSize=4096 dng.useNonPersistedAttributes=true crm.httpURL=<URL> kafka.server=10.10.20.114\:9092 kafka.schema.registry=http\://10.10.20.114\:8081 deploymentPassword=<password>

Advanced configuration

You can configure advanced settings relating to functionality of the CRM Data Bridge Adapter and Data Bridge Server in their respective System Admin Consoles.

Configuring the NexJ CRM Data Bridge Adapter

You can configure the Data Bridge Adapter on the Statistics page in NexJ CRM System Admin Console. Navigate to the Statistics page in NexJ CRM System Admin Console, select nexj.finance > Administration > DataBridgeAdapter > Replication, and configure the required settings, which are shown in the following screenshot.

NexJ CRM System Admin Console Statistics page
NexJ CRM System Admin Console Statistics page

Data Bridge SQL query timeout

The Bridge Query Timeout parameter is the maximum query time period for invocations from the Data Bridge server, and by default it is set at 90 seconds. You can provide a different value.

The Bridge Query timeout will apply to any SQL queries that Data Bridge executes in NexJ CRM and will effectively overwrite the SQL query timeout configured in CRM for Data Bridge queries only. Any other CRM queries will remain subject to the SQL query timeout (typically 30 seconds) configured in CRM.

Enabling or disabling the Data Bridge Adapter

For information about the Data Bridge Adapter Enabled parameter, see Setting up Data Bridge.

Error handling of failed CRM event notifications from the NexJ CRM Data Bridge Adapter

You can configure the exponential backoff and retry settings for messages that failed to get delivered to Data Bridge.

The NexJ CRM Data Bridge Adapter is responsible for sending notifications of CRM data change events to Data Bridge. If changes fail to synchronize from CRM to Data Bridge due to a transient condition (for example, a network service interruption), they will be queued and retried. The rate at which such failed transactions will be retried is controlled by the "exponential backoff" configuration described below.

To configure the following backoff and retry settings, navigate to the Statistics page in NexJ CRM System Admin Console, select nexj.finance > Administration > DataBridgeAdapter > Replication, and enter a new number in the associated Value field:

By default, the initial wait to retry time is 30 seconds, which will increase by one minute until a maximum 600 second interval is reached. There is a maximum of 10 message failures. This equates to about 1 hour of retries.

  • Maximum backoff retries (maximum number) - the number of times a notification message retry is attempted

  • Maximum backoff wait time (in seconds) - the maximum wait time between retries

  • Minimum backoff wait time (in seconds) - the minimum wait time between retries (the first retry will be this value and subsequent retries will add a minute)

  • Retry of Real-Time Notifications - enter Y to attempt a retry of notification messages or N to not attempt a retry

Failed CRM event notifications will be queued up and retried on brgadapter:RealTimeStreamingQueue. Permanently failed messages are routed to brgadapter:RealTimeStreamingErrorQueue.

Configuring the Data Bridge Server

You can configure the Data Bridge Server in Data Bridge System Admin Console.

Data Bridge System Admin Console Statistics page
Data Bridge System Admin Console Statistics page

For more information, see Error handling when retrieving CRM data from Data Bridge and Using Data Bridge.

Error handling when retrieving CRM data from Data Bridge

After receiving a change notification from NexJ CRM, Data Bridge will attempt to retrieve the necessary data from CRM. If Data Bridge fails to successfully read data from CRM due to a transient condition (for example, a network service interruption), the changes will be queued and retried. The rate at which such failed transactions will be retried is controlled by the "exponential backoff" configuration described below.

To configure the following backoff and retry settings, navigate to the Statistics page in Data Bridge System Admin Console, select nexj.bridge > Administration > DataEngine > Replication, and enter a new number in the associated Value field:

By default, the initial wait to retry time is 30 seconds, which will increase by one minute until a maximum 600 second interval is reached. There is a maximum of 10 message failures. This equates to about 1 hour of retries.

  • Maximum backoff retries (maximum number) - the number of times a notification message retry is attempted

  • Maximum backoff wait time (in seconds) - the maximum wait time between retries

  • Minimum backoff wait time (in seconds) - the minimum wait time between retries (the first retry will be this value and subsequent retries will add a minute)

Failed transactions will be queued up and retried on brg:ProcessQueue.