Showing posts with label java. Show all posts
Showing posts with label java. Show all posts

Tuesday, 28 June 2011

JavaME сдохла

Так можно сказать, если начать что-либо искать в сети по теме. 

На работе делаем приложение для мобильных устройств, в их числе и java ME. Была проблема с большой задержкой при Http запросах. Как и полагается система работает через Connector, т.е. соединение открывается методом Connector.open(url).

Потом из него открывается output или input stream.  После завершения работы потоки и соединение нужно обязательно закрывать, не то лимит будет исчерпан. На некоторых телефонах даже нормальное закрытие не помогает. Как я когда-то вычитал на форуме nokia нужно обнулить ссылки на потоки и соединение, затем вызвать Runtime.getRuntime().gc(). Затем Thread.sleep(50), т.е. включить сборку мусора и дать ему время (50 мс), чтобы он убрал за нами. И на большинстве нокий и самсунгов только после этого шаманства соединение возвращается в пул и приложение не будет зависать после 13 соединения (на всех телефонах, на которых была данная ошибка, объем пула составлял 13 соединений).

Со всей этой батвой приложение работает, но работает медленно. Данные скачиваются относительно быстро, а перед этим приложение долго простаивает, ожидая получить GPRS соединение.  Посовещавшись, решили попробовать сделать соединение через сокет. При старте приложения открывать сокет, гонять по нему данные к серверу и обратно, потом при завершении приложения закрываеть потоки и соединение. Пока вроде все получается, т.е. соединение открывается вызовом метода Connector.open("socket://127.0.0.1:9000); Открывается поток conn.openInputStream(). Открывается поток на запись conn.openOutputStream(); В него пишется запрос outputStream.write("GET / http/1.1\n\nHost:127.0.0.1"); Потом outputStream.flush(); Потом считываем с inputStream методом write. ... (Продолжение следует, наверное)

Tuesday, 18 January 2011

Несколько часов возился с EJB 3.1.
Создал банальный бин UserEjb.

@Stateless

public class UserEjb{



@PersistenceContext(unitName="EjbPU")

private EntityManager em;


public User findById(Long id) {

return em.find(User.class, id);

}


public User create (User user){

em.persist(user);

return user;
}



public User findByLogin(String login){

return (User) em.createQuery("select user from User as user where user.login = :login").setParameter("login", login).getSingleResult();

}


public User edit(User user){

em.merge(user);

return user;
}

}

В классе vaadin он никак не хотел создаваться с помощью аннотации EJB, хотя все сделал как указано в из примере На сайте ваадин

В итоге пришлось написать такой код:

UserEjb userEjb = (UserEjb) new InitialContext().lookup("java:module/UserEjb");