Psyclone:
fyrstu skrefin
Markmið: Að búa til tvö lítil forrit sem nota Psyclone og OpenAIR til að birta og sækja skilaboð.
Forkröfur eru: grunnþekking á XML, Java og hlutbundinni forritun. Einnig er gott að vita hvernig tölvur hafa samskipti sín í milli en ekki nauðsynlegt.
Tól sem þarf:
OpenAIR,
Psyclone,
Java SDK 1.4.2, og og einhvert þróunarumhverfi t.d.
Eclipse
Psyclone er grunnur (e. platform) til að byggja dreift kerfi á. Hann er þróaður af CMLabs og miðast við að gera samskipti milli ólíkra forrita auðveld og einföld. Psyclone er til fyrir 3 stýrikerfi enn sem komið er þ.e. Windows, Mac OS X og Linux. Psyclone notast við ákveðinn samskiptastaðall sem nefnist OpenAIR. OpenAIR var upphaflega búinn til af CMLabs en er nú viðhaldið af Mindmakers. OpenAIR notast eingöngu við staðlað XML og TCP/IP í öll samskipti og þar af leiðandi er hægt að nota hann jafnt á lokuðu innraneti sem og Internetinu.
Til að útskýra nánar hvernig Psyclone virkar þá er mynd hér að neðan sem sýnir þá virkni sem við ætlum að útfæra.
![](images/psyclone01.jpg)
Það er rétt að benda á að með þessari hönnun þá getur JavaPoster, sem sjá má á myndinni, gerst áskrifandi að eins mörgum "krítartöflum" (t.d. WB1) og hann kýs. Á sama hátt þá getur JavaReader, sem sjá má á mynd, birt upplýsingar á eins mörgum "krítartöflum" og hann óskar eftir.
Það sem verður kennt að þessu sinni er hvernig hægt er að búa til einfalt dreift kerfi sem notar Psyclone sem miðpunkt og OpenAIR til að koma skilaboðum til og frá. Áður en lengra er haldið þá er réttast að útskýra lítillega hvernig OpenAIR skilaboð líta út þó án þess að fara út í nákvæmlega hvernig þau virka. Fyrir þá sem hafa áhuga á að lesa nánari lýsingu á OpenAIR staðlinum þá er hægt að nálgast formlega lýsingu hér. Eins og áður sagði þá notast OpenAIR við XML í skilaboðum. Dæmi um slík skilaboð má sjá hér að neðan.
<message priority="5" timetolive="500">
<id>1f7c9745-db80-4b31-af64-5e089fddf623</id>
<type>Internal.Status.Report</type>
<from>Domino-Module-3000-B</from>
<to>Blackboard-1</to>
<cc>Domino-5500</cc>
<comment>My own comment</comment>
<stored>Blackboard-1000</stored>
<inreplyto>
<reference
id="1590997-db80-4b31-af64-5e089fddf623882590"
stored="Blackboard-1000"
sec="1076264657"
msec="101"/>
</inreplyto>
<postedtime
sec="1076264657"
msec="110"
text="08.02.2004 18:24:17:110"/>
<receivedtime
sec="1076264657"
msec="111"
text="08.02.2004 18:24:17:111"/>
<content language="XML" version="1.0">
<mycontentspecifictag>My private content</mycontentspecifictag>
</content>
<history>
<group author="CoolModule-200">
<reference
id="1590997-db80-4b31-af64-5e089fddf623882590"
stored="Blackboard-1000"
sec="1076264659"
msec="101"/>
</group>
<group author="CoolModule-200">
<reference
id="4b31-1590997-db80-af64-5e089fddf623882590"
stored="Blackboard-1000"
sec="1076263550"
msec="101"/>
<reference
id="db80-1590997-4b31-af64-5e089fddf623882590"
stored="Blackboard-1000"
sec="1076264457"
msec="101"/>
</group>
</history>
<origin>92.168.0.1</origin>
</message>
Eins og sést hér að ofan þá eru þessu skilboð ekki ýkja flókin og frekar auðvelt er að gera sér grein fyrir því hvaða merkingu hver hluti skilaboðana hefur. Efst í skilaboðunum er haus þar sem fram kemur id, type, from, to og cc. Eins og glöggir lesendur hafa eflaust áttað sig á þá svipar þessi haus mjög til venjulegra e-mail skilaboða. Næst koma svo upplýsingar um það hvort skilaboðin eru send að frumkvæði forrits eða hvort þau eru ætluð sem svar við öðrum skilaboðum, hvenær þau voru send og hvenær þau voru móttekin. Svo kemur að aðalhluta skilaboðana þ.e.a.s. hin raunverulegu skilaboð eða content. Saga skilaboðana kemur svo næst þ.e.a.s. hvar þau hafa verið geymd og hvaða hópar hafa notað þau. Loks kemur svo IP-tala þess sem sendi skilaboðin.
Þessi skilaboð eru eins og áður sagði einföld. Lesendur þurfa þó ekki að hafa áhyggjur af því hvernig þessi skilaboð virka og því við munum ekki fara nánar í þau. Kynningin er þau nauðsynleg og má einna helst líkja þessu við það að sá sem er að læra að keyra bíl þarf helst að vita að það er vél undir húddinu og hún gengur fyrir bensíní eða dísel án þess að farið sé nánar út í það.
Við þurfum að skoða eitt atriði áður en við vindum okkur í forritunina og það er Psyclone forritið sjálft. Við ætlum ekki að fara mjög djúpt í það hvað Psyclone er fær um að gera að þessu sinni. Við munum eingöngu skoða þá þætti Psyclone sem við komum til með að nota sem og grunnvirkni hans. Í grófum dráttum má líta á Psyclone sem nokkurs konar krítartöflu og forritin sem við ætlum að skrifa lesa og skrifa á þessa krítartöflu. Psyclone getur haft eina eða fleiri krítartöflur. Það eina sem forritin (sem ætla að hafa samskipti) þurfa að gera er að gerast "áskrifandi" að einni slíkri töflu. Þetta virkar nú ekkert æðislega flókið eða hvað? Nei, enda miðar hönnun Psyclone við það að samskipti séu auðveld þannig að þeir sem nýta sér Psyclone geti eytt sínu púðri í eigin forrit. Til að geta keyrt og notað forritin sem við ætlum að skrifa hér að neðan þá þurfum við að kveikja á Psyclone. Það er gert með því að ná í forritið og tvísmella á psyclone.exe skránna. Þegar það er gert þá ræsist Psyclone upp og fer sjálfkrafa að hlusta á port 10000. Það er hægt að kveikja á Psyclone þannig að hann hlusti á annað port en við munum ekki fara í hvernig það er gert að svo stöddu.
Nú þegar við höfum aðeins litið á það hvernig ástandið er undir húddinu þá liggur beinast við að keyra af stað. Við munum að þessu sinni skrifa tvö forrit. Eitt til að senda inn upplýsingar og annað sem nær í upplýsingar. Við byrjum á forritinu sem skrifar upplýsingar því að lesari er frekar gagnslaus ef ekkert er til að lesa :). Gott er að hafa þennan kóða til hliðsjónar þar sem ekki er farið nákvæmlega í allan kóðann hér á eftir
Eins og venjulega þá byrjum við á að segja forritinu hvaða pakka við ætlum að nota.
import com.cmlabs.air.*;
Til að geta skrifað skilaboð þá þurfum við að útfæra (e. implement) ákveðið viðmót (e. interface) sem nefnist MessageAcceptor. Það gerum við með eftirfarandi kóða
public class JavaPoster implements MessageAcceptor
Í JavaPoster klasanum okkar þurfum við að búa til tilvik af JavaAIRPlug svo við getum átt í OpenAIR samskiptum við einhvern.
private JavaAIRPlug plug;
public JavaPoster( String host, int port )
{
plug = new JavaAIRPlug( "JavaPoster", host, port, this );
...
Ætlunin er að smíða forritið þannig að í hvert skipti sem ýtt er á Enter takkann á lyklaborðinu á meðan forritið er í keyrslu þá eru send skilaboð á Psyclone forritið sem við ræstum áðan. Ekki verður sýnt hvernig á að skrifa hlutann sem hlustar á enter og kallar á post() fallið (sjá að neðan) en hægt er að sjá hvernig það er gert með því að sækja skránna sem fylgir þessum leiðbeiningum hér að neðan.
public void post()
{
Time now = new Time();
System.out.println( now.printTime() +
": JavaPoster: posting message of type " +
"My.Test.Message.Type to Whiteboard WB1..." );
boolean posted = plug.postMessage( "WB1", "My.Test.Message.Type",
"TEST_CONTENT", "English", "" );
if ( !posted )
{
System.out.println( "JavaPoster: could not post message of type" +
"My.Test.Message.Type to Whiteboard WB1" );
}
}
Hér höfum við búið til fall sem birtir upplýsingar af taginu My.Test.Message.Type á krítartöflu sem við köllum WB1. Þetta er allt og sumt nú höfum við forrit sem notar JavaAIRPlug til að birta upplýsingar á krítartöflu sem hýst er í Psyclone forritinu.
Við erum þó ekki alveg búin þar sem við ættluðum að búa til forrit sem les af krítartöflunni líka. Það er í raun einfaldara heldur en að skrifa upplýsingar því það eina sem við þurfum að gera er að búa til forrit sem gerist "áskrifandi" að krítartöflunni. Þegar við höfum gert það þá lætur Psyclone okkur vita í hvert skipti sem eitthvað bætist á krítartöfluna sem við getum lesið.
Við byrjum á nákvæmlega sama hátt og áðan við sækjum pakkana sem við ætlum að nota og búum til tilvik af JavaAIRPlug.
public class JavaReader implements MessageAcceptor
private JavaAIRPlug plug;
public JavaReader( String host, int port )
{
plug = new JavaAIRPlug( "JavaReader", host, port, this );
...
Nú þurfum við að gerast áskrifendur að krítartöflunni sem forritið sem við skrifuðum áðan er að birta upplýsingar á.
if ( !plug.openTwoWayConnectionTo( "WB1" ) )
{
System.out.println( "Could not open callback connection to WB1..." );
}
if ( plug.addTrigger( "WB1", "My.Test.Message.Type" ).length() == 0 )
{
System.out.println( "Could not register for messages of type" +
"My.Test.Message.Type..." );
}
else
{
System.out.println( "Listening for messages of type My.Test.Message.Type..." );
}
Hér byrjum við á að segja Psyclone að við viljum fá áskrift að krítartöflunni WB1. Því næst látum við vita af því að við viljum fá að vita ef ný skilaboð af gerðinni My.Test.Message.Type eru birt á krítartöflunni.
Þetta er samt ekki alveg nóg því að við þurfum að skrifa í forritið hvað við ætlum að gera ef við fáum skilaboð af þessari tegund þ.e.a.s. skilaboð af tegundinni My.Test.Message.Type. Það gerum við með því að útfæra fall í MessageAcceptor sem nefnist acceptMessage.
public Message acceptMessage( Message message )
{
Time now = new Time();
Message msg = MessageProcessor.getTriggerMessage( message );
ObjectCollection msgs = MessageProcessor.getRetrievedMessages( message );
RawXML phasespec = MessageProcessor.getPhaseSpec( message );
if ( ( phasespec == null ) || ( msgs == null ) || ( msg == null ) )
{
System.out.println( "JavaReader: received faulty wakeup message..." );
}
else
{
System.out.println( now.printTime() + ": JavaReader: received wakeup"+
"message from " + msg.from );
}
return null;
}
Hér meðhöndlum við skilaboð og prentum út frá hverjum við fengum þau og klukkan hvað.
Nú höfum við lokið við gerð skrifara og lesara sem nota Psyclone til að hafa samskipti sín í milli. Eins og við nefndum í upphafi og vonum að við höfum sýnt fram á það er hversu einfalt er að nota Psyclone og það að forrita lesara og skrifara sem nota Psyclone til að eiga samskipti sín í milli er frekar einfalt. Þeir sem vilja nálgast kóðann að þessu verkefni geta sótt hann hér. Ég set þetta fram sem tvo aðskilin forrit, JavaReader og JavaPoster
Hægt er að nálgast forritin tvo í keyranlegu formi hér. Til að forritin virki þarf fyrst að keyra psyclone.exe.