вторник, 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.

вторник, 24 ноября 2015 г.

Работа для специалиста по WebSphere Application Server

Уважаемые читатели блога Сурового челябинского программиста, если вы любите и умеете в замечательный сервер приложений WebSphere Application Server на любой платформе (Linux, Windows, z/OS(!)), то возможно вас заинтересует стабильная работа в Главном вычислительном центре - филиале ОАО "РЖД" (ГВЦ).

Название вакансии - инженер IBM WebSphere

Опыт работы - от 1 года

Обязанности:

  • Администрирование комплекса IBM WebSphere (Application Server, Message Broker, MQ) и IBM HTTP Server на платформах IBM z/OS, Windows, Linux;

  • Автоматизация установки приложений IBM WebSphere;

  • Организация бесперебойной работы приложений IBM WebSphere, решение нестандартных задач по восстановлению их работоспособности, управление рабочей нагрузкой, оптимизация производительности;

  • Разработка отказоустойчивых схем ПТК, методов и распорядка резервного копирования и восстановления данных;

  • Участие в приемке информационных систем в постоянную эксплуатацию, функциональном и нагрузочном тестировании.


Дополнительные требования:

  • Базовые знания ПО IBM WebSphere Application Server, Message Broker, MQ;

  • Опыт работы с ОС z/OS (желательно);

  • Опыт работы с СУБД DB2 (желательно);

  • Навыки администрирования ОС MS Windows, Linux, Unix;

  • Опыт написания скриптов для управления WebSphere на языке Jython, знания языков shell (bash), powershell;

  • Опыт решения интеграционных задач;

  • Опыт разработки и проведения нагрузочных и функциональных тестов;

  • Опыт использования IBM Support Assistant;

  • Английский язык на уровне чтения технической документации;

  • Сертификация IBM Certified System Administration - WebSphere Application Server Network Deployment - предпочтительно.


График работы - 5/2.

Заработная плата - от 60 тыс. рублей.

Главное качество, которое требуется от кандидата - обучаемость. Коллеги действительно много вкладываются в обучение и профессиональный рост сотрудников.

От себя добавлю, что с коллективом я знаком около года, ребята очень грамотные и любящие свое дело. Данная вакансия - отличная возможность прикоснуться к миру как современного программного обеспечения среднего слоя, так и к большому железу: уже давно ни для кого не секрет, что Российские железные дороги являются одним из крупнейших пользователей мейнфреймов в России. Коллеги из РЖД всегда являются желанными гостями в локальном офисе IBM, постоянно приглашаемы и участвуют во всех проводимых мероприятиях, так же мы регулярно привозим в РЖД своих ведущих экспертов из Европы и США. Я хочу сказать, что пространство для профессионального роста весьма внушительно.

Чтобы откликнуться на вакансию, пожалуйста напишите мне на psamolysov@ru.ibm.com, я перешлю ваше письмо представителю работодателя.

Благодарю за внимание!

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

понедельник, 26 октября 2015 г.

А почему бы мне и не заплатить за мой Spring Framework?

Вопрос, вынесенный в заголовок темы, может показаться странным. Действительно, все знают, что Spring Framework стоит ровно столько же, сколько, например, посмотреть на знаменитого брюссельского Писающего мальчика, т.е. ровно ноль. Однако, если задуматься об эксплуатации приложения, разработанного на основе этого замечательного фреймворка, то может оказаться, что у нас не все так однозначно.

В данной статье Суровый расскажет о плюсах эксплуатации приложения, разработанного на основе Spring Framework, на "взрослом" сервере приложений, например на, поскольку уж так получилось, что я работаю в IBM, - WebSphere Application Server. Целью данного изложения является донести до вас, уважаемые читатели, мысль о том, что инфраструктура имеет значение.


вторник, 25 августа 2015 г.

I used to ...


Просто не мог не оставить это здесь:


Моему самому любимому Hello World'у позавчера исполнилось три месяца и мы продолжаем расти.

З.Ы. Для изучающих английский комикс отлично помогает отработать использование выражения used to.

З.З.Ы Ссылка на оригинал.

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

четверг, 13 августа 2015 г.

Об увеличении производительности работы Java 8 на мейнфрейме IBM z13

Корпорация IBM вкладывает воистину огромные усилия в развитие платформы Java. По сути данная платформа является одним из самых важных стратегических направлений для компании. Ключевое достоинство Java-приложений - это возможность немедленно отреагировать на увеличение производительности работы аппаратного обеспечения, используя Just-In-Time (JIT) компилятор, встроенный в последние релизы Java SDK. Ранее Суровый уже рассказывал о преимуществах, которые предоставляют мейнфреймы IBM и операционная система z/OS для работы ваших Java-приложений (в частности, мы уже видели, что связка z/OS + DB2 может работать в 3 раза быстрее связки Linux + Oracle), теперь же хочу поделиться относительно свежими данными.

Новые горизонты в росте производительности работы приложений открываются при совместном использовании возможностей IBM Java 8 и z13, таких как встроенный в новые процессоры SIMD - Single Instruction Multiple Data векторный движок, выполнение вычислений в несколько потоков на одном ядре (SMT) и улучшенная функция поддержки криптографии (CPACF - CP Assist for Cryptographic Function). Использование всех данных возможностей обеспечивает двукратный рост производительности на ядро (throughput-per-core) для приложений, активно использующих криптографию, и рост до 50% для остальных приложений.

Защищенный сервер приложений

На диаграмме приведены экспериментально полученные данные, демонстрирующие более чем двукратный рост производительности приложений, доступ к которым защищен с помощью SSL. В качестве платформы использовался сервер с 1-м CP и 4 zIIP. За базу взята производительность приложений при использовании IBM Java 7 SR4 на мейнфрейме zEC12.


Разница в производительности между Java 7 и Java 8 объясняется тем, что последние версии JVM используют SIMD и другие инструкции процессора z13. Крайний правый столбик отображает увеличение производительности, вызванное включением SMT на специализированных процессорах zIIP.

Java Store Inventory и Point-of-Sale

Приложение Java Store Inventory and Point of Sale Application представляет собой stand-alone программу, основанную на IT-инфраструктуре реально существующей ритейлинговой компании. Бенчмарк объединяет точку продаж, обработку онлайн-платежей и дата-майнинг. В коде используется множество возможностей языка, а так же функции компрессии и криптографии.


Диаграмма показывает увеличение производительности, достигаемое за счет использования платформой IBM Java 8 криптографических функций (CPACF), SIMD и SMT для zIIP на мейнфрейме z13. Наглядно виден рост производительности на 36% при использовании Java 8 по сравнению с Java 7 SR4 на мейнфрейме zEC12 и дополнительные 30% прироста производительности при работе Java 8 на z13 со включенным SMT.

Обработка бизнес-правил

Строительным блоком сервисов принятия решений являются бизнес-правила, которые обеспечивают управление и поддержку процесса, и аналитики, которые гарантируют правильность принимаемых решений.


Использование Java 8 для обработки бизнес-правил задействует преимущества векторных инструкций SIMD и SMT для zIIP на мейнфрейме z13, что позволяет достигнуть существенного прироста производительности в расчете на одно ядро процессора. На диаграмме видно, что использование Java 8 на мейнфрейме z13 без SMT дает прирост производительности на 66% по сравнению с использованием Java 7 SR4 на мейнфрейме zEC12. Дополнительные 37% прироста производительности достигаются за счет включения SMT на специализированных процессорах zIIP.

четверг, 6 августа 2015 г.

Живьем брать демона!

Вот бывает так в жизни, что ты сидишь никого не трогаешь, починяешь примус, переносишь менеджер развертывания DMGR сервера приложений WebSphere Application Server for z/OS на другой LPAR, а он там не работает. Т.е. никак. При этом адресные пространства живые, а соответствующие порты никто не слушает. И в логах ничего. Но, как доказали наши предки ровно 100 лет назад, русские не сдаются, поэтому проблему можно и нужно решить.

Если посмотреть содержимое файла /wasv85config/CELL/DMGR/DeploymentManager/profiles/default/config/cells/CELL/nodes/DMGR/servers/dmgr/was.env, то там можно увидеть строчки, ссылающиеся на не верный LPAR, т.е. на тот, с которого мы перенесли менеджер развертывания:


daemonInstanceName=LPAR1
server_configured_system_name=LPAR1
daemon_start_command_args=JOBNAME=DMNC,ENV=CELL.ZPLEX.LPAR1,REUSASID=YES
daemon_was_env_file=/wasv85config/CELL/DMGR/Daemon/config/CELL/ZPLEX/LPAR1/was.env


Недостаточно просто исправить значения данных параметров в файле was.env! Важно помнить, что данный файл генерируется менеджером развертывания и рано или поздно внесенные вручную изменения будут отменены. Изменять необходимо переменные окружения сервера приложений и файл server.xml.

Переменные окружения можно отредактировать с помощью консоли администрирования сервера приложений: Environment -> WebSphere variables, чтобы проще было найти нужные переменные необходимо выбрать Scope - Node=dmgr.


Файл server.xml расположен в каталоге /wasv85config/CELL/DMGR/DeploymentManager/profiles/default/config/cells/CELL/nodes/DMGR/servers/dmgr. В данном файле необходимо найти строчку

<properties xmi:id="Property_15" name="was.ConfiguredSystemName" value="LPAR1" required="false"/>

и изменить значение атрибута value на актуальное.

P.S. За подготовку материалов к заметке благодарю Александра Анискина, ведущего программиста ГВЦ ОАО "РЖД".

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

понедельник, 27 июля 2015 г.

Почему мой DMGR не видит экс-стэндалон узел, успешно подключенный с помощью addNode?

Давеча Суровый выполнял эксперимент по подключению готового стендалон-узла сервера приложений IBM WebSphere Application Server v8.5.5 for z/OS к ячейке. В процессе обнаружилось, что, не смотря на успешное завершение работы JOBBBOWADDN, вызывающего команду addNode, менеджер развертывания (DMGR) "не видит" свежеподключенный узел.


Сам узел (CZNODEB) при этом запущен и соответствующее адресное пространство существует в z/OS.


Симптомы заболевания

Что происходит на самом деле можно посмотреть в логах FFDC. Для узла сервер приложений пишет данные логи в каталог /wasv85config/CELL/NODE/AppServer/profiles/PROFILE/logs/ffdc/. Очень удобно отсортировать содержимое каталога по дате изменения файлов и смотреть последние измененные, иначе разобраться в каком файле находится актуальная информация довольно не просто. В нашем случае обращает на себя внимание следующая ошибка:



[6/30/15 7:01:44:582 GMT] FFDC Exception:com.ibm.websphere.management.exception.ConnectorException SourceId:com.ibm.ws.management.RoutingTable.Accessor.getConnector ProbeId:583 Reporter:com.ibm.ws.management.RoutingTable$Accessor@e153aa4c
com.ibm.websphere.management.exception.ConnectorException: ADMC0016E: The system cannot create a SOAP connector to connect to host HOST at port PORT.
at com.ibm.websphere.management.AdminClientFactory.createAdminClientPrivileged(AdminClientFactory.java:635)
at com.ibm.websphere.management.AdminClientFactory.access$000(AdminClientFactory.java:127)
at com.ibm.websphere.management.AdminClientFactory$1.run(AdminClientFactory.java:210)
...
Caused by: [SOAPException: faultCode=SOAP-ENV:Client; msg=Error opening socket: java.io.IOException: Exception during sslSocket.startHandshake: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty; targetException=java.lang.IllegalArgumentException: Error opening socket: java.io.IOException: Exception during sslSocket.startHandshake: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty]
at org.apache.soap.transport.http.SOAPHTTPConnection.send(SOAPHTTPConnection.java:475)
at org.apache.soap.rpc.Call.WASinvoke(Call.java:510)

Записи в логах FFDC на стороне менеджера развертывания во многом похожи:


[6/26/15 6:45:11:707 GMT] FFDC Exception:com.ibm.websphere.management.exception.ConnectorException SourceId:com.ibm.ws.management.RoutingTable.Accessor.getConnector ProbeId:583 Reporter:com.ibm.ws.management.RoutingTable$Accessor@b44063cd
com.ibm.websphere.management.exception.ConnectorException: ADMC0016E: The system cannot create a SOAP connector to connect to host HOST at port PORT.
at com.ibm.websphere.management.AdminClientFactory.createAdminClientPrivileged(AdminClientFactory.java:635)
at com.ibm.websphere.management.AdminClientFactory.access$000(AdminClientFactory.java:127)
at com.ibm.websphere.management.AdminClientFactory$1.run(AdminClientFactory.java:210)
at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:63)
at com.ibm.websphere.management.AdminClientFactory.createAdminClient(AdminClientFactory.java:206)
at com.ibm.ws.management.RoutingTable$Accessor.getConnector(RoutingTable.java:1102)
at com.ibm.ws.management.RoutingTable$Accessor.getConnector(RoutingTable.java:1218)
at com.ibm.ws.management.RoutingTable$Accessor.resetSession(RoutingTable.java:1264)
at com.ibm.ws.management.RoutingTable.addChild(RoutingTable.java:397)

Caused by: [SOAPException: faultCode=SOAP-ENV:Client; msg=Error opening socket: java.io.IOException: Exception during sslSocket.startHandshake: Received fatal alert: handshake_failure; targetException=java.lang.IllegalArgumentException: Error opening socket: java.io.IOException: Exception during sslSocket.startHandshake: Received fatal alert: handshake_failure]
at org.apache.soap.transport.http.SOAPHTTPConnection.send(SOAPHTTPConnection.java:475)

Ставим диагноз

Очевидно, что проблема заключается в невозможности установить защищенное соединение между менеджером развертывания и агентом узла по протоколу (HTTPS). Чтобы менеджер развертывания "доверял" агенту узла, в хранилище сертификатов truststore менеджера развертывания должен находиться корневой сертификат, которым подписан сертификат сервера агента узла. Аналогично, чтобы агент узла "доверял" менеджеру развертывания, в хранилище сертификатов truststore данного агента узла должен находиться корневой сертификат, которым подписан сертификат сервера менеджера развертывания.

Если мы говорим о WebSphere Application Server for z/OS, то хранилищами сертификатов как правило являются z/OS System Access Facility (SAF) Keyrings. Задать пути и параметры подключения к хранилищам сертификатов можно на странице Security -> SSL certificate and key management -> Key stores and certificates консоли управления сервера приложений.


Лечение

На рисунке выше видно, что для узла cznodeb используется хранилище сертификатов safkeyring:///WASKeyring.WSBCELL, созданное для экс-стендалон сервера приложений WebSphere Application Server. Более того, в моем случае данное хранилище сертификатов изначально было пустым. Так как все остальные сервера в ячейке используют хранилище сертификатов safkeyring:///WASKeyring.CZCELL, то и для узла cznodeb необходимо прописать ссылки на данное хранилище.


После сохранения и синхронизации изменений (синхронизация с узлом cznodeb по очевидным причинам работать не будет, поэтому необходимо вручную скопировать на него файл /wasv85config/CELL/DMGR/DeploymentManager/profiles/default/config/cells/CELL/security.xml) необходимо перезапустить агент узла cznodeb. Агент сможет подключиться к менеджеру развертывания и синхронизироваться, а менеджер развертывания сможет подключиться к агенту, о чем будет свидетельствовать яркая зеленая стрелочка напротив соответстветствующей строки в таблице System administration -> Node agents, Node agents.


Больше вам зеленых стрелочек в жизни. Оставайтесь на связи!

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

вторник, 30 июня 2015 г.

Ошибка при запуске NodeAgent'а: A conflicting IP address and port, хотя все проверено, конфликтов нет

При запуске агента узла (nodeagent) сервера приложений WebSphere Application Server возможна следующая ошибка, приводящая к аварийному останову данного компонента:


Trace: 2015/07/01 10:01:46.318 02 t=8E5E88 c=UNK key=S2 tag= (13007004)
SourceId: com.ibm.ws.hamanager.coordinator.dcs.CoreStackMembershipManager
ExtendedMessage: BBOO0220E: HMGR0031E: A conflicting IP address and port has been detected for the DCS_UNICAST_ADDRESS end point.
czcell\cznoded\nodeagent, czcell\cznodeb\nodeagent members are configured to use the IP address and port combination of IP::PORT.


Далее могут находиться следующие записи:


Trace: 2015/07/01 13:26:56.778 02 t=8E5E88 c=UNK key=S2 tag= (13007004)
SourceId: com.ibm.ws.hamanager.coordinator.impl.CoordinatorImpl
ExtendedMessage: BBOO0222I: HMGR0228I: The Coordinator is not an Active Coordinator for core group DefaultCoreGroup. The active coordinator set is

... trace skipped

Trace: 2015/07/01 13:26:56.973 02 t=8E5E88 c=UNK key=S2 tag= (13007004)
SourceId: com.ibm.ws.runtime.WsServerImpl
ExtendedMessage: BBOO0220E: WSVR0009E: Error occurred during startup
com.ibm.ws.exception.RuntimeError: Unable to start the CoordinatorComponentImpl

... trace skipped

Trace: 2015/07/01 10:01:46.524 02 t=8E5E88 c=UNK key=S2 tag= (13007004)
SourceId: com.ibm.wsspi.runtime.component.WsComponentImpl
ExtendedMessage: BBOO0222I: WSVR0401W: Unable to deregister the MBean


В FFDC при этом могут быть следующие записи:


[7/1/15 10:01:46:348 GMT] FFDC Exception:com.ibm.wsspi.hamanager.HAException SourceId:com.ibm.ws.hamanager.coordinator.impl.DCSPluginImpl ProbeId:255
Reporter:com.ibm.ws.hamanager.coordinator.impl.DCSPluginImpl@b220dd73
com.ibm.wsspi.hamanager.HAException: This process has conflicting ip:port configuration with another member. See previous messages for more info.
at com.ibm.ws.hamanager.coordinator.dcs.CoreStackMembershipManager.(CoreStackMembershipManager.java:147)
at com.ibm.ws.hamanager.coordinator.impl.DCSPluginImpl.(DCSPluginImpl.java:231)
at com.ibm.ws.hamanager.coordinator.impl.CoordinatorImpl.(CoordinatorImpl.java:349)

...

[7/1/15 10:01:46:430 GMT] FFDC Exception:com.ibm.wsspi.hamanager.datastack.DataStackException SourceId:
com.ibm.ws.hamanager.coordinator.impl.CoordinatorImpl ProbeId:288 Reporter:com.ibm.ws.hamanager.coordinator.impl.CoordinatorImpl@f036c22f
com.ibm.wsspi.hamanager.datastack.DataStackException: Failure creating core stack
at com.ibm.ws.hamanager.coordinator.impl.DCSPluginImpl.(DCSPluginImpl.java:263)
at com.ibm.ws.hamanager.coordinator.impl.CoordinatorImpl.(CoordinatorImpl.java:349)

...

[7/1/15 10:01:46:445 GMT] FFDC Exception:com.ibm.wsspi.hamanager.HAInternalStateException SourceId:
com.ibm.ws.hamanager.runtime.CoordinatorComponentImpl ProbeId:234 Reporter:com.ibm.ws.hamanager.runtime.CoordinatorComponentImpl@331d9876
com.ibm.wsspi.hamanager.HAInternalStateException: failure creating the Coordinator
at com.ibm.ws.hamanager.coordinator.impl.CoordinatorImpl.(CoordinatorImpl.java:356)
at com.ibm.ws.hamanager.coordinator.corestack.CoreStackFactoryImpl.createDefaultCoreStack(CoreStackFactoryImpl.java:88)


Т.е. нам говорят, что невозможно запустить требуемый nodeagent, потому что другой nodeagent имеет пересекающийся по значениям набор портов, однако это - не так!. Т.е. возможно когда-то по ошибке или специально было создано две node с пересекающимся набором портов у соответствующих nodeagent'ов, но эта ситуация давно исправлена, почему же компонент продолжает аварийно завершаться при запуске?

Все дело в файле PROFILEDIR_A/config/cells/CELL/nodes/NODE_B/serverindex.xml. Так как nodeagent аварийно завершает свою работу до запуска синхронизации конфигурации, то у него в данном каталоге остается старый конфигурационный файл serverindex.xml, соответственно компонент продолжает считать, что есть пересечение по значениям ip:port, этакая фантомная боль. Важно обратить внимание, что профиль в данном случае относится к запускаемой node, а в каталоге с профилем нужно найти подкаталог, относящийся к конфликтующей node, там будут два файла: node-metadata.properties и serverindex.xml. Необходимо вручную заменить файл serverindex.xml для соответствующей node, взяв его из профиля с менеджером развертывания (DMGR): .../DeploymentManager/profiles/default/config/cells/CELL/nodes/NODE_B/serverindex.xml.

P.S. Хотел спросить читателей, будет ли им полезна серия заметок по решению вопросов с замечательным сервером приложений IBM WebSphere Application Server? Какие еще компоненты стека нашей корпорации вам были бы интересны: Process Server, Business Process Manager (BPM), Portal, Lombardi или что-нибудь еще? Пожалуйста, ответьте в комментариях. Спасибо.

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

четверг, 25 июня 2015 г.

Ошибка com.ibm.websphere.ssl.SSLException: Cannot get security object from WCCM при запуске WebSphere Application Server

Начну новую серию зарисовок - коротких сообщений, описывающих достаточно стандартные проблемы, с которыми мне пришлось столкнуться, и методы их решения. Может быть буду делиться какими-то лучшими практиками. Начну с проблемы, которая может возникнуть при запуске сервера приложений WebSphere Application Server:


Caused by: com.ibm.websphere.ssl.SSLException: Cannot get security object from WCCM.
at com.ibm.ws.ssl.config.SSLConfigManager.initializeServerSSL(SSLConfigManager.java:212)
at com.ibm.ws.ssl.core.SSLComponentImpl.initialize(SSLComponentImpl.java:145)
... 31 more


Данная проблема возникает из-за того, что файл ...\profiles\PROFILEDIR\config\cells\CELL\security.xml испорчен. Решить проблему можно либо восстановлением данного файла из резервной копии (рекомендуемый вариант), либо копированием его из другого профиля, входящего в данную ячейку: ...\profiles\APPSRV_PROFILEDIR\config\cells\CELL\security.xml.

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

среда, 10 июня 2015 г.

Как может выглядеть JMS 2.1

Интересно, как много коллег, читающих мой блог, помнят, сколько времени жила и безраздельно властвовала спецификация JMS 1.1, предлагающая разработчикам для отправки или приема сообщения написать довольно громоздкий блок кода, больше напоминающий известную притчу о том, что Авраам родил Исаака, Исаак - Иакова, Иаков - Иуду, а потом у них что-то случилось и рожать стали женщины?

Появившаяся в составе Java EE 7 спецификация JMS 2.0 существенно улучшила ситуацию, особенно в части, отвечающей за корректное закрытие ресурсов. Однако нет предела совершенству и сейчас сообщество активно работает над новой версией спецификации - JSR 368 - JMS 2.1. Код подписчика на топик/очередь сообщений, написанный в соответствии с новой спецификацией, может выглядеть следующим образом:



Видно, что развитие спецификации идет по пути упрощения кодирования. Теперь управляемый сообщениями компонент (Message-Driven Bean) не обязан реализовывать интерфейс MessageListener, а метод, в котором реализуется обработка сообщений, не обязан называться onMessage. "Реагировать" на сообщение может любой метод, аннотированный как @JMSListener. Другое интересное новшество - произвольный набор параметров у метода, аннотированного как @JMSListener: разработчик избавлен от необходимости разбирать сообщение внутри данного метода-слушателя вручную (особенное счастье - отсутсвие тягомотины вида TextMessage textMessage = (TextMessage) message;), достаточно лишь объявить произвольный набор формальных параметров метода, аннотировав каждый из них должным образом. Мне лично это напоминает реализацию JAX-WS веб-сервиса: разработчик избавлен от необходимости работать в своем коде с неким SOAPEnvelope и вручную перемещаться по его вложенным элементам с целью найти значения входных параметров. Эту однообразную работу берет на себя среда исполнения, достаточно просто сказать ей какие параметры нас интересуют и как они называются в SOAP-сообщении, используя аннотацию @WebParam. Теперь подобное будет реализовано и в JMS, что лично меня сильно радует, я выступаю за однообразие при решении типовых проблем. В конце-концов парсить сообщения - это не работа для человека, а как говорят в IBM: "Человек должен думать, а компьютер работать".

Исходный код интерфейсов и аннотаций, составляющих спецификацию, доступен на сайте java.net.

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

понедельник, 25 мая 2015 г.

Суровый челябинский программист 2.0

Не знаю, пойдет ли новорожденная дочка по стопам Ады Лавлейс, но достойного человека я из нее воспитать постараюсь. 3680 г., 52 см. счастья.

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

пятница, 22 мая 2015 г.

А вот о работе

Как-то так получилось, что Суровый перестал радовать своих читателей и подписчиков хорошими техническими статьями. За последние несколько месяцев было сделано довольно много, но тема моя настолько специфична - Java и WebSphere Application Server на мейнфреймах IBM (теперь это называется z Systems), что я даже не знаю, будут ли технические статьи по данной теме восстребованы широкой общественностью.

Давайте лучше поговорим немного о другом.

Возможно среди читателей и подписчиков моего блога есть специалисты, эксплуатирующие WebSphere Application Server или другие продукты Middleware от IBM: WebSphere MQ, WebSphere Message Broker, IBM Integration Bus, CICS (!)). Возможно также в вашей компании используются средства мониторинга и автоматизации Tivoli. И все это богатство работает на мейнфрейме, или вы планируете миграцию на мейнфрейм. Наверняка у вас есть вопросы, какие-то замечания, предложения или даже проблемы, связанные с работой наших продуктов. Пожалуйста не стесняйтесь, просто пишите мне на почту psamolysov@ru.ibm.com. Если вы работаете у партнера, разрабатывающего программное обеспечение для мейнфреймов, или задумываетесь о поддержке вашим продуктом этой замечательной платформы, то так же прошу обращаться по любым возникающим вопросам.

Моя роль в IBM называется Client Technical Professional. Это значит, что каждую неделю я должен посещать заказчиков, общаться с их техническими специалистами и помогать решать возникающие вопросы. Помогать вам - это моя непосредственная рабочая обязанность, поэтому даже не думайте стесняться, не зависимо от того, куплена или нет вашей организацией поддержка на тот или иной продукт!

Отдельно отмечу (потому что хотя бы для меня самого это очень важно), в обращении за помощью нет ничего постыдного. Если вы попросили у меня совет или консультацию, то это не значит, что я хоть в чем-то умнее вас или являюсь более квалифицированным специалистом. Вовсе нет! Просто у меня есть бейджик с надписью IBM, который дает право обращаться к действительно умным коллегам внутри компании, включая разработчиков продуктов из зарубежных лабораторий и даже к архитектору IBM JVM (так мне недавно удалось ответить на один интересный вопрос нашего крупнейшего заказчика). Не использовать такие возможности на мой взгляд недальновидно.

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

среда, 11 марта 2015 г.

Как же это я упустил! Java 8 от IBM доступна для скачивания

Не баян, но гармошка!

Скачать под правильную операционную систему можно здесь.


Ну и подтверждение, что это действительно работает:


P.S. Не все знают, как скачать IBM JDK для Microsoft Windows. Для этого необходимо перейти на страницу IBM developer kits и затем проследовать по ссылке IBM Development Package for Eclipse. На открывшейся странице нас интересует последняя группа ссылок: Download the IBM Development Package for Eclipse, Version 6.0, including IBM SDK, Java Technology Edition, Version 8. В результате будет скачан Eclipse SDK и IBM SDK.


Наслаждайтесь!

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

вторник, 3 марта 2015 г.

Правильная платформа для Java EE приложения или как Линукс оказался в 3 раза медленее z/OS

Ваш покорный слуга написал еще одну статью на Хабрахабр - Правильная платформа для Java EE приложений: как z/OS + DB2 оказались в 3 раза быстрее Linux + Oracle.

Краткое резюме: очень быстро мигрировали Java EE приложение, использующее Hibernate, на мейнфрейм и провели сравнительное тестирование, с одной стороны данное приложение на zLinux + Oracle (2 LPAR), с другой - оно же на z/OS + DB2 (1 LPAR). Вариант на z/OS + DB2 работал быстрее в 3 раза. Конфигурация выбрана исходя из требований заказчика, для которого выполняли тестирование, но в принципе соответствует реальным практикам, почему-то именно так и разворачивают - на Linux стараются вынести каждую подсистему на свою виртуальную машину, на z/OS - весь стек разворачивается вместе, тем самым используются примущества операционной системы, в частности Cross-Memory Services - механизм, позволяющий из одного адресного пространства (WebSphere Application Server) обратиться к другому (DB2) с помощью нескольких машинных команд, минуя планировщик ОС. Преимущества подхода перед типичным кодом межпроцессной коммуникации (IPC), содержащем сотни, а то и тысячи машинных инструкций, да к тому же выполняющем обращения к ядру, очевидны любому инженеру, знакомому с операционными системами чуть глубже, нежели на уровне "интерфейс унылый/интерфейс неунылый".

Отдельно отмечу, что исключительно расчетная часть на Java под z/OS выполнялась быстрее на 25%, что является отдельным приветом сторонникам мнения "Java на мейнфрейме тормозит и вообще".

P.S. Очень распространенное заблуждение, что zLinux выполняется только на z/VM. В данном случае и z/OS и zLinux выполнялись на LPAR'ах, VM в тесте не участвовала.

UPD: Хабраэксперты не подкачали, адекватные комментарии и претензии затерялись в ворохе: "Мы веруем в Линуха святого, а вы говорите, что он в чем-то хуже? Вы все врети, вы - сурковскаяпропаганда!!!" Грамотность аудитории оставляет желать лучшего, но это - уже наша недоработка. Основная претензия - разнесение подсистем на линуксе по разным LPAR'ам, но кто виноват, что линуксоиды так деплоят. В целом интерес к теме прослеживается и это не может не радовать.

UPD2: С нетерпением жду реакции анонимных аналитиков с ЛОРа.

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

понедельник, 23 февраля 2015 г.

А как выглядит эта ваша z/OS?

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

Для подключения к мейнфрейму с компьютера под управлением ОС семейства Microsoft Windows можно использовать утилиту IBM Personal Communications, эмулирующую терминал 3270. Работа с операционной системой z/OS производится в полноэкранном многофункциональном режиме, сильно отличающемся от dumb terminals с унылой черной командной строкой.

Для начала сеанса взаимодействия с z/OS нас попросят ввести имя приложения, с которым мы будем работать. Это может быть, например, Customer Information Control System (CICS) или Time Sharing Option (TSO). Я покажу как выполнять базовые операции в TSO.


Наиболее трудной для освоения особенностью терминала является восприятие факта, что клавише Enter соответствует правый Ctrl.

пятница, 13 февраля 2015 г.

Производительный отказоустойчивый географически разнесенный кластер на базе мейнфрейма? Yes, rly!

Вторую половину октября и весь ноябрь Суровый провел в солнечной Франции неподалеку от Лазурного берега, в клиентском центре IBM, расположенном в замечательном городке Монпелье. Ну знаете, как это бывает: глухие стены, сенсорные панели, мейнфрейм за стеклом, французские коллеги, вкалывание с 9 и до 22-х, но самое главное - очень и очень интересная задача.


Занимались мы с коллегами тестированием реального банковского приложения - платежной системы - на нашей уникальной платформе IBM zEnterprise EC12. В качестве программного обеспечения промежуточного слоя использовалось стандартное ПО IBM: СУБД DB2 z/OS, менеджеры очередей WebSphere MQ, сервер приложений WebSphere Application Server for z/OS (еще раз было продемонстрировано, что вопреки популярному убеждению мейнфрейм идеально подходит для работы Java-приложений). Платежная система была развернута на кластере Parallel Sysplex, узлы которого работали в режиме Active-Active. Самое главное, что хотелось проверить, - как ведет себя платформа и приложение при изменении расстояния между узлами кластера вплоть до 70 км.

Результатами, касающимися масштабируемости и производительности, хотим поделиться с вами в статье: Производительный отказоустойчивый географически разнесенный кластер, работающий по схеме Active-Active на мейнфрейме IBM zEnterprise EC 12. Автором статьи является ваш покорный слуга. Если будет зафиксирован интерес к теме, то напишу еще о результатах тестирования высокой доступности, обеспечиваемой нашей платформой.

Чтобы немного оживить заметку, фотография Сурового челябинского программиста на Чертовом мосту на фоне гор:


и да, мы тоже любим Linux и Тукса, но работать предпочитаем в z/OS.


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

вторник, 20 января 2015 г.

Кластер серверов приложений Oracle WebLogic Server забивает сеть при возникновении проблем

Не все администраторы знают, что по-умолчанию экземпляры сервера приложений Oracle WebLogic Server ведут логи не только в своих каталогах DOMAIN_HOME/server/SERVER/logs, но и пересылают их по сети на сервер администрирования домена. Это сделано для облегчения работы людей: если у вас домен из нескольких десятков экземпляров сервера приложений, то очевидно, что иметь все логи доступными в одном месте очень удобно. Но за данное удобство приходится платить.

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

На небольших доменах (4 - 8 экземпляров) я отключал/отключаю пересылку логов на сервер администрирования. В консоли администратора необходимо в настройках каждого управляемого сервера выставить свойство Domain log broadcaster:, Severity level на странице Environment -> Servers -> SERVER -> Logging -> General, Advanced в значение Critical или даже более жесткое.


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

Для включения фильтрации необходимо создать один или несколько фильтров логов. Фильтры создаются для всего домена на странице DOMAIN -> Configuration -> Log Filters.


При создании нового фильтра достаточно задать его имя.


Если затем перейти в новый созданный фильтр, то с помощью кнопок на панели Expression можно сформировать условие фильтрации.


После редактирования условия нужно не забыть нажать кнопку Save. Отредактированный фильтр вместе с условием станет доступен на таблице Log Filters.


Теперь его можно назначить для свойства Domain log broadcaster:, Filter на странице Environment -> Servers -> SERVER -> Logging -> General, Advanced.


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

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

четверг, 15 января 2015 г.

Механизм ограничений на импорты в Eclipse (Access restriction)

Возможно каждый использующий интегрированную среду разработки Eclipse SDK программист сталкивался с подобной ошибкой: Access restriction: The type JLabel is not accessible due to restriction on required library ..\lib\rt.jar


Механизм ограничений на импортируемые классы появился в Eclipse 3.1 и предназначен в первую очередь для разработчиков плагинов, чтобы бить по рукам за доступ ко внутренним API бандлов. Выглядят данные ограничения следующим образом: в (Project) Properties -> Java Build Path -> Libraries -> JRE определены Access Rules для всей JRE или для каждого jar'а внутри данной JRE. По-умолчанию проект создается в среде исполнения (Execution Environment) JavaSE-1.7, которая накладывает ограничения на rt.jar - запрещены все пакеты javax.* кроме 160+ базовых.


Проблема с классами из Swing может возникнуть, если в результате экспериментов разработчик выставит в качестве Execution Environment или JRE-1.1, или вообще какие-то CDC/OSGi-Minimum. При работе с классами Eclipse проблема может возникнуть при попытке использования неразрешенных классов.

Можно отказаться от использования Execution Environment и при создании проекта выбирать опции JRE - Use a project specific JRE или Use default JRE. Все советы вида "удалите из проекта System Library, а потом руками добавьте ее" основаны именно на этом - замените Execution Environment на просто JDK.

При необходимости можно изменить поведение Eclipse, для этого есть два пути:

Windows -> Preferences -> Java -> Compiler -> Errors/Warnings

(Project) Properties -> Java Compiler -> Errors/Warnings


Нужно поменять значение у опции Forbidden References на Warning (по-умолчанию - Error), но делать это нужно в самом крайнем случае.

Для получения более подробной информации можно посмотреть данный пост или этот вопрос на Stack Overflow.

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