= RabbitMQ =

== Erlang installation on Slackware ==
Requires Erlang:
 * su
 * cd /tmp
 * wget http://slackbuilds.org/slackbuilds/13.0/development/erlang-otp.tar.gz
 * tar xvzf erlang-otp.tar.gz
 * cd erlang-otp
 * wget http://www.erlang.org/download/otp_src_R13B03.tar.gz
 * wget http://www.erlang.org/download/otp_doc_man_R13B03.tar.gz
 * ./erlang-otp.SlackBuild
 * installpkg /tmp/erlang-otp-13B03-i486-1_SBo.tgz

== Slackbuild ==
 * wget http://slackbuilds.org/slackbuilds/14.1/development/erlang-otp.tar.gz
 * tar xvzf erlang-otp.tar.gz
 * cd erlang-otp
 * wget http://www.erlang.org/download/otp_src_R16B02.tar.gz
 * wget http://www.erlang.org/download/otp_doc_man_R16B02.tar.gz
 * ./erlang-otp.SlackBuild
 * installpkg  /tmp/erlang-otp-16B02-x86_64-1_SBo.tgz

== UNIX server installation ==
 * cd /opt
 * wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.3.1/rabbitmq-server-generic-unix-3.3.1.tar.gz
 * tar xvzf rabbitmq-server-generic-unix-3.3.1.tar.gz 
 * ln -s rabbitmq_server-3.3.1 rabbitmq
 * /opt/rabbitmq/sbin/rabbitmq-server 

== Python client ==
 * pip install pika # python client

== Examples ==
http://www.rabbitmq.com/tutorials/tutorial-one-python.html

'''Producer'''
{{{#!highlight python
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(exchange='',  routing_key='hello', body='Hello World!')
print " [x] Sent 'Hello World!'"
connection.close()
}}}

'''Consumer'''
{{{#!highlight python
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
print ' [*] Waiting for messages. To exit press CTRL+C'

def callback(ch, method, properties, body):
    print " [x] Received %r" % (body,)

channel.basic_consume(callback, queue='hello', no_ack=True)
channel.start_consuming()
}}}

== Topic ==
Publish/Subscribe.

produceTopic.py
{{{#!highlight python
#!/usr/bin/env python
import pika
import sys

if __name__=='__main__':
    exchangeName='broadcast'
    message = sys.argv[1]

    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
    channel = connection.channel()
    channel.exchange_declare(exchange=exchangeName, type='fanout')

    channel.basic_publish(exchange=exchangeName, routing_key='', body=message)
    print(" [x] Producer sent message %s to topic %s" % (message , exchangeName) )
    connection.close()
}}}

consumeTopic.py
{{{#!highlight python
#!/usr/bin/env python
import pika
import sys

def consumeTopic(ch, method, properties, body):
    print(" [x] %s received message %s" % (sys.argv[1] ,  body  ) )

if __name__=='__main__':
    topicName='broadcast'
    connection = pika.BlockingConnection(pika.ConnectionParameters( host='localhost'))
    channel = connection.channel()
    channel.exchange_declare(exchange=topicName, type='fanout')
    result = channel.queue_declare(exclusive=True)
    privateQueue = result.method.queue
    channel.queue_bind(exchange=topicName, queue=privateQueue)

    print(' [*] %s waiting for broadcasts. To exit press CTRL+C'%( sys.argv[1] ) )
    channel.basic_consume(consumeTopic, queue=privateQueue, no_ack=True)
    channel.start_consuming()
}}}

== Queue ==
Load balancer. Workers.

produceQueue.py
{{{#!highlight python
#!/usr/bin/env python
import pika
import sys

if __name__=='__main__':
    queueName='hello'
    connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
    channel = connection.channel()
    channel.queue_declare(queue=queueName)
    payload = sys.argv[1]
    maxCount = int(sys.argv[2]) + 1

    for count in range(1,maxCount):
        msg = '%s %d!'%(payload , count)
        channel.basic_publish(exchange='',  routing_key=queueName, body=msg  )
        print " [x] Sent message '%s' to queue %s"%(msg , queueName)
    connection.close()
}}}

consumeQueue.py
{{{#!highlight python
#!/usr/bin/env python
import pika
import sys

def messageHandler(ch, method, properties, body):
    print " [x] %s received message %s" % (sys.argv[1], body)

if __name__=='__main__':
    queueName='hello'
    consumerName =  sys.argv[1]
    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
    channel = connection.channel()
    channel.queue_declare(queue=queueName)
    print ' [*] %s  Waiting for messages. To exit press CTRL+C'%( consumerName )
    channel.basic_consume(messageHandler, queue=queueName, no_ack=True)
    channel.start_consuming()
}}}