Страницы

25 октября 2016 г.

Профессиональные навыки java-программиста за которые ПЛАТЯТ

На досуге сел и проанализировал вакансии компаний которые ищут java-программистов и готовы платить 200 000 - 540 000 р.

Вот summary моего анализа: 
  • Опыт: 5-8 лет
  • Технологии java: hibernate, JPA, Spring, JMS, J2EE (EJB, JPA, JTA, Servlet, JSP, JAX-WS), multithreaded/concurrent programming, In-Memory Data Grid;
  • Сторонние технологии: AWS;
  • Архитектура: Microservices, SOA (service-oriented architecture), EDA (Event-driven architecture), шаблоны проектирования.
  • NoSQL: MongoDB, Cassandra;
  • Реляционные БД: MSSQL, MySQL, Oracle, Postgres
  • Навыки: Технологии и практики разработки программного обеспечения уровня enterprise (высоконагруженные распределенные системы), развертывание виртуальных окружений (Docker), тестирование (+автоматическое), управление сетями, разговорный английский язык, TDD/BDD;
  • Методологии разработки: Agile (scrum, kanban);


Учитесь и развивайтесь!
Удачи :)

8 сентября 2016 г.

11 августа 2016 г.

Чем можно заменить JMS?

Для начала, сайт, где можно изучить варианты:
http://queues.io/


  1. Local BlockingQueue (локальная передача данных);
  2. Apache Camel (channel "seda" = blockingQueue) (локальная передача данных);
  3. Spring Integration (channels) (локальная передача данных);
  4. ZookKeeper + Curator (распределенная передача данных);
  5. Hazelcast;
  6. Redis (Jedis для Java), простой продюсер и консьюмер, (можно настроить persist, есть локальные очереди на случаи сбоев (rpoplpush)) + можно добавить кластера в для увеличения памяти. Есть репликация;
  7. ZeroMQ. Обертка над сокетом. Низкоуровневый обмен.
  8. AMQP with RabbitMQ;
  9. Amazon SQS. Просто, дорого. Есть драйвер для JMS без драйвера.
  10. Kafka - самый интересный вариант. Кластеризация с помощью ZooKeeper.

Youtube links:


Ошибка java.lang.NoSuchFieldError: WRITE_DURATIONS_AS_TIMESTAMPS.

Использую jackson-databind версии 2.8.1.. При деплое вылазит ошибка java.lang.NoSuchFieldError: WRITE_DURATIONS_AS_TIMESTAMPS.
В моем случае проблема возникала из-за того, что в WildFly 8.2 в системных модулях лежит  jackson-databind версии 2.4, и при деплое, во время создания ObjectMapper, classLoader этого класса указывал именно на модуль WildFly, а не на зависимость из pom.xml.
Лечится просто:
В boss-deployment-structure.xml просто эексклудим подсистему jaxrc (если она вам конечно не требуется). Это исключит подтягивание заисимостей из модуля при деплое.

<exclude-subsystems>
<subsystem name="jaxrs" />
</exclude-subsystems>


7 августа 2016 г.

Wildfly + HornetQ. JMS. Record is too large to store

Record is too large to store


Актуально для Wildfly 8.2. На более поздних версиях не проверялось.

Данная ошибка возникает в том случае, если входящее сообщение имеет размер более чем размер указанный в настройке journal-file-size, и менее чем указанный min-large-message-size, при включенном персисте (persistence-enabled = true). Настройки в параметрах указываются в байтах.

Вторая причина возникновения этой ошибки - разные настройки на отправителе и получаете сообщений. Дело в том, что параметризует сообщение именно отправитель, и если у него, например, выключен персист  (persistence-enabled = false), то все сообщения параметризуются как "обычные" (не large). Получатель считывает первый байт, и таким образом определяет тип сообщения установленный отправителем. Т.е. если отправитель будет помечать все сообщения как "обычные", то получатель будет их обрабатывать как обычные, не зависимо от настроек установленных на получателе. Это значит, что у вас не будет работать настройка min-large-message-size, получатель всегда будет пытаться поместить сообщение в файл журнала. Если сообщение окажется объемом больше размера файла журнала - мы получим Record is too large to store.




2 августа 2016 г.

Amazon S3 java sdk. Подключаемся локально к minio.

https://minio.io/ - это локальный аналог amazon s3.
Все инструкции по его использованию есть на сайте.

Мы имеем amazon s3 java sdk, и хотим применить его локально, без подключения к amazon.

Разворачиваем minio

Я делал так как описано здесь:
https://docs.minio.io/docs/minio-docker-quickstart-guide

После того как minio запущен нас интересует четыре параметра:

Endpoint:  http://172.17.0.2:9000  http://127.0.0.1:9000
AccessKey: GEUV76CPZT9W6LHD27WV
SecretKey: LFtXnspXOcUgZXbgxMb+OfjqedhXMa06zQ4xMQRT
Region:    us-east-1

Именно они понадобятся для создания соединения.

Подключение


public class AmazonS3ClientFactoryImpl implements AmazonS3ClientFactory {
    private static final String AMAZON_ACCESS_KEY = "GEUV76CPZT9W6LHD27WV";
    private static final String AMAZON_SECRET_KEY = "LFtXnspXOcUgZXbgxMb+OfjqedhXMa06zQ4xMQRT";
    public static final String REPOSITORY_ENDPOINT = "http://localhost:9000";

    public AmazonS3 getAmazonS3Client(){
        AWSCredentials credentials = new BasicAWSCredentials(AMAZON_ACCESS_KEY, AMAZON_SECRET_KEY);
        ClientConfiguration clientConfiguration = new ClientConfiguration();

        AmazonS3 amazonS3Client = new AmazonS3Client(credentials, clientConfiguration);
        Region usWest2 = Region.getRegion(Regions.US_EAST_1);
        amazonS3Client.setRegion(usWest2);
        amazonS3Client.setEndpoint(REPOSITORY_ENDPOINT);
        amazonS3Client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true).disableChunkedEncoding());

        return amazonS3Client;
    }
}