Až Vám zčerná obrazovka, přejděte na Linux!

Proč používat Linux
Zobrazují se příspěvky se štítkemJBoss. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemJBoss. Zobrazit všechny příspěvky

úterý 9. února 2010

JBoss 4.2 a kumulující se instance Stateless EJB

Asi týden jsem si hrál s J2EE aplikací Westico Visibility Platform a každou chvíli mi aplikace sletěla na OutOfMemoryError. Asi memory leak, řekl jsem si.
Stáhl jsem si tedy NetBeansy (qůli profileru) a začal hledat, kde tesař nechal v paměti díru. Zjistil jsem, že mi permanentně narůstá počet instancí dvou Session Stateless EJB, které volám z MDB ihned po sobě, těsně před ukončením zpracování zprávy. Protože provádím JMS ack ihned po příchodu zprávy, říkal jsem si, že si asi lookup vytvoří nové instance fazolí, ale požadavek neskončí a proto to bobtná. Dlouho jsem trasoval onu Message Driven Beanu, dokud jsem si opravdu nebyl jistý, že požadavek skončil a tudíž GC by měl odstranit "nepotřebné" instance a v poolu by měly zůstat jenom "potřebné". Tak jsem se zaměřil na pool a zjistil následující:
JBoss má oddělené pooly pro MDB a stateless EJB. Pro obejítí klasické Javovské synchronizace používá JBoss ThreadLocal pool. A v tom je právě šutr úrazu. Díky klasickému implicitnímu chování MDB se stane, že každý požadavek je zpracován jiným vláknem a tedy pool pro bezestavové fazole bobtná, přestože má nastaven maximální počet instancí v poolu.
Pokud tedy chcete v JBossu volat stateless EJB z MDB, musíte patřičné bezestavové fazoli nastavit jiný typ poolu. Ideálně org.jboss.ejb3.StrictMaxPool, a to třeba pomocí JBossí anotace @PoolClass, jak je popsáno zde.

Třeba to někomu zachrání kupu nervů.

středa 30. dubna 2008

Jak na JBossí WebServisy v IDEA

Po několika dnech Googlování a pokusů a omylů se mi konečně podařilo rozchodit první WebServisí komunikaci klient-servisa na zákeřné kombinaci: Windows XP, Sun J2SE 1.6.0_5, JBoss 4.2.2GA, IntelliJ IDEA 7.0.3

Co je třeba udělat:

  1. nainstalovat ony zmíněné produkty :-)
  2. nepoužívat implicitní JAVA_HOME/jre/lib/endorsed adresář, protože se buď nepodaří zkompilovat vygenerované stuby nebo začne řvát JBoss
  3. stáhnout si a nainstalovat jbossws patch:

    1. rozbalit (ideálně hned vedle jboss-4.2.2GA, ať to máte pohromadě)
    2. přejmenovat JBOSSWS_HOME/ant.properties.template na JBOSSWS_HOME/ant.properties
    3. v JBOSSWS_HOME/ant.properties nastavit propertu jboss422.home na JBOSS_HOME (např ../jboss-4.2.2GA)
    4. v JBOSSWS_HOME/build/build-deploy.xml odstranit závislost targetu deploy-jboss422 na undeploy-jboss422 (jinak na Vás zařve, že nemůže smazat soubory v JBOSS_HOME)
    5. pokud není ant v cestě, tak je třeba nastavit
      set "ANT_HOME=JBOSSWS_HOME\tools\ant"
      set "PATH=%ANT_HOME%\bin;%PATH%"

    6. v JBOSSWS_HOME spustit ant deploy-jboss422 - tím se do JBOSS_HOME/lib/endorsed nahrají patřičné jary JAXBčka


  4. napsat si servisu (Web a WebService (JAXB2.1, nikoli Axis))
  5. nadeployit servisu do JBossu
  6. založit projekt pro klienta (WebService client, JAXB2.1, nikoli Axis)
  7. vygenerovat stuby z WSDLka WebServisy
  8. upravit example.HelloWorldClient tak, aby zavolal onu servisu
  9. vytvořit Run Configuration pro klienta (typ Application)
  10. do VM Parameters dát "-Djava.endorsed.dirs=C:\Documents and Settings\tapik\.IntelliJIdea70 \system\webservices\jaxws-ri-2.1\"
  11. spustit a doufat, že funguje

Pokud funguje, je vymalováno.

pondělí 14. dubna 2008

Nefunkční oracle-xa-ds.xml z JBoss docs

Kdo z Vás se bude snažit rozchodit konexi na Oracle z JBossu, asi v první chvíli sáhne po JBossí dokumentaci. V kapitole Other Databases mají přímo ukázkový deployment descriptor pro oráklovký datový zdroj. Leč je v něm ašíbka (alespoň pro verzi 4.2.2), a to konkrétně v definici MBeany pro formátovač chyb z Oracle plynoucích.

<mbean code="org.jboss.resource.adapter.jdbc.xa.oracle.
OracleXAExceptionFormatter"
name="jboss.jca:service=OracleXAExceptionFormatter">
<depends optional-attribute-name="TransactionManagerService">
jboss:service=TransactionManager
</depends>
</mbean>

Jenomže OracleXAExceptionFormatter není v balíku org.jboss.resource.adapter.jdbc.xa.oracle, alébrž v org.jboss.resource.adapter.jdbc.vendor. A pak se můžete divit, že vám z toho lítají CNFE: ClassLoaderNotFound.