Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Added introduction to external section; noted some possible decisions.

...

You can also check out a suite of camel-based services in the Fedora Camel Toolbox.

Setup Fedora to Talk to External ActiveMQ

You might wish to use an external ActiveMQ instead of Fedora's built-in one. This offers easier access to the ActiveMQ web console, the ability to upgrade ActiveMQ independently of Fedora, and the ability to distribute messaging across servers (among other possible benefits). The instructions below offer one possible approach to achieving this setup.

Download the latest ActiveMQ 5 Linux .tar.gz from https://activemq.apache.org/components/classic/download

  1. Unpack the file and move it under /opt
  2. Create a symlink from the unpacked directory to /opt/activemq
  3. Create an activemq user: sudo adduser --system --no-create-home activemq
  4. Change ownership: sudo chown -R activemq:activemq /opt/activemq/
  5. Set up the unit file in /usr/lib/systemd/system/activemq.service:


Code Block
[Unit]

Description=Apache ActiveMQ
After=network-online.target

[Service]

Type=forking
WorkingDirectory=/opt/activemq/bin
ExecStart=/opt/activemq/bin/activemq start
ExecStop=/opt/activemq/bin/activemq stop
Restart=on-abort
User=activemq
Group=activemq

[Install]
WantedBy=multi-user.target


  1. Edit /opt/activemq/conf/activemq.xml and change port numbers in the transportConnectors section (to avoid conflicts with Fedora’s built-in ActiveMQ; feel free to choose different port numbers as needed, just replace below as needed):
    1. 61616 -> 41616
    2. 61613 -> 41613
  2. Start and enable the service: sudo systemctl enable activemq ; sudo systemctl start activemq
  3. Edit /opt/fedora/fcrepo.properties and add some properties to customize the configuration and file location for the internal Fedora ActiveMQ (feel free to choose different file paths as appropriate to your Fedora setup):
    1. fcrepo.activemq.configuration=file:///opt/fedora/config/activemq.xml
    2. fcrepo.activemq.directory=/opt/fedora/queue
  4. Create /opt/fedora/config/activemq.xml (this is the default Fedora ActiveMQ configuration with a fedora_bridge network connector added to forward messages to port 41616):


Code Block
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">

    <context:property-placeholder/>
    <bean id="activeMqDirectory" class="java.lang.String">
        <constructor-arg value="#{fedoraPropsConfig.activeMqDirectory}"/>
    </bean>
    <!--
        The <broker> element is used to configure the ActiveMQ broker.
    -->
    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost">
  <networkConnectors>
    <networkConnector name="fedora_bridge" dynamicOnly="true" uri="static:(tcp://localhost:41616)">
      <dynamicallyIncludedDestinations>
        <topic physicalName="fedora"/>
        <queue physicalName="fedora"/>
      </dynamicallyIncludedDestinations>
    </networkConnector>
  </networkConnectors>
        <!--
            For better performances use VM cursor and small memory limit.
            For more information, see:
            http://activemq.apache.org/message-cursors.html
            Also, if your producer is "hanging", it's probably due to producer flow control.
            For more information, see:
            http://activemq.apache.org/producer-flow-control.html
        -->
        <destinationPolicy>
            <policyMap>
                <policyEntries>
                    <policyEntry topic=">" producerFlowControl="true">
                        <!-- The constantPendingMessageLimitStrategy is used to prevent
                         slow topic consumers to block producers and affect other consumers
                         by limiting the number of messages that are retained
                         For more information, see:
                         http://activemq.apache.org/slow-consumer-handling.html
                    -->
                        <pendingMessageLimitStrategy>
                            <constantPendingMessageLimitStrategy limit="1000"/>
                        </pendingMessageLimitStrategy>
                    </policyEntry>
                    <policyEntry queue=">" producerFlowControl="true" memoryLimit="1mb">
                        <!-- Use VM cursor for better latency
                       For more information, see:
                       http://activemq.apache.org/message-cursors.html
                  <pendingQueuePolicy>
                    <vmQueueCursor/>
                  </pendingQueuePolicy>
                  -->
                    </policyEntry>
                </policyEntries>
            </policyMap>
        </destinationPolicy>
        <!--
            The managementContext is used to configure how ActiveMQ is exposed in
            JMX. By default, ActiveMQ uses the MBean server that is started by
            the JVM. For more information, see:
            http://activemq.apache.org/jmx.html
        -->
        <managementContext>
            <managementContext createConnector="false"/>
        </managementContext>
        <!--
            Configure message persistence for the broker. The default persistence
            mechanism is the KahaDB store (identified by the kahaDB tag).
            For more information, see:
            http://activemq.apache.org/persistence.html
        -->
        <persistenceAdapter>
            <kahaDB directory="#activeMqDirectory"/>
        </persistenceAdapter>
        <!--
            The systemUsage controls the maximum amount of space the broker will
            use before slowing down producers. For more information, see:
            http://activemq.apache.org/producer-flow-control.html
            If using ActiveMQ embedded - the following limits could safely be used:
            -->
        <systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage limit="20 mb"/>
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="1 gb"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="100 mb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>
        <!--
            The transport connectors expose ActiveMQ over a given protocol to
            clients and other brokers. For more information, see:
            http://activemq.apache.org/configuring-transports.html
        -->
        <transportConnectors>
            <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
            <transportConnector name="openwire"
                uri="tcp://0.0.0.0:#{fedoraPropsConfig.jmsPort}?maximumConnections=1000&amp;wireformat.maxFrameSize=104857600"
            />
            <transportConnector name="stomp"
                                uri="stomp://0.0.0.0:#{fedoraPropsConfig.stompPort}"/>
        </transportConnectors>
        <!-- destroy the spring context on shutdown to stop jetty -->
        <shutdownHooks>
            <bean xmlns="http://www.springframework.org/schema/beans"
                class="org.apache.activemq.hooks.SpringContextHook"/>
        </shutdownHooks>
    </broker>
    <!--
        Enable web consoles, REST and Ajax APIs and demos
        Take a look at ${ACTIVEMQ_HOME}/conf/jetty.xml for more details
    <import resource="jetty.xml"/>
    -->
</beans>


  1. Reconfigure Camel Toolbox by editing /opt/fedora/config/fcrepo-camel-toolbox.properties and adding:
    1. jms.brokerUrl=tcp://localhost:41616
  2. Restart Camel Toolbox: (e.g., if you have set it up as a service: sudo systemctl restart cameltoolbox)