1. Rails
    15 May 2012
    1. TorqueBox allows running distributed transactions over multiple databases and messaging queues. But what to do, if you also want to operate on the filesystem?
      This can be done with XADisk.

      This post outlines the necessary steps to setup XADisk.
      It will enable you to work on your filesystem and database in distributed transactions from within your Rails application.

    2. Notice

      At the time of writing, this does not work out of the box.
      There is an issue in IronJacamar which prevents deployment of XADisk as a resource adapter.

      Also the XADisk 1.2 Adapter does not comply with the JCA Spec.
      Both issues are resolved and should be fixed in the next releases.

      To work around this, I had to modify the adapter. You can get it here.

    3. Prerequisities

      Verify that TorqueBox and your application work by executing the following tasks from your rails app.

      rake torquebox:check
      rake torquebox:deploy
      rake torquebox:run

      Your application should now be available at localhost:8080.

      To enable full distributed transaction support in PostgreSQL, you’ll need to set max_prepared_transactions to something greater than zero in postgresql.conf, which is the usual default in most installations.
      http://torquebox.org/documentation/2.0.1/transactions.html#d0e5250

    4. Deploying the XADisk Resource Adapter

      To deploy it, put XADisk.rar in torquebox/jboss/standalone/deployments.

      Next the resource adapter needs to be configured.
      Therefore open torquebox/jboss/configuration/standalone.xml.
      Modify the resource adapters subsystem:

      <subsystem xmlns="urn:jboss:domain:resource-adapters:1.0"> 
          <resource-adapters> 
              <resource-adapter> 
                  <archive> 
                      XADisk.rar 
                  </archive> 
                  <transaction-support>XATransaction</transaction-support> 
                  <config-property name="xaDiskHome"> 
                      /opt/xadisk/xadisk1 
                  </config-property> 
                  <config-property name="instanceId"> 
                      xadisk1 
                  </config-property> 
                  <connection-definitions> 
                      <connection-definition
                           class-name="org.xadisk.connector.outbound.XADiskManagedConnectionFactory"
                           jndi-name="java:global/xadisk1"
                           pool-name="XADiskConnectionFactoryPool"> 
                          <config-property name="instanceId"> 
                              xadisk1 
                          </config-property> 
                          <xa-pool> 
                              <min-pool-size>1</min-pool-size> 
                              <max-pool-size>5</max-pool-size> 
                          </xa-pool> 
                      </connection-definition> 
                  </connection-definitions> 
              </resource-adapter> 
          </resource-adapters> 
      </subsystem> 

      Make sure to modify the property “xaDiskHome” according to your system.
      This is the working directory of the XADisk instance where it stores its transaction logs among other stuff. The instanceId is the name for this instance.
      Also the JNDI name of the connection factory must be configured.

      Start TorqueBox. XADisk should now be successfully deployed.

      The logs should state something similar to this:

      01:30:55,552 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-5) JBAS015876: Starting deployment of "XADisk.rar"
      01:30:56,090 INFO  [org.jboss.as.deployment.connector] (MSC service thread 1-4) JBAS010406: Registered connection factory java:global/xadisk1
      01:30:56,252 INFO  [org.jboss.as.deployment.connector] (MSC service thread 1-1) JBAS010401: Bound JCA ConnectionFactory [java:global/xadisk1]
      01:30:58,772 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS018559: Deployed "XADisk.rar"
    5. Using the adapter in a Rails app

      To use the resource adapter the connection factory has to be looked up via JNDI.
      The JavaDoc of XADisk lists the supported operations.

      # wrap database and filesystem in one transaction
      TorqueBox.transaction do
        # lookup the xadisk connection factory
        factory = TorqueBox::Naming.context.lookup("java:global/xadisk1")
        # acquire a connection
        conn = factory.connection
        begin
          a = Article.create! :title => "test" 
          file = java.io.File.new "/opt/filestore/#{a.id}"
          conn.create_file file
        ensure
          conn.close
        end
      end

      More about distributed transactions in TorqueBox can be found here.

    1. 0 Responses

      leave a comment
    2. Leave a comment: