BMT EJB Как использовать UserTransaction - PullRequest
0 голосов
/ 07 февраля 2012

Я пытаюсь создать пример BMT EJB и вручную управлять транзакцией, но при попытке запуска я получаю исключение NullException и не понимаю, что делаю неправильно.Вот код:

@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
@Local(GlobalTLocal.class)
public class GlobalT implements GlobalTLocal {

@Resource
  private UserTransaction utx;

public GlobalT() {
}

@Override
public void sincroniza() {



    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
    env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
    env.put(Context.PROVIDER_URL, "jnp://localhost:1099");
    Connection con = null;
    Statement stmt = null;
    ResultSet rs = null;






    try {


        String sqlPostgres = "SELECT * FROM RH.RHINFORMIX";
        String insert = "INSERT INTO RH.RHINFORMIX (id_agente,fk_codigo_area,nome,email,excluido,tipoinclusao,id,teste)"+
                 " VALUES (11,11,'teste','teste',false,'I',12,'teste')";






        InitialContext ic = new InitialContext(env);
        DataSource ds = (DataSource) ic.lookup("jdbc/RHMigracaoPostgres");





        con = ds.getConnection();

        utx.begin();

//          con.setAutoCommit(false);

        stmt = con.createStatement();

        rs = stmt.executeQuery(sqlPostgres);
        while (rs.next()) {
            System.out.println("Query '" + sqlPostgres + "' returned "
                    + rs.getString(3));
        }

        stmt.executeUpdate(insert);

//          con.commit();


 //         if(true){

  //                throw new Exception();
   //           }

        utx.commit();
    } catch (Exception e) {
        try {
            utx.rollback();
        } catch (Exception e1) {

            e1.printStackTrace();
        }
        e.printStackTrace();
    } finally{
        if(rs != null)
            try {
                rs.close();
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        if(stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}




}

Когда я запускаю этот класс, я получаю следующую ошибку:

java.lang.NullPointerException
at br.gov.dprf.GlobalT.sincroniza(GlobalT.java:94)
at Principal.main(Principal.java:11)
java.lang.NullPointerException
at br.gov.dprf.GlobalT.sincroniza(GlobalT.java:71)
at Principal.main(Principal.java:11)

Этот EJB развернут на подаче Jboss 4.2.2, и нет ошибкиво время запуска Jboss, и мы можем увидеть журнал развернутого EJB:

15:51:33,529 INFO  [EJB3Deployer] Deployed: file:/C:/Jboss-Limpos/jboss-4.2.2.GA/server/all/deploy/GlobalTransaction.jar

Я пытаюсь заставить UserTransaction зафиксировать вставку для меня !!!

Что яне так?

Ткс

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Если вы используете основной класс, то вы должны запустить с использованием контейнера приложения-клиента , и ваш @Resource должен быть статическим полем в основном классе, а не в создаваемом вами объекте. Однако обратите внимание, что спецификация платформы JavaEE не требует, чтобы клиентские контейнеры приложения поддерживали UserTransaction. Если JBoss не поддерживает UserTransaction в своем клиентском контейнере приложения, тогда вы можете выбрать следующие варианты:

  1. Используйте локальные транзакции в вашем клиенте и игнорируйте функции EE. Другими словами, setAutoCommit (false) и написать код JDBC для подключения к вашей базе данных, выполнить обновление и т. Д.
  2. Переместите эту логику на сервер и вызовите ее с клиента, используя удаленный EJB, SOAP или другую технологию RPC.
0 голосов
/ 30 января 2014

Полагаю, вам следует избегать использования @Resource для получения UserTransaction на уровне компонента (компонент без состояния BMT). Вместо этого вы можете получить ссылку на SessionContext, используя:

@Resource
SessionContext context

затем используйте контекстную ссылку для получения текущей UserTranaction внутри бизнес-метода

context.getUserTransaction();
...