3

Can someone clarify few things on deployer 8.5 setup. I did not get much clarity from docs. Though I had some ideas from Boot Camp I had in SDL.

  1. deployer-combined does not need (mandatorily) State-Store DB instead can use Broker DB?

  2. If not, why my installation fails in Linux with my setenv.sh having the Broker DB details for both #Contnet and #Deployer State Store?

I get below error:

2018-12-13 08:55:05,322 ERROR SpringApplication - Application startup failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error 
creating bean with name 'entityManagerFactory' defined in class path 
resource 
[com/sdl/delivery/spring/configuration/StateStoreDBConfiguration.class]: 
Unsatisfied dependency expressed through method 'entityManagerFactory' 
parameter 0; nested exception is 
org.springframework.beans.factory.BeanCreationException: Error creating bean 
with name 'dataSource' defined in class path resource 
[com/sdl/delivery/spring/configuration/StateStoreDBConfiguration.class]: 
Bean instantiation via factory method failed; nested exception is org.springframework.beans.
BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: 
Factory method 'dataSource' threw exception; nested exception is com.sdl.delivery.configuration.ConfigurationException: 
Placeholder value is found. Please specify valid configuration for State Store database.

Can anyone explain why it does not work without State Store DB?

Any suggestion would be of great help!

Note:

  • When I leave #deployer section as is in setenv.sh, the log says it is needed.

  • With State_Store DB details my installation works and I see now my Publishing works too. Strange :)

Earlier I was getting below errors:

2018-12-13 12:51:11,956 ERROR BaseHTTPSTransportConnector - Unable to execute File retrieval on destination: http://xx.xx.xxx.xxx:8084/httpupload
org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
    at org.apache.http.impl.conn.PoolingClientConnectionManager.leaseConnection(PoolingClientConnectionManager.java:230)
    at org.apache.http.impl.conn.PoolingClientConnectionManager$1.getConnection(PoolingClientConnectionManager.java:199)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:424)
    at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:884)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
    at com.tridion.transport.connection.connectors.BaseHTTPSTransportConnector.retrieveFileIfPresent(BaseHTTPSTransportConnector.java:258)
    at com.tridion.transport.connection.connectors.DiscoveryServiceTransportConnector.retrieveFileIfPresent(DiscoveryServiceTransportConnector.java:109)
    at com.tridion.transport.connection.connectors.TransportPoolConnector.retrieveFileIfPresent(TransportPoolConnector.java:80)
    at com.tridion.transport.workers.EndpointMetaWorker.getMetadata(EndpointMetaWorker.java:54)
    at com.tridion.transport.DestinationController.run(DestinationController.java:219)
    at java.lang.Thread.run(Unknown Source)

---- Updated ---- deployer-conf.xml

<?xml version="1.0" encoding="UTF-8"?>
<Deployer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="8.5"
          xsi:noNamespaceSchemaLocation="schemas/deployer-conf.xsd">
    <Pipelines>
        <Pipeline Id="Tridion-Bootstrap" Action="TridionBootstrap" Verb="Content,Prepare,Commit">
            <Steps>
                <Step Id="TridionUnzipStep"/>
            </Steps>
        </Pipeline>
        <Pipeline Id="Tridion-Wait" Action="Deploy,Undeploy" Verb="Wait">
            <Steps>
                <Step Id="TridionWaitStep"/>
            </Steps>
        </Pipeline>
        <Pipeline Id="Tridion-Process-Deploy" Action="Deploy" Verb="Process">
            <Steps>
                <Step Id="SchemaDeploy" Factory="com.sdl.delivery.deployer.steps.TridionExecutableStepFactory">
                    <Module Class="com.tridion.deployer.modules.SchemaDeploy" Type="SchemaDeploy"/>
                </Step>
                <Step Id="PageDeploy" Factory="com.sdl.delivery.deployer.steps.TridionExecutableStepFactory">
                    <Module Class="com.tridion.deployer.modules.PageDeploy" Type="PageDeploy">
                        <Transformer Class="com.tridion.transformer.TCDLDefaultTransformer"/>
                    </Module>
                </Step>
                <Step Id="BinaryDeploy" Factory="com.sdl.delivery.deployer.steps.TridionExecutableStepFactory">
                    <Module Class="com.tridion.deployer.modules.BinaryDeploy" Type="BinaryDeploy"/>
                </Step>
                <Step Id="ComponentDeploy" Factory="com.sdl.delivery.deployer.steps.TridionExecutableStepFactory">
                    <Module Class="com.tridion.deployer.modules.ComponentDeploy" Type="ComponentDeploy"/>
                </Step>
                <Step Id="TemplateDeploy" Factory="com.sdl.delivery.deployer.steps.TridionExecutableStepFactory">
                    <Module Class="com.tridion.deployer.modules.TemplateDeploy" Type="TemplateDeploy"/>
                </Step>
                <Step Id="PublicationDeploy" Factory="com.sdl.delivery.deployer.steps.TridionExecutableStepFactory">
                    <Module Class="com.tridion.deployer.modules.PublicationDeploy" Type="PublicationDeploy"/>
                </Step>
                <Step Id="TaxonomyDeploy" Factory="com.sdl.delivery.deployer.steps.TridionExecutableStepFactory">
                    <Module Class="com.tridion.deployer.modules.TaxonomyDeploy" Type="TaxonomyDeploy"/>
                </Step>
                <Step Id="ComponentPresentationDeploy"
                      Factory="com.sdl.delivery.deployer.steps.TridionExecutableStepFactory">
                    <Module Class="com.tridion.deployer.modules.ComponentPresentationDeploy"
                            Type="ComponentPresentationDeploy">
                        <Transformer Class="com.tridion.transformer.TCDLDefaultTransformer"/>
                    </Module>
                </Step>
                <Step Id="StructureGroupDeploy" Factory="com.sdl.delivery.deployer.steps.TridionExecutableStepFactory">
                    <Module Class="com.tridion.deployer.modules.StructureGroupDeploy" Type="StructureGroupDeploy"/>
                </Step>
            </Steps>
        </Pipeline>
        <Pipeline Id="Tridion-Process-Undeploy" Action="Undeploy" Verb="Process">
            <Steps>
                <Step Id="PageUndeploy" Factory="com.sdl.delivery.deployer.steps.TridionExecutableStepFactory">
                    <Module Class="com.tridion.deployer.modules.PageUndeploy" Type="PageUndeploy"/>
                </Step>
                <Step Id="ComponentPresentationUndeploy"
                      Factory="com.sdl.delivery.deployer.steps.TridionExecutableStepFactory">
                    <Module Class="com.tridion.deployer.modules.ComponentPresentationUndeploy"
                            Type="ComponentPresentationUndeploy"/>
                </Step>
                <Step Id="TaxonomyUndeploy" Factory="com.sdl.delivery.deployer.steps.TridionExecutableStepFactory">
                    <Module Class="com.tridion.deployer.modules.TaxonomyUndeploy" Type="TaxonomyUndeploy"/>
                </Step>
                <Step Id="StructureGroupUndeploy"
                      Factory="com.sdl.delivery.deployer.steps.TridionExecutableStepFactory">
                    <Module Class="com.tridion.deployer.modules.StructureGroupUndeploy" Type="StructureGroupUndeploy"/>
                </Step>
            </Steps>
        </Pipeline>
        <Pipeline Id="Tridion-PreCommit-TX" Action="Deploy,Undeploy" Verb="PreCommit">
            <Steps>
                <Step Id="TridionPreCommitStep"/>
            </Steps>
        </Pipeline>
        <Pipeline Id="Tridion-Commit-TX" Action="Deploy,Undeploy" Verb="Commit">
            <Steps>
                <Step Id="TridionCommitStep">
                    <RetryPoint PipelineId="Tridion-PreCommit-TX" StepId="TridionPreCommitStep"/>
                </Step>
            </Steps>
        </Pipeline>
        <Pipeline Id="Tridion-Rollback-TX" Action="Deploy,Undeploy" Verb="Rollback">
            <Steps>
                <Step Id="TridionRollbackStep"/>
            </Steps>
        </Pipeline>
        <Pipeline Id="Tridion-Cleanup" Action="Deploy,Undeploy" Verb="*">
            <Steps>
                <Step Id="TridionCleanupStep"/>
            </Steps>
        </Pipeline>
    </Pipelines>

    <!-- Binary Storage configuration -->
    <BinaryStorage Id="PackageStorage" Adapter="FileSystem">
        <Property Name="Path" Value="/deployer-combined/binary"/>
    </BinaryStorage>

    <!--
        Redis Binary Storage configuration.
        Password is not supported by Amazon ElastiCache.
     -->
    <!--
    <BinaryStorage Id="RedisStorage" Adapter="RedisBlobStorage">
        <Property Name="Host" Value="${storageHost}"/>
        <Property Name="Port" Value="${storagePort}"/>
        <Property Name="Password" Value="encrypted:HzfQh9wYwAKShDxCm4DnnBnysAz9PtbDMFXMbPszSVY="/>
        <Property Name="Timeout" Value="20000"/>
    </BinaryStorage>
    -->

    <!-- State store configuration -->

    <!--
        Configuration example for MSSQL Database
           The Storage element specifies database settings for Deployer State Store Database.
           For the MSSQL the minimum set of properties are:
               host: name of the server that hosts the database
               port: port number (default 1433) used for TCP/IP connections to the database
               database: name of the database to access
               user: username used to access the database
               password: password used to access the database

           (Optional)
           Also, for MSSQL we support extended connection properties that are related to MSSQL.
           For example:
           <Property Name="encrypt" Value="true"/>

           In this particular case, MSSQL will specify SSL encryption for all the data sent between
           the client and the server if the server has a certificate installed.
           You are able to specify as much extended properties as you want.

    <State>
        <Storage Adapter="mssql" driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" >
            <Property Name="host" Value="${dbhost}"/>
            <Property Name="port" Value="1433"/>
            <Property Name="database" Value="${dbname}"/>
            <Property Name="user" Value="${dbuser}"/>
            <Property Name="password" Value="${dbpassword}"/>
        </Storage>
    </State>

    -->

    <!--
        Configuration example for Oracle SQL Database
           The Storage element specifies database settings for Deployer State Store Database.
           For the Oracle SQL the minimum set of properties are:
               host: name of the server that hosts the database
               port: port number (default 1521) used for TCP/IP connections to the database
               database: name of the database to access
               user: username used to access the database
               password: password used to access the database

           Currently, we are not supporting extended connection properties for Oracle SQL Database.

    <State>
        <Storage Adapter="oracle" driver="oracle.jdbc.driver.OracleDriver">
            <Property Name="host" Value="${dbhost}"/>
            <Property Name="port" Value="1521"/>
            <Property Name="database" Value="${dbname}"/>
            <Property Name="user" Value="${dbuser}"/>
            <Property Name="password" Value="${dbpassword}"/>
        </Storage>
    </State>

    -->

    <State>
        <Storage Adapter="mssql" driver="com.microsoft.sqlserver.jdbc.SQLServerDriver">
            <Property Name="host" Value="xxx.xx.xx.xxx"/>
            <Property Name="port" Value="1433"/>
            <Property Name="database" Value="State_Store"/>
            <Property Name="user" Value="xxxxxxxxxxx"/>
            <Property Name="password" Value="xxxxxxxxxxxxx#"/>
        </Storage>
    </State>

    <!-- Queues configuration -->
    <Queues>
        <!-- Queues default configuration for Filesystem-->
        <Queue Default="true" Verbs="Content" Adapter="FileSystem" Id="ContentQueue">
            <Property Name="Destination" Value="/deployer-combined/queue/incoming"/>
            <!-- Optional property to set number of workers
            <Property Name="Workers" Value="11"/> -->
        </Queue>
        <Queue Verbs="Commit,Rollback" Adapter="FileSystem" Id="CommitQueue">
            <Property Name="Destination" Value="/deployer-combined/queue/incoming/FinalTX"/>
            <!-- Optional property to set number of workers
            <Property Name="Workers" Value="11"/> -->
        </Queue>
        <Queue Verbs="Prepare" Adapter="FileSystem" Id="PrepareQueue">
            <Property Name="Destination" Value="/deployer-combined/queue/incoming/Prepare"/>
            <!-- Optional property to set number of workers
            <Property Name="Workers" Value="11"/> -->
        </Queue>
        <Adapter Id="FileSystem">
            <!-- optional property to set polling interval
            <Property Name="LocationPollingInterval" Value="2s"/> -->
        </Adapter>

        <!-- Queues default configuration for JMS -->
        <!--
            <Queue Default="true" Verbs="Content" Adapter="JMS" Id="ContentQueue">
                <Property Name="Workers" Value="11"/>
            </Queue>
            <Queue Verbs="Commit,Rollback" Adapter="JMS" Id="CommitQueue">
                <Property Name="Workers" Value="11"/>
            </Queue>
            <Queue Verbs="Prepare" Adapter="JMS" Id="PrepareQueue">
                <Property Name="Workers" Value="11"/>
            </Queue>
        -->

        <!-- ActiveMQ default adapter configuration for JMS -->
        <!--
            <Adapter Id="JMS">
                <Property Name="JMSConnectionFactoryBuilderClass"
                          Value="com.sdl.delivery.spring.configuration.jms.ActiveMQConnectionFactoryBuilder" />
                <Property Name="JMSUri" Value="tcp://activemq-host:port" />

                //JMS optional properties. Required for remote activeMQ
                <Property Name="Username" Value="admin"/>
                <Property Name="Password" Value="admin"/>

                //JMS optional property. Put the value in milliseconds. Used to fine tune queue sensitivity.
                <Property Name="ReceiveTimeout" Value="200"/>
            </Adapter>
        -->

        <!-- AmazonSQS default adapter configuration for JMS -->
        <!--
            <Adapter Id="JMS">
                <Property Name="JMSConnectionFactoryBuilderClass"
                          Value="com.sdl.delivery.spring.configuration.jms.AmazonSQSConnectionFactoryBuilder" />
                <Property Name="JMSUri" Value="https://sqs.eu-central-1.amazonaws.com/42" />

                //Required to create connection with Amazon SQS
                <Property Name="Username" Value="AccessKey"/>
                <Property Name="Password" Value="SecretKey"/>

                //JMS optional property. Put the value in milliseconds. Used to fine tune queue sensitivity.
                <Property Name="ReceiveTimeout" Value="200"/>
            </Adapter>
        -->

        <!-- Workers configuration properties -->
        <Workers>
            <!-- Optional configuration properties
            <Property Name="QueuePollingInterval" Value="2s"/>
            <Property Name="RetriesInterval" Value="100ms"/>
            <Property Name="MaxRetries" Value="11"/>
            <Property Name="Cleanup" Value="true"/> -->
        </Workers>
    </Queues>

    <!-- RMI Channel Port -->
    <RMIChannel ListenerPort="1050"/>
    <!-- License Path -->
    <License Path="/ContentDelivery/cd_licenses.xml"/>
</Deployer>

With the above xml my setup works, I can successfully publish, but when I try to use the 8.5.0 Broker DB for State_Store I get the placeholder found error!

  • Looks like something missing or wrong in your deployer-conf.xml configuration, can you share your deployer-conf.xml config file with masking credentials? – Velmurugan Dec 13 '18 at 13:21
  • I do agree with Velmurgan's answer that having the database separately gives you better scalability. You do need a State-Store DB though. If you are installing a new CD environment, you can still use the same DB for broker and state store (if the scaling scenario does not apply to you). If you are upgrading the CD environment, you will need a new state store database but will not have to republish the content. – Shiva Dec 13 '18 at 15:03
3

To answer your question:

Answer 1: It's not mandatory to create State-Store DB separately we can still use that Content Data Store (a.k.a. The Broker database), but I would recommend creating separately both State-Store and Discovery DBs, This new setup makes it much easier to manage your delivery infrastructure. Also, the migration of content can now easily be separated from the migration.

Deployer-combined or Deployer Worker services write the status of each publishing job to the State Store database, keeping this database separate this state store calls will not hit the broker database.

  • Correct! Thanks for confirming. At this point my configuration has <State><Storage> section where placeholders like {dbhost} gets replaced with setenv.sh entries. The question is why it does not take Broker Database details of State Store from setenv.sh. do you think if we use the Broker Database details we do not need <State><Storage> section is deployer-conf.xml? updating the question with deployer-conf.xml. – Vikas Kumar Dec 14 '18 at 6:20
  • I can see your config looks good to me, In deployer-config.xml always required to specify <State><Storage> section details of Broker DB or State-Store DB details – Velmurugan Dec 14 '18 at 9:41
  • so it seems the State Store driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" value might not be correct? Do we need to use differend JDBC drivers? Using <Storage Adapter="MSSQL" driver="com.microsoft.sqlserver.jdbc.SQLServerDataSource"> does not work either. – Vikas Kumar Dec 17 '18 at 5:35

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.