Πώς να γράψετε ένα προσαρμοσμένο στοιχείο OSGi WSO2;

Θέλετε να μάθετε πώς να αναπτύξετε μια υπηρεσία OSGi; Εδώ θα αναπτύξουμε μια απλή εφαρμογή με OSGi και θα την δοκιμάσουμε σε πλατφόρμα WSO2 Carbon, η οποία είναι ένα αρθρωτό, ελαφρύ πλαίσιο ανάπτυξης OSGi που βασίζεται σε διακομιστές. Ήδη έχετε μπερδευτεί σχετικά με το τι είναι το OSGi; Μην ανησυχείτε ότι θα το εξηγήσω σύντομα. Οι αναγνώστες αναμένεται να έχουν προηγούμενη εμπειρία στην ανάπτυξη Java και Apache Maven. Αφήνει να βουτήξει :)

Πρώτα απ 'όλα, πριν βάλετε τα δάχτυλά μας στο πληκτρολόγιο και ξεκινήστε την κωδικοποίηση, επιτρέψτε μου να εξηγήσω ποια είναι η πραγματική ιδέα πίσω από τη χρήση του OSGi σε εφαρμογές. Η πρωτοβουλία OSGi (Open Services Gateway) είναι ένα συστατικό πλαίσιο για την Java που ορίζει μια αρχιτεκτονική για την ανάπτυξη αρθρωτών εφαρμογών. Αυτό μας δίνει την ευελιξία να εγκαταστήσουμε, να ξεκινήσουμε, να σταματήσουμε, να ενημερώσουμε και να απεγκαταστήσουμε από απόσταση εφαρμογές που έχουν τη μορφή δεσμών για ανάπτυξη χωρίς να απαιτείται επανεκκίνηση. Σούπερ δροσερό δικαίωμα; Υπάρχουν διάφορες υλοποιήσεις OSGi όπως το Equinox, το Knopflerfish και το Felix. Σε αυτό το σεμινάριο ως δοχείο OSGi θα χρησιμοποιήσουμε εφαρμογή Eclipse OSGi Container, Equinox (Eclipse Equinox χρησιμοποιείται ως OSGi runtime σε WSO2 Carbon Platform). Ακόμα δεν είναι σαφές; Μην ανησυχείτε. Συνεχίστε να διαβάζετε ότι θα το καταλάβετε σύντομα. Ας προχωρήσουμε στην κωδικοποίηση.

Σε αυτό το άρθρο θα δημιουργήσω πρώτα δύο έργα Maven. ολιγοπαραγωγός και οσγγοσυντηρητής. Στο πρόγραμμα osgiproducer, η υπηρεσία OSGi είναι γραμμένη και στο έργο osgiconsumer, η προηγουμένως γραπτή υπηρεσία OSGi θα καταναλωθεί.

Ας πάρουμε τα χέρια μας για τη δημιουργία του έργου osgiproducer ως το πρώτο στάδιο ακολουθώντας τα παρακάτω απλά βήματα.

1. pom.xml



     4.0.0 

    
         org.wso2 
         wso2 
        <έκδοση> 1 
    

     com.example.osgiproducer 
     osgiproducer 
    <έκδοση> 1.0.0-SNAPSHOT 

    <συσκευασία> δέσμη 

    
        
            
                 org.apache.felix 
                 maven-scr-plugin 
                <έκδοση> 1.9.0 
            
            
                 org.apache.felix 
                 maven-bundle-plugin 
                 true 
                
                    <οδηγίες>
                         $ {project.artifactId} 
                         $ {project.artifactId} 
                         com.example.osgiproducer.package01.internal, 
                        <Εισαγωγή-Πακέτο>
                            org.osgi.framework,
                            org.osgi.service.component,
                        
                        
                            ! com.example.osgiproducer.package01.internal.ProducerComponent,
                            com.example.osgiproducer.package01. *; version = "1.0.0-SNAPSHOT"
                        
                    
                
            
        
    

    <εξαρτήσεις>
        <εξάρτηση>
             org.eclipse.osgi 
             org.eclipse.osgi 
            <έκδοση> 3.9.1.v20130814-1242 
        
        <εξάρτηση>
             org.eclipse.osgi 
             org.eclipse.osgi.services 
            <έκδοση> 3.3.100.v20130513-1956 
        
    
    

Ας δούμε προσεκτικά τις προαναφερθείσες διαμορφώσεις POM.

<συσκευασία> δέσμη 

Εδώ πρέπει να διαμορφώσουμε το maven για να κατασκευάσουμε μια δέσμη OSGi ορίζοντας το στοιχείο συσκευασίας ως δέσμη. Το Bundle είναι ένα JAR με πρόσθετες δηλώσεις που χρησιμοποιούνται από το πλαίσιο OSGi για τον εντοπισμό των υπηρεσιών.


    ! com.example.osgiproducer.package01.internal.ProducerComponent,
    com.example.osgiproducer.package01. *; version = "1.0.0-SNAPSHOT"

Το αντιπροσωπεύει τη λίστα των πακέτων για την εξαγωγή της δέσμης. Αυτά τα πακέτα θα αντιγραφούν στην προκύπτουσα δέσμη JAR. Μπορούμε να αποκλείσουμε τα πακέτα που δεν θέλουμε να εισαγάγουμε χρησιμοποιώντας την άρνηση (!). Σημειώστε ότι είναι υποχρεωτικό να χρησιμοποιείτε τα πλήρως πιστοποιημένα ονόματα όταν καλείτε τις σχετικές κλάσεις και πακέτα. Ο σκοπός της εξαγωγής πακέτων θα εξηγηθεί αργότερα κατά την προσθήκη των ρυθμίσεων POM στο έργο osgiconsumer.

Ένα άλλο βασικό γεγονός που πρέπει να αναφέρω είναι το .

 com.example.osgiproducer.package01.internal, 

Εδώ έχουμε προσθέσει το πλήρες όνομα του πακέτου όπου είναι γραμμένο το στοιχείο υπηρεσίας. Είναι μια συνήθης πρακτική στο WSO2 να έχει το στοιχείο της υπηρεσίας σε ένα υποσύνολο που ονομάζεται εσωτερική και να μην έχει αυτή την κατηγορία υπηρεσιών εξάγεται από τη δέσμη.

<Εισαγωγή-Πακέτο>
    org.osgi.framework,
    org.osgi.service.component,

<Εισαγωγή-Πακέτο> υποδηλώνει τα πακέτα που απαιτούνται από τα πακέτα που περιέχει η δέσμη.

2. Διεπαφή παραγωγού

πακέτο com.example.osgiproducer.package01;

Δημόσια διεπαφή Παραγωγός {

    άκυρη παραγωγή (όνομα στοιχειοσειράς);
}}

3.Η κλάση ProducerImpl

πακέτο com.example.osgiproducer.package01;

εισαγωγή java.util.logging.Logger;

Δημόσια τάξη ΠαραγωγόςImpl εφαρμόζει Παραγωγός {

    ιδιωτικό στατικό τελικό Logger LOGGER = Logger.getLogger (ProducerImpl.class.getName ());

    @Καταπατώ
    Δημόσια κενή παραγωγή (όνομα στοιχειοσειράς) {
        
        LOGGER.info ("Έχει παραχθεί με επιτυχία:" + όνομα);
      
    }}
}}

4. Τάξη παραγωγούComponent

πακέτο com.example.osgiproducer.package01.internal;

εισαγωγή com.example.osgiproducer.package01.Producer;
εισαγωγή com.example.osgiproducer.package01.ProducerImpl;
εισαγωγή org.osgi.framework.BundleContext;
εισαγωγή org.osgi.service.component.annotations.Activate;
εισαγωγή org.osgi.service.component.annotations.Component;

@Component (όνομα = "com.example.osgiproducer.package01.internal.ProducerComponent",
        άμεση = αληθής)
δημόσια τάξη ΠαραγωγόςComponent {

    @Θέτω εις ενέργειαν
    προστατεύεται άκυρη ενεργοποίηση (BundleContext bundleContext) {

        bundleContext.registerService (Παραγωγός.class, νέος ProducerImpl (), null);
    }}
}}

Σημειώστε ότι όπως αναφέρθηκε προηγουμένως, η κλάση ProducerComponent θα πρέπει να βρίσκεται μέσα σε ένα πακέτο που ονομάζεται εσωτερική.

Η δομή του φακέλου του έργου θα μοιάζει με αυτό,

Τέλος, δημιουργήστε το έργο κάνοντας κλήση της εντολής maven clean install και θα αποκτήσετε το δημιουργημένο osgiproducer-1.0.0.-SNAPSHOT.jar μέσα στο φάκελο προορισμού.

Τώρα, ας δημιουργήσουμε το έργο osgiconsumer ακολουθώντας τα παρακάτω βήματα.

  1. pom αρχείο


     4.0.0 

    
         org.wso2 
         wso2 
        <έκδοση> 1 
    

     com.example.osgiconsumer 
     osgiconsumer 
    <έκδοση> 1.0.0-SNAPSHOT 

    <συσκευασία> δέσμη 

    
        
            
                 org.apache.felix 
                 maven-scr-plugin 
                <έκδοση> 1.9.0 
            
            
                 org.apache.felix 
                 maven-bundle-plugin 
                 true 
                
                    <οδηγίες>
                         $ {project.artifactId} 
                         $ {project.artifactId} 
                         com.example.osgiconsumer.package01.internal, 
                        <Εισαγωγή-Πακέτο>
                            org.osgi.framework,
                            org.osgi.service.component,
                            com.example.osgiproducer.package01. *; version = "1.0.0-SNAPSHOT"
                        
                        
                            ! com.example.osgiconsumer.package01.internal.ConsumerComponent,
                            com.example.osgiconsumer.package01. *; version = "1.0.0-SNAPSHOT"
                        
                    
                
            
        
    

    <εξαρτήσεις>
        <εξάρτηση>
             org.eclipse.osgi 
             org.eclipse.osgi 
            <έκδοση> 3.9.1.v20130814-1242 
        
        <εξάρτηση>
             org.eclipse.osgi 
             org.eclipse.osgi.services 
            <έκδοση> 3.3.100.v20130513-1956 
        
        <εξάρτηση>
             com.example.osgiproducer 
             osgiproducer 
            <έκδοση> 1.0.0-SNAPSHOT 
             provided 
        
    


Δεν θα εξηγήσω ξανά για τις διαμορφώσεις του POM, αλλά υπάρχει ένα γεγονός που θα ήθελα να επισημάνω.

<Εισαγωγή-Πακέτο>
    org.osgi.framework,
    org.osgi.service.component,
    com.example.osgiproducer.package01. *; version = "1.0.0-SNAPSHOT"

Παρατηρήστε ότι πρέπει να εισαγάγουμε το πακέτο που έχουμε εξάγει στο έργο osgiproducer και θα ήθελα και πάλι να τονίσω το γεγονός ότι πρέπει να ονομαστεί χρησιμοποιώντας το πλήρως καταρτισμένο όνομα.

2.Η κλάση Καταναλωτών

πακέτο com.example.osgiconsumer.package01.internal;

εισαγωγή com.example.osgiproducer.package01.Producer;
εισαγωγή org.osgi.framework.BundleContext;
εισαγωγή org.osgi.service.component.annotations.Activate;
εισαγωγή org.osgi.service.component.annotations.Component;
εισαγωγή org.osgi.service.component.annotations.Reference;
εισαγωγή org.osgi.service.component.annotations.ReferenceCardinality;
εισαγωγή org.osgi.service.component.annotations.ReferencePolicy;


@Component (όνομα = "com.example.osgiconsumer.package01.ConsumerComponent",
        άμεση = αληθής)
δημόσια τάξη ConsumerComponent {
    Παραγωγός παραγωγός = null;

    @Θέτω εις ενέργειαν
    προστατεύεται άκυρη ενεργοποίηση (BundleContext bundleContext) {
        παραγωγός.produce ("συνιστώσα παραγωγού") ·
    }}

    @Reference (όνομα = "manufacturerService", service = Παραγωγός.class,
                cardinality = ΑναφοράCardinality.MANDATORY, πολιτική = ReferencePolicy.DYNAMIC, unbind = "unbindService")
    προστατευμένο κενό μητρώοΥπηρεσία (παραγωγός παραγωγού) {
        this.producer = παραγωγός.
    }}

    protected void unbindService (Παραγωγός παραγωγός) {

    }}
}}

Παρατηρήστε ότι η κλάση ConsumerComponent βρίσκεται μέσα στο εσωτερικό υποσύνολο.

Η δομή του φακέλου του έργου θα μοιάζει με αυτό,

Κατασκευάστε το έργο και θα λάβετε το ακόλουθο αρχείο jar.

Τώρα δοκιμάστε την υπηρεσία OSGi που έχουμε γράψει. Όπως αναφέρθηκε στην αρχή αυτού του άρθρου, θα δοκιμάσουμε τον κώδικα μας στην πλατφόρμα WSO2 Carbon.

Κλωνοποιήστε https://github.com/wso2/carbon-kernel. Έλεγχος στο υποκατάστημα 4.4.x και δημιουργία του έργου με την εντολή "mvn clean install".

Στη συνέχεια, πηγαίνετε στον τόπο εγκατάστασης άνθρακα-πυρήνα -> διανομή -> προϊόν -> ενότητες -> διανομή -> στόχος. Θα δείτε ένα δυαδικό πακέτο (αρχείο ZIP) μέσα στον κατάλογο προορισμού. Εξαγάγετε αυτό το φερμουάρ σε μια προτιμώμενη τοποθεσία. Από τη στιγμή που γράφω αυτό το άρθρο θα χρησιμοποιήσω την έκδοση wso2carbon-4.4.18-SNAPSHOT. Θα αναφερθώ σε αυτό ως (κατάλογος στον οποίο εγκαταστήσατε τη διανομή του προϊόντος).

Μεταβείτε στο -> αποθήκη -> στοιχεία -> dropins. Αντιγράψτε τα 2 δημιουργημένα αρχεία JAR στο φάκελο dropins.

Τώρα είμαστε έτοιμοι να ελέγξουμε αν η υπηρεσία μας OSGi λειτουργεί σωστά. Πρώτα πρέπει να ξεκινήσουμε το διακομιστή και στη συνέχεια να ελέγξουμε εάν είναι ενεργοποιημένες οι 2 δέσμες υπηρεσιών OSGi. Για αυτό πρέπει να ξεκινήσουμε το διακομιστή με την κονσόλα OSGi.

Μεταβείτε στον κατάλογο -> bin και ανοίξτε μια γραμμή εντολών. Εκτελέστε μία από τις ακόλουθες εντολές:

  1. Για χρήστες των Windows:

wso2server.bat -run -DosgiConsole

2. Για το χρήστη Linux:

sh wso2server.sh -DosgiConsole

Τώρα, τα αρχεία καταγραφής εκκίνησης του διακομιστή θα εκτυπωθούν. Όταν ολοκληρωθεί η εκκίνηση του διακομιστή, αναζητήστε το ακόλουθο μήνυμα καταγραφής που επισημαίνεται στην εικόνα.

Πατήστε το κουμπί εισαγωγής όταν ο διακομιστής ολοκληρώσει την εκκίνηση. Στη συνέχεια θα πάρετε την κονσόλα osgi. Εκτελέστε την εντολή "ss". Στη συνέχεια, θα λάβετε μια επισκόπηση όλων των διαθέσιμων δεσμών OSGi με τις τρέχουσες καταστάσεις τους και τα πακέτα ταυτότητας που αντιστοιχούν στην παρακάτω εικόνα.

Πηγαίνετε στη λίστα και θα δείτε τα 2 αρχεία JAR που αντιγράψαμε στο φάκελο dropins με την κατάσταση ως ενεργή.

Εκτελέστε την εντολή "b " για να λάβετε πληροφορίες σχετικά με τη δέσμη, συμπεριλαμβανομένων των καταχωρημένων και των χρησιμοποιούμενων υπηρεσιών.

Τέλος, φτάσαμε στο τέλος αυτού του σεμιναρίου. Ας ελπίσουμε ότι αυτό το σεμινάριο έχει δώσει μια αρχή για τον τρόπο χρήσης του OSGi.

Ανατρέξτε στους παρακάτω συνδέσμους για τον πηγαίο κώδικα.

Τώρα είναι ώρα να βγείτε εκεί και να γράψετε κάποιες υπηρεσίες OSGi!