2012-01-18 5 views
2

Lors du déploiement d'une application Rails 3.1 sur JRuby vers JBoss, j'ai un problème de connexion jndi/jdbc. La source de données existe et se relie très bienRails 3.1 Déploiement sur JBoss 4.2.2

17:47:20,862 ERROR [STDERR] JNDI data source unavailable: javax.naming.NameNotFoundException: jdbc not bound; trying straight JDBC 
17:47:20,926 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/MyApp]] unable to create shared application instance 
org.jruby.rack.RackInitializationException: jdbc adapter requires driver class and url 
    from C:/opt/jboss/jboss-4.2.2.GA-Virgin/server/default/tmp/deploy/tmp1619261931370223075MyApp-exp.war/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.2.0/lib/arjdbc/jdbc/connection.rb:21:in `configure_connection' 
    from C:/opt/jboss/jboss-4.2.2.GA-Virgin/server/default/tmp/deploy/tmp1619261931370223075MyApp-exp.war/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.2.0/lib/arjdbc/jdbc/connection.rb:84:in `initialize' 
    from C:/opt/jboss/jboss-4.2.2.GA-Virgin/server/default/tmp/deploy/tmp1619261931370223075MyApp-exp.war/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.2.0/lib/arjdbc/jdbc/adapter.rb:32:in `initialize' 
    from C:/opt/jboss/jboss-4.2.2.GA-Virgin/server/default/tmp/deploy/tmp1619261931370223075MyApp-exp.war/WEB-INF/gems/gems/activerecord-jdbc-adapter-1.2.0/lib/arjdbc/jdbc/connection_methods.rb:6:in `jdbc_connection' 
    from org/jruby/RubyKernel.java:2097:in `send' 

...

Caused by: org.jruby.exceptions.RaiseException: (ConnectionNotEstablished) jdbc adapter requires driver class and url 
17:47:23,010 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/MyApp]] Error: application initialization failed 
org.jruby.rack.RackInitializationException: unable to create shared application instance 
    at org.jruby.rack.SharedRackApplicationFactory.init(SharedRackApplicationFactory.java:39) 
    at org.jruby.rack.RackServletContextListener.contextInitialized(RackServletContextListener.java:45) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3856) 

database.yml

############################################################### 
#################### PRODUCTION DATA ########################## 
############################################################### 

production: 
    adapter: jdbc 
    jndi: java:jdbc/my_datasource 
    driver: com.microsoft.sqlserver.jdbc.SQLServerDriver 

J'ai vérifié à la fois la source de données et le fichier database.yml mais je aucune raison pour laquelle Rails ne trouve pas la source de données.

Mise à jour

Warbler config 

# Disable Rake-environment-task framework detection by uncommenting/setting to false 
# Warbler.framework_detection = false 
# 
puts 'Compiling the asset manifests & other files in the pipeline to the disk' 
system('bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile') 

# Warbler web application assembly configuration file 
Warbler::Config.new do |config| 

    # Application directories to be included in the webapp. 
    config.dirs = %w(app config lib log vendor tmp) 

    # Name of the archive (without the extension). Defaults to the basename 
    # of the project directory. 
    config.jar_name = "MyApp" 

    # Control the pool of Rails runtimes. Leaving unspecified means 
    # the pool will grow as needed to service requests. It is recommended 
    # that you fix these values when running a production server! 
    config.webxml.jruby.min.runtimes = 1 
    config.webxml.jruby.max.runtimes = 1 

    # JNDI data source name 
    # config.webxml.jndi = 'jdbc/rails' 
end 

config Datasource

<datasources>  
<xa-datasource> 
    <jndi-name>jdbc/my_datasource</jndi-name> 
    <track-connection-by-tx/> 
    <isSameRM-override-value>false</isSameRM-override-value> 
    <xa-datasource-class>com.microsoft.sqlserver.jdbc.SQLServerXADataSource</xa-datasource-class> 
    <xa-datasource-property name="ServerName">myserver</xa-datasource-property> 
    <xa-datasource-property name="DatabaseName">mydb</xa-datasource-property> 
    <xa-datasource-property name="SelectMethod">cursor</xa-datasource-property> 
    <valid-connection-sql>SELECT 1</valid-connection-sql> 
    <user-name>user</user-name> 
    <password>pwd</password> 
     <metadata> 
     <type-mapping>MS SQLSERVER2000</type-mapping> 
     </metadata> 
    </xa-datasource> 
</datasources> 

Répondre

3

Les œuvres suivantes pour moi lors du déploiement d'un fichier .war gazouillé pour Rails 3.0.x/JBoss 5.1.0GA.

En supposant que vous avez déployé avec succès votre source de données avec un fichier de configuration XML qui ressemblerait à ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<datasources> 
    <local-tx-datasource> 
     <jndi-name>my_datasource</jndi-name> 
     <connection-url>MYDATASOURCE_URL</connection-url> 
     <driver-class>your.Driver</driver-class> 
     ... define any other connection properties here ... 
    </local-tx-datasource> 
</datasources> 

Vous devez confirmer que votre source de données est en effet et en cours d'exécution dans votre console d'administration JBoss.

Ensuite, en supposant que vous avez les éléments suivants dans votre fichier config/warble.rb:

# JNDI data source name 
config.webxml.jndi = 'jdbc/my_datasource' 

# JBoss web-xmle file 
config.includes = 'jboss-web.xml' 

... et en supposant également que vous avez un fichier de configuration jboss-web.xml directement dans votre dossier de projet Rails, ce qui suit:

<jboss-web> 
    <resource-ref> 
     <res-ref-name>jdbc/my_datasource</res-ref-name> 
     <jndi-name>java:/my_datasource</jndi-name> 
     <res-type>javax.sql.DataSource</res-type> 
    </resource-ref> 
</jboss-web> 

... alors vous devriez être OK, afaik.

Pourriez-vous peut-être publier votre warble.rb, fichier de configuration XML de source de données et tout paramètre de configuration Web JBoss que vous définissez?

[EDIT] @Jared merci de poster vos fichiers de configuration. Du haut de ma tête, je peux vous offrir les bits conseils suivants:

  1. Corriger la valeur jndi dans votre database.yml-java:comp/env/jdbc/my_datasource.
  2. Définissez une configuration config.webxml.jndi dans votre warble.rb et définissez-la sur jdbc/my_datasource.
  3. Définissez également une référence à un nouveau fichier JBoss web.xml dans votre warble.rb avec config.includes = jboss-web.xml.
  4. Créez ce nouveau jboss-web.xml pour mapper le nom JNDI au nom de référence de ressource JBoss. Basé sur les fichiers que vous avez partagés, ce serait quelque chose dans le sens de ce que j'ai montré ci-dessus. Vous devez créer ce fichier directement sous la racine de votre projet Rails.

Espérons que cela aide!

+0

Je vais demain. L'ampoule s'est allumée ce soir et j'ai réalisé que l'application pourrait être en train de charger avant les sources de données. Mon collègue s'est déployé très bien, mais je ne pouvais pas (JBoss frais, pas d'autres applications). http://confluence.atlassian.com/display/CONF210/Known+Issues+for+JBoss –

+0

ajouté warble config, datasource, etc –

2

J'ai pris le conseil de buruzaemon. Il s'avère cependant que j'avais accidentellement copié mon fichier war dans le répertoire /deploy/uuid-key-generator.sar, je l'ai seulement découvert après que la trace de la pile jboss ait montré les mauvaises versions de jruby-jars.

Pour ce que ça vaut, j'ai appris à forcer le chargement des fichiers de source de données avant toutes les applications en ajoutant une dépendance

<depends>jboss.jca:service=DataSourceBinding,name=mydatasource</depends> 

à

/jboss-web.deployer/META-INF/jboss-service.xml 
+0

merci de partager ce bit sur la dépendance de chargement de source de données ... bon à savoir! – buruzaemon

Questions connexes