понедельник, 18 апреля 2016 г.

Java EE 7 на большом железе - до 140 процессоров и 10 ТБ ОЗУ!

Очень хочу рассказать о том, что уже примерно год доступны все возможности Java EE 7 на большом железе, т.е. на вычислительной платформе, предоставляющей в ваше распоряжение до 140 процессоров и 10 ТБ оперативной памяти. Да, вы правы, речь идет о сервере приложений WebSphere Liberty Profile, работающем на мейнфрейме IBM z13.



среда, 23 марта 2016 г.

Почему же все-таки покупают коммерческие сервера приложений, если есть бесплатные решения?

Вынесено из комментариев, мнение исключительно мое.

Железо, ОС, DB2 и WAS как часть общей платформы идут на мейнфреймах, да и то несколько месяцев назад анонсированы новые сервера LinuxONE, представляющие собой мейнфреймы, снабженные только IFL-процессорами, т.е. позволяющие запускать только Linux, позиционируемые как неограничено масштабируемая платформа для работы как IBM'овского, так и Open Source софта. Да что говорить, там поддерживаются даже Ubuntu и KVM. На остальных - дистрибьютед платформах, как мы их называем, - WebSphere Application Server покупают просто как сервер приложений, успешно ходят из него в Oracle Database и запускают на нем самые разные системы, как самописные, разработанные на самом предприятии или подрядчиком, так и известные пакетные приложения, например EMC Documentum. Насколько я знаю, даже Oracle SOA Suite может работать на WebSphere Application Server'е, правда скорее всего на Classic.

Почему же заказчики покупают сервер приложений с поддержкой от известного вендора, вместо того, чтобы использовать бесплатные решения? Частично я освещал эту тему в статье А почему бы мне не заплатить за мой Spring Framework? Ключевое - нефункциональные требования. Да, и Apache TomEE, и Glassfish (похоже R.I.P), и JBoss (платный?) являются платформами для того же самого стека Java EE, но дьявол как обычно кроется в мелочах. И задача продавца из IBM, который будет помогать вам аргументировать покупку, заключается в том, чтобы понять, а нужны ли вам эти опции. Нужны ли Dynamic Routing, Auto Scaling, Intelligent Management и т.д.

Другая причина, по которой покупают промышленные сервера приложений, - поддержка известным производителем. Существуют системы, несколько часов/сутки простоя которых стоят дороже, чем лицензии на сервер приложений, СУБД и другое програмное обеспечение. Речь даже не столько о финансовых учреждениях, хотя большинство россиян столкнулись со знаменитым простоем карточного процессинга одного известного банка несколько лет назад. Представьте себе простой любого московского аэропорта, крупной железнодорожной компании (единственной в стране крупной железнодорожной компании :)), энергосбыта и т.д. Я конечно не говорю, что у всех у них WebSphere Application Server, но менеджменту зачастую нужно, чтобы в случае критичных проблем тут же приехал (связался по телефону) человек и починил за четко установленное в SLA время. Я не знаю ни одного случая внедрения TomEE в нашей богоспасаемой стране, ровно как и фирмы, гарантирующей 24/7 поддержку данного сервера приложений. Аналогичные соображения про Glassfish, знаю только, что есть коммерческая версия данного сервера, но ее поддерживают коллеги из Туманного Альбиона и похоже только там + та Европа, что западнее Белоруссии. Red Hat, надо отдать должное, более активен.

А что можете сказать вы? Поделитесь своим мнением по поводу нужности/ненужности коммерческих серверов приложений в комментариях!

Понравилось сообщение - подпишитесь на блог

понедельник, 25 января 2016 г.

Spring Framework: влияние сканирования зависимостей на время запуска веб-приложения

В комментариях к заметке Пишем простой RESTful веб-сервис на Spring Web MVC прозвучал довольно интересный вопрос, суть которого сводится к следующему: как сервер приложений находит все классы, реализующие интерфейс javax.servlet.ServletContainerInitializer, и сколько времени это занимает. Попробуем разобраться.


Какие компоненты ищет сервер приложений при запуске


Часть 8 спецификации Servlet 3.0 вводит понятие "подключаемой возможности" ("plugability features"), что существенно упрощает структуру веб-приложения, а так же подключение дополнительных фреймворков. Однако, данные возможности требуют времени на сканирование JAR-архивов и файлов с классами приложения. Спецификация требует, чтобы данное сканирование производилось по-умолчанию, однако его можно частично или полностью избежать в зависимости от используемого сервера приложений.

Сканирования зависимостей и классов приложения требуют следующие возможности:

  • Впервые предложенные в спецификации Servlet 3.0:

    • SCI (javax.servlet.ServletContainerInitializer);

    • Веб-фрагменты (META-INF/web-fragment.xml);

    • Ресурсы веб-приложения, собранные в JAR-файлах (META-INF/resources/*);

    • Аннотации, определяющие компоненты веб-приложения (@WebServlet и т.д.);

    • Аннотации, определяющие компоненты для сторонних библиотек, инициализируемые с помощью SCI (аннотации, которые определены в аннотации @HandlesTypes на SCI-классе. Класс конфигурации контекста приложения Spring Framework из примера - ApplicationInitializer - является таким компонентом.

  • Старые возможности, впервые предложенные в ранних версиях спецификации:

    • Tag Library Descriptor (TLD), определяет библиотеки тегов. Сервер приложений ищет файлы META-INF/**/*.tld.

Servlet Container Initializer (CSI)


В принципе, на Stack Overflow дан довольно подробный и развернутый ответ на вопрос о том, как сервер приложений ищет классы инициализации контекста. В каталоге META-INF/services архива с библиотекой должен находиться файл javax.servlet.ServletContainerInitializer, содержащий перечисление полных имен классов, реализующих интерфейс javax.servlet.ServletContainerInitializer (по одному имени на строке). Например:

psamolysov.demo.spring.restws.ServletContextInitializer1
psamolysov.demo.spring.restws.ServletContextInitializer2

Аналогичным образом можно зарегистрировать слушатели, находящиеся непосредственно в коде самого веб-приложения, при этом файл javax.servlet.ServletContainerInitializer должен находиться в каталоге WEB-INF/classes/META-INF/services.

среда, 13 января 2016 г.

Пишем простой RESTful веб-сервис на Spring Web MVC

Суровый разместил на GitHub'е новый репозиторий, в котором будет собирать примеры использования Spring Framework 4.x. И сегодня я поделюсь с уважаемыми читателями блога примером простого RESTful веб-сервиса, реализованного на базе фреймворка Spring Web MVC и не содержащего ни строчки XML за исключением pom.xml.


Архитектура сервиса


Задачей примера было продемонстрировать реализацию классической многослойной архитектуры, к которой тяготеет большинство приложений, построенных на основе Spring Framework. Точкой входа является контроллер MessageController, в который инжектируются "сервисы" MessageService и ZShopService:

вторник, 29 декабря 2015 г.

Spring Framework vs EJB vs CDI. Небольшой бенчмарк с использованием JMH

На днях Суровый выложил на GitHub исходники и некоторые результаты небольшого бенчмарка, проверяющего гипотезу о том, что Spring Framework быстрее этих ваших EJB.

Как оказалось - нет, не быстрее.

Описание эксперимента


Для тестирования был выбран кейс, представленный Адамом Бином в его вебкасте What Is Faster--EJBs Or CDI? A JMH Benchmark: были разработаны три реализации простейшего RESTful веб-сервиса, с использованием Spring Framework, CDI и EJB, соответственно. Конструкция сервисов в общем случае напоминает архитектуру корпоративного приложения: в контроллер инжектируется сервис, в который в свою очередь инжектируются два ресурса (этакие "DAO").

Пример кода с использованием EJB:

@Stateless
public class EJBResourceA {

    public String message() {
        return "A#" + System.currentTimeMillis();
    }
}

@Stateless
public class MessageService {

    @EJB
    private EJBResourceA aresource;

    @EJB
    private EJBResourceB bresource;

    public String message() {
        return aresource.message() + bresource.message();
    }
}

@Stateless
@Path("/")
public class MessageController {

    @EJB
    private MessageService service;

    @GET
    @Path("/message")
    @Produces({"text/plain"})
    public String message() {
        return service.message();
    }
}

Каждая технология использовалась самым очевидным, т.е. распространенным, принятым в сообществе пользователей данной технологии, способом.

  • Для Spring Framework в качестве основы реализации RESTful веб-сервиса был взят Spring MVC: запросы обрабатываются с помощью DispatcherServlet, к которому подключается MessageController, аннотированный RestController, что говорит фреймворку возвратить результат метода MessageController#message() в теле ответа сервиса. В данный контроллер с помощью аннотации Autowired инжектируется сервис, в который, в свою очередь, аналогичным образом инжектируются два компонента-ресурса. Конфигурация контекста приложения (Spring Framework ApplicationContext) осуществляется с помощью аннотаций:

    @Configuration
    @ComponentScan(basePackageClasses = ApplicationConfig.class)
    @EnableWebMvc
    public class ApplicationConfig {
    }
    

    Регистрация слушателей, осуществляющих загрузку контекста, а так же настройка DispatcherServlet'а осуществляется в классе, реализующем интерфейс org.springframework.web.WebApplicationInitializer:

    public class ApplicationInitializer implements WebApplicationInitializer {
    
        @Override
        public void onStartup(ServletContext servletContext) throws ServletException {
            AnnotationConfigWebApplicationContext applicationContext = 
                    new AnnotationConfigWebApplicationContext();
            applicationContext.register(ApplicationConfig.class);       
            
            servletContext.addListener(new ContextLoaderListener(applicationContext));
            
            ServletRegistration.Dynamic dispatcher = 
                    servletContext.addServlet("spring-mvc-dispatcher", 
                            new DispatcherServlet(applicationContext));
            dispatcher.setLoadOnStartup(1);
            dispatcher.addMapping("/api/*");        
        }
    }
    

  • Для CDI: все компоненты создаются в области видимости по-умолчанию - Dependent.

  • Для EJB: все классы аннотированы @Stateless, что соответствует наиболее популярному типу - сессионным компонентам без сохранения состояния. Для хранения экземпляров компонентов используется пул, предоставляемый контейнером EJB сервера приложений. Так же очень важный момент - управление транзакциями. По-умолчанию, EJB-контейнер берет на себя управление транзакциями при обращении к компоненту, при этом если вызов бизнес-метода компонента осуществляется вне контекста глобальной транзакции, то такая транзакция будет создана. Можно было отключить использование данного механизма, тогда условия тестирования больше бы соответствовали режимам, в которых работают конкуренты, но для следования озвученному выше критерию - технология используется наиболее распространенным способом - этого сделано не было.

вторник, 1 декабря 2015 г.

А вот как мне правильно составить резюме? Советы для начинающих

Как учат нас классики марксизма-ленинизма: рынок труда - это точно такой же рынок как и все другие, просто на нем продается специфический товар - рабочая сила. Ну а раз товар продается, то его нужно уметь показать лицом. Показывать свой товар лицом на рынке труда мы начинаем с резюме. И здесь у начинающих программистов присутствует некоторое недопонимание и общие ошибки. Давайте попробуем в них разобраться и, возможно, сделаем свои резюме лучше.

Вся данная заметка основана исключительно на собственном опыте.

четверг, 26 ноября 2015 г.

Как настроить сквозную аутентификацию в WebSphere Application Server, z/OS и DB2

По умолчанию команды операционной системы из приложений, развернутых на сервере WebSphere Application Server for z/OS, выполняются от имени пользователя, под которым запущен servant. Под этим же пользователем осуществляется соединение с базами данных, например DB2 или IMS по JDBC Type 2. Но можно настроить сервер приложений таким образом, чтобы обеспечить сквозную аутентификацию: пользователь вашего приложения аутентифицируется на сервере и под этим же именем соединяется с базой данных и выполняет команды в операционной системы: создает файлы в USS (например с логами), работает с наборами данных, а так же запускает на выполнение пакетные задания (JOB'ы).

Процесс сквозной аутентификации

Выглядит процесс следующим образом. При обращении к странице, находящейся в защищенной зоне, будет запрошен логин и пароль пользователя, если настроена, например, BASIC аутентификация по паролю.


Введенные данные проверяются с помощью сервера защиты z/OS (IBM предлагает продукт Resource Access Control Facility (RACF)) и если они верны, то открывается запрошенная страница.


При этом действия в операционной системе будут выполняться под тем пользователем, под которым произведена аутентификация.


И под ним же будут выполняться запросы в СУБД DB2: см результат выполнения запроса SELECT CURRENT SQLID FROM SYSIBM.SYSDUMMY1: ROOT.