Freitag, 31. Dezember 2010

Links / Spring AOP

Anbei zwei nette Links (insbesondere der zweite ist lesenswert) zum Thema Dependency Injection (DI) und aspect oriented programming (AOP) mit Spring. Viel Spaß beim Lesen...

Dependency Injection Tutorial:

http://code.google.com/p/arc-pocs/wiki/DIIntroTutorial

Spring AOP:
http://java.dzone.com/articles/introduction-spring-aop?page=0,0

Mittwoch, 29. Dezember 2010

JBoss6 Final ist released!

Die Version 6.0.0.Final von JBoss ist nun zum Download verfügbar :)

http://planet.jboss.org/post/jbossas6_0_0_final_released

Montag, 27. Dezember 2010

HowTo: Einrichten von JTA unter JBoss5 / JPA / Spring3

Ich habe gerade in einer Bespielanwendung versucht, eine Anwendung mit Spring 3 / JBoss5 und JTA einzurichten. Ziel war es, verteilte Transaktionen mittels JTA durchführen zu können. Dabei habe ich JPA und den EntityManager eingesetzt, um die Entities zu persistieren. Dabei war es zuerst mal wichtig, eine XA-Datasource einzurichten (siehe mein letzter Post). Desweiteren sind folgende Einstellungen vorgenommen worden:

applicationContext.xml (Spring-Konfiguration):


<context:component-scan base-package="de.mortensenit" />
<context:annotation-config />
<tx:jta-transaction-manager />
<tx:annotation-driven />


persistence.xml:


<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="memphisPU" transaction-type="JTA">
<jta-data-source>java:/memphisdb</jta-data-source>
<properties>
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.transaction.manager_lookup_class"
value="org.hibernate.transaction.JBossTransactionManagerLookup" />
</properties>
</persistence-unit>
</persistence>


Beispielhafte DAO-Implementierung:


package de.mortensenit.memphis.dao.jpa;

import java.util.Date;
import java.util.Locale;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import de.mortensenit.memphis.dao.AccountServiceDao;
import de.mortensenit.memphis.model.Client;
import de.mortensenit.memphis.model.User;

/**
* JPA implementation for the needed CRUD operations listed in the DAO API
* module.
*
* @author Frederik Mortensen
*
*/
@Repository
public class AccountServiceDaoJpa extends AbstractDaoJpa implements
AccountServiceDao {

@Autowired
private ApplicationService applicationService;

@Override
@Transactional
public void save(Client client) {

try {
User user = new User();
user.setDeleted(false);
user.setLanguage(Locale.GERMAN);
user.setLastLogin(new Date());
user.setName("name...");
user.setPassword("pass...");
user.setRegistrationDate(new Date());

applicationService.getEntityManager().joinTransaction();
applicationService.getEntityManager().persist(user);
applicationService.getEntityManager().flush();

} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}

}

}


Erzeugung einer EntityManager Instanz beispielhaft:


package de.mortensenit.memphis.dao.jpa;

import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.springframework.stereotype.Service;

/**
* Application wide settings that will be loaded with spring context
* initialization
* http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/configuration.html
*
* @author Frederik Mortensen
*
*/
@Service
public class ApplicationService {

private EntityManagerFactory entityManagerFactory;
private EntityManager entityManager;

@SuppressWarnings("unused")
@PostConstruct
private void init() {
entityManagerFactory = Persistence.createEntityManagerFactory("memphisPU");
entityManager = entityManagerFactory.createEntityManager();
}

public EntityManager getEntityManager() {
return entityManager;
}

public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}

}


Dabei erzeugt die Spring Annotation @Transactional die gewünschte Transaktion und kann auch über mehrere Methoden hinweg gesetzt werden. Nur, wenn keine dieser Methoden eine RuntimeException wirft, wird ein Commit gemacht. Entscheidend war hier der Aufruf der joinTransaction() - Methode, ohne die der EntityManager zwar nicht gemurrt hat beim persist, ein Commit fand jedoch nie statt. Dies funktioniert nun. Nähere Infos dazu gibt es auch unter folgendem Link, den ich mir noch einmal in Ruhe zu Gemüte führen werde und weiterempfehle:

http://en.wikibooks.org/wiki/Java_Persistence/Transactions

Postgres XA Datasource - JTA - Distributed Transactions

Hier mal eine Beispiel-Datasource für JBoss und Postgres, wenn man verteilte Transaktionen über JTA nutzen möchte. Hierfür wird eine XA Datasource benötigt:


<?xml version="1.0" encoding="UTF-8"?>

<!-- ===================================================================== -->
<!-- -->
<!-- JBoss Server Configuration -->
<!-- -->
<!-- ===================================================================== -->
<!-- Datasource config for Postgres 8.x *** with XA transactions *** -->
<!-- ==================================================================== -->

<datasources>
<xa-datasource>
<jndi-name>memphisdb</jndi-name>

<xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
<xa-datasource-property name="ServerName">localhost</xa-datasource-property>
<xa-datasource-property name="PortNumber">5432</xa-datasource-property>

<xa-datasource-property name="DatabaseName">memphis</xa-datasource-property>
<xa-datasource-property name="User">memphis</xa-datasource-property>
<xa-datasource-property name="Password">memphis</xa-datasource-property>

<track-connection-by-tx></track-connection-by-tx>
</xa-datasource>
</datasources>

Sonntag, 26. Dezember 2010