Nov 7, 2012

Ενεργοποίηση (activate) και απενεργοποίηση (deactivate) datasources στην εκκίνηση του Weblogic

Ένα από τα εκνευριστικά χαρακτηριστικά του Weblogic είναι πως κατά την εκκίνηση, αν κάποιο datasource με χαρακτηριστικά XA Logging Last Resource (LLR, όπως προτείνεται για ADF εφαρμογές) δεν είναι διαθέσιμο, τότε ο server δεν μπορεί να ξεκινήσει (http://docs.oracle.com/cd/E13222_01/wls/docs103/jdbc_admin/jdbc_datasources.html) Μηνύματα σαν το εξής, θα εμφανιστούν:

<Nov 7, 2012 3:59:45 PM EET> <Error> <Deployer> <BEA-149205> <Failed to initialize the application 'app' due to error weblogic.application.ModuleException: .
weblogic.application.ModuleException:
    at weblogic.jdbc.module.JDBCModule.prepare(JDBCModule.java:302)
    at weblogic.application.internal.flow.ModuleListenerInvoker.prepare(ModuleListenerInvoker.java:199)
    at weblogic.application.internal.flow.DeploymentCallbackFlow$1.next(DeploymentCallbackFlow.java:517)
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:52)
    at weblogic.application.internal.flow.DeploymentCallbackFlow.prepare(DeploymentCallbackFlow.java:159)
    Truncated. see log file for complete stacktrace
Caused By: weblogic.common.ResourceException: weblogic.common.ResourceException: Could not create pool connection. The DBMS driver exception was: IO Error: The Network Adapter could not establish the connection
    at weblogic.jdbc.common.internal.ConnectionEnvFactory.createResource(ConnectionEnvFactory.java:276)
    at weblogic.common.resourcepool.ResourcePoolImpl.makeResources(ResourcePoolImpl.java:1249)
    at weblogic.common.resourcepool.ResourcePoolImpl.makeResources(ResourcePoolImpl.java:1166)
    at weblogic.common.resourcepool.ResourcePoolImpl.start(ResourcePoolImpl.java:249)
    at weblogic.jdbc.common.internal.ConnectionPool.doStart(ConnectionPool.java:1154)
    Truncated. see log file for complete stacktrace
>

<Nov 7, 2012 3:59:56 PM EET> <Critical> <WebLogicServer> <BEA-000362> <Server failed. Reason: [JTAExceptions:119002]A logging last resource failed during initialization. The server cannot boot unless all configured logging last resources (LLRs) initialize. Failing reason:
weblogic.common.ResourceException: 0:weblogic.common.ResourceException: Could not create pool connection. The DBMS driver exception was: IO Error: The Network Adapter could not establish the connection
 >

...
<Nov 7, 2012 3:59:56 PM EET> <Notice> <WebLogicServer> <BEA-000365> <Server state changed to FORCE_SHUTTING_DOWN>


Αντίστοιχα μηνύματα θα εμφανιστούν (χωρίς όμως να γίνει αυτόματα shutdown o Weblogic) αν ο database server που έχει οριστεί στα datasources μας δεν είναι διαθέσιμος. Επειδή χρησιμοποιώ τον JDeveloper και τον embedded Weblogic για προγραμματισμό είτε στο σπίτι, είτε στο γραφείο ή σε διάφορους πελάτες είναι δυνατόν να πέσω σε τέτοιου είδους καταστάσεις όπου δεν ισχύουν κάποιες συνδέσεις δικτύου. Γι' αυτό το λόγο, έχω φτιάξει ένα wlst script που απενεργοποιεί κατά βούληση datasources, προτού καν ξεκινήσει ο Weblogic, λειτουργώντας σε domain offline mode. Αρχικά ορίζουμε το περιβάλλον του Weblogic με μια εντολή σαν την εξής στο περιβάλλον του Linux:

. .$HOME/dbin/oracle/jdev1116/wlserver_10.3/server/bin/setWLSEnv.sh

όπου το dbin/oracle/jdev1116 είναι ο κατάλογος που έχω εγκαταστήσει την έκδοση 11.1.1.6 του JDeveloper. Έπειτα σε έναν κατάλογο με scripts, έχω κατασκευάσει το αρχείο deactivate_ds.py με περιεχόμενα:

readDomain('/home/spk/.jdev1116/system11.1.1.6.38.61.92/DefaultDomain')
unassign("JdbcSystemResource", ds, "Target", "DefaultServer")
updateDomain()
closeDomain()
exit()


Στην ουσία, διαβάζονται τα περιεχόμενα του domain configuration σε offiline mode και αποσυνδέεται το παραμετρικό datasource από τον managed server. Στο ίδιον κατάλογο υπάρχει ένα properties αρχείο (πχ ds.properties) στο οποίο δηλώνεται το datasource του ενδιαφέροντος μας (για ενεργοποίηση ή απενεργοποίηση):

ds=fodxe

Μεταβαίνοντας στον script κατάλογο εκτελούμε:

java weblogic.WLST -loadProperties ds.properties -i deactivate_ds.py

Με αυτόν τον τρόπο δεν ανατίθεται το datasource στον embedded managed server του JDeveloper (ονόματι DefaultServer) οπότε η εκκίνηση του server γίνεται δίχως προβλήματα. Παρόμοια, έχω φτιάξει και ένα activate script για την αποκατάσταση του datasource χρησιμοποιώντας την εντολή assign().



1 comment:

Unknown said...

Συγχαρητήρια Σεραφείμ ,είναι πραγματικά πολύ εκνευριστικό αυτό που κάνει οweblogic, είχα ζητήσει βοήθεια για αυτό το πρόβλημα στο forum του weblogic https://forums.oracle.com/forums/thread.jspa?messageID=9152229&#9152229 και απάντηση ουσιαστική δεν πήρα. Στο τέλος αναγκάστηκα να δημιουργώ τα datasources δυναμικά.