2016-01-28 3 views
6

Ich habe eine ejb-jar.xml, die Konfigurationsinformationen für eine meiner MDB enthält. In gibt es eine Konfiguration von:Ändern der Konfigurationseigenschaften von ejb-jar.xml während der Bereitstellung in GlassFish 4.0

<activation-config-property> 
     <activation-config-property-name>addressList</activation-config-property-name> 
     <activation-config-property-value>mq://test.server.uk:7676</activation-config-property-value> 
</activation-config-property> 

Da mein Projekt gebaut und verpackt und dann an Benutzer ich diesen Wert zu machen in der Lage sein müssen verteilt off sicher modifiziert werden können, wie Benutzer verschiedene Server-Adressen haben.

Derzeit habe ich die Möglichkeit, die Adresse in einer Eigenschaftendatei festzulegen. Gibt es trotzdem, dass ich dieses XML während der Bereitstellung auf Glassfish 4.0 mit dem Eigenschaftswert ändern konnte?

Wenn nicht muss ich den Wert jedes Mal festlegen, wenn jemand die Anwendung will und es neu erstellen?

Ich bin offen für die Konfiguration sonst, wo ich es nur dynamisch haben muss, damit Benutzer die Serveradressen in einer Eigenschaftendatei festlegen können.

+2

Haben Sie darüber nachgedacht, eine mit '@ ActivationConfigProperty' versehene MDB zu verwenden, und dann [könnten Sie den Anmerkungszeichenfolgenparameter der MDB-Klassendefinition zur Laufzeit ändern] (http://stackoverflow.com/questions/14268981/modify-a-class -definitions-annotation-string-Parameter-zur Laufzeit)? – aribeiro

+0

Ich würde gerne '@ActivationConfigProperty' verwenden, wenn es mir erlauben würde, die Werte in der Anmerkung zu ändern.Ich wusste nicht, dass das möglich ist. – Softey

+1

Die Verwendung der '@ ActivationConfigProperty' wie in [Beispiel 7-3] (http://docs.oracle.com/cd/E21764_01/web.1111/e15493/annotations.htm#WLMDB10008) und dann mit [Bill Burke's] Ansatz] (http://bill.burkecentral.com/2008/01/14/scanning-java-annotations-at-runtime/), um Ihre Anmerkungen zu scannen, könnte Ihr Problem lösen. – aribeiro

Antwort

0

Ich fand eine einfache Möglichkeit zum Ändern der Adressliste in Glassfish 4.0. Mit dieser Lösung können Sie den Rest Ihrer @ActivationConfigProperty weiterhin verwenden. Für mich, wenn ein Benutzer verwendet einen Setup-Skript für die Installation ich die folgenden Befehle ausführen kann:

asadmin server.jms-service.type = REMOTE 

asadmin set configs.config.server-config.jms-service.jms-host.default_JMS_host.host= 
"testserver.test.te.uk" 

asadmin restart-domain 

Sie setzen den Standard-JMS-Host REMOTE geben diese dann den Broker erzählen die Adresse in der Standard-JMS-Host definiert zu verwenden .

Anschließend legen Sie die Host-Adresse mit dem asadmin set-Befehl fest.

Sobald das erledigt ist, müssen Sie Ihren Glassfish neu starten.

Dies ist offensichtlich Glassfish Container abhängig, aber das ist alles was ich brauchte.

+0

Wahrscheinlich sollte erwähnt haben, dass es Ihnen nichts ausmachte, die App-Server-Konfiguration Ihres Clients zu ändern. Ihre Frage wurde so formuliert, als würden Sie nur nach codebasierten Lösungen suchen – kolossus

3

Eine Sache, die Sie versuchen können, ist die Verwendung eines @AroundConstruct Interceptor, um den Wert auf der MDB zur Laufzeit einzustellen. Es lohnt sich, darauf hinzuweisen, dass es zwar möglich ist, Platzhalter in Ihrer ejb-jar.xml-Datei zu verwenden, diese jedoch hauptsächlich containerabhängig ist und der offensichtliche Mangel an Lesestoff für Glassfish eine Quelle der Sorge für Sie sein sollte. Lassen Sie sich dies versuchen:

  1. einen Abfangjäger auf Ihrer MDB definieren:

    @MessageDriven 
    @Interceptors(AddressListInterceptor.class) 
    public class YourMDB 
    
  2. Definieren Sie Ihre Abfangjäger

    public class AddressListInterceptor { 
    
        @AroundConstruct 
        private void begin(InvocationContext iCtxt) { 
    
         /**load your property prior to this point */ 
    
    
         ActivationConfigProperty addressList = new ActivationConfigProperty{ 
    
                    public String propertyName(){ 
                    return "addressList"; 
                    } 
                    public String propertyValue(){ 
                    return theAddressList; 
                    } 
    
               public Class<? extends Annotation> annotationType(){ 
                 return ActivationConfigProperty.class; 
                }     
    
                   }; 
    
          try { 
           /**get the annotations, with the intention of adding yours (addressList) to the array using the method demonstrated in 
            http://stackoverflow.com/a/14276270/1530938 */ 
           Annotations[] annotations = iCtxt.getClass().getAnnotations(); 
    
           iCtxt.proceed(); //this will allow processing to continue as normal 
          } catch (Exception ex) { 
    
          } 
        } 
    

Neben der unglücklichen Notwendigkeit, die Anmerkungen scannen und ändern selbst, was Sie mit diesem Ansatz kaufen, ist, dass Sie in den Lebenszyklus des MDB eintreten und ihn modifizieren dürfen der Wert der Annotation, kurz bevor die Bean intantiiert wird. Zu der Zeit, die Bean in Betrieb genommen wird, wird es den Wert, den Sie festgelegt haben und alles in Ordnung sein sollte

+0

Vielen Dank für Ihre Antwort. Ich bin mir nicht sicher, wo Ihr Beispiel für die Einrichtung der MDB in eine tatsächliche MDB passt? Könnten Sie ein kleines Beispiel zum Injizieren durch Annotation geben? – Softey

+0

Sieht so aus, als hätte ich zu früh gesprochen. Aus irgendeinem Grund ging ich davon aus, dass Sie einen Nachrichtenproduzenten und keinen Verbraucher geschrieben haben. Es gibt wirklich keinen anderen Weg, als an den Anmerkungen herumzuhantieren. Siehe mein Update @Softey. P.S. Es ist wichtig, dass Sie hier bestätigen, dass Sie diese Lösung für sich arbeiten lassen können. Wenn nicht, muss ich die Antwort löschen, um niemanden zu täuschen, der auf dieser Seite landet. – kolossus

+0

Ich verstehe nicht, wie das funktioniert @kolossus. Wie setzt man den Interceptor von einer zustandslosen Bean (MDB) ab, der erst dann initiiert wird, wenn er eine Nachricht vom Producer erhält, der über die addressList-Eigenschaft verbunden ist? Ich würde verstehen, dies funktioniert für einen Singleton, aber nicht eine staatenlose MDB – Softey

Verwandte Themen