четверг, 10 февраля 2011 г.

Реализуем обмен сообщениями AMQP с помощью RabbitMQ

Для начала установим и настроим RabbitMQ.

Тут все просто, скачиваем с основного сайта Erlang, проставляем ERLANG_HOME. Далее качаем и ставим сам RabbitMQ. Запускаем Rabbit через командную строку:  
%RABBITMQ_SERVER%/sbin/rabbitmq-server.bat
Если появилось сообщение broking running то все ок, наш сервер работает.

Теперь надо настроить пользователя и виртуальный хост сервера. Запускаем с командной строки:
%RABBITMQ_SERVER%/sbin/rabbitmqctl.bat add_user admin admin
Пользователь admin с паролем admin создан. Теперь создадим виртуальный хост:
rabbitmqctl.bat add_vhost ru.vie2004.vhost
после чего надо дать права на пользование им нашим пользователем:
rabbitmqctl.bat set_permissions -p ru.vie2004.vhost admin .* .* .*

Все, сервер настроен на работу. Более тонкие настройки можно найти на RabbitMQ


Теперь напишем простенькие Sender и Consumer.


Sender:
ConnectionFactory factory = new ConnectionFactory();

factory.setUsername("admin");
factory.setPassword("admin");
factory.setVirtualHost("ru.vie2004.vhost");
factory.setHost("localhost");
factory.setPort(5672);

Connection conn = factory.newConnection();
Channel channel = conn.createChannel();
String exchangeName = "myNewExchange";
String routingKey = "myNewRoute";

byte[] messageBodyBytes = "Наше сообщение".getBytes();

channel.basicPublish(exchangeName, routingKey, MessageProperties.PERSISTENT_TEXT_PLAIN, messageBodyBytes);
Если надо передать не текст, а обьект, то необходимо сериализовать его в byte[].

Consumer:
ConnectionFactory factory = new ConnectionFactory(); 

factory.setUsername("admin");
factory.setPassword("admin");
factory.setVirtualHost("ru.vie2004.vhost");
factory.setHost("localhost");
factory.setPort(5672);
Connection conn = factory.newConnection();
Channel channel = conn.createChannel();
boolean durable = true;

channel.exchangeDeclare("myNewExchange", "direct", durable);
channel.queueDeclare("myNewQueue", durable, false, false, null);
channel.queueBind("myNewQueue", "myNewExchange", "myNewRoute");

boolean noAck = false;
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(queueName, noAck, consumer);

while (true) {
  QueueingConsumer.Delivery delivery;
  try {
    delivery = consumer.nextDelivery();
  } catch (InterruptedException ie) {
    continue;
  }
  System.out.println("Получено сообщение: " + new String(delivery.getBody()));
}
Все, запускаем слушателя с отправителем и читаем сообщение.


ps. Не могу не упомянуть что для RabbitMQ есть аппендер log4j. Работать с ним можно, но придется немного подработать напильником для удобного пользования.

среда, 9 февраля 2011 г.

primefaces migrate from 2.2.RC2 to 2.2

С выходом на днях новой версии primefaces 2.2 появилось два нововведения. К сожалению не все они мне понравились:

1. теперь user guide платная, стоит порядка 10 евро.
http://primefaces.org/documentation.html
2. темы теперь надо подключать через jar.
http://primefaces.org/themes.html

ps. Документация от 26.07.2010. Настройки тем действительны только до версии 2.2.RC2 включительно.