RabbitMQ Exchange Types
Direct
Fanout
Topic
Headers
References
https://lostechies.com/derekgreer/2012/03/28/rabbitmq-for-windows-exchange-types/
Direct
Fanout
Topic
Headers
References
https://lostechies.com/derekgreer/2012/03/28/rabbitmq-for-windows-exchange-types/
Server : Consumer
public class Main { public static void main(String[] args) throws IOException, TimeoutException { String queueName = "queue2"; ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(queueName, true, false, false, null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); channel.basicQos(1); Consumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message=new String(body,"UTF-8"); try { doWork(message); } catch (Exception ex) { ex.printStackTrace(); } finally { channel.basicAck(envelope.getDeliveryTag(),false); } } }; channel.basicConsume(queueName,false,consumer); } public static void doWork(String message) throws InterruptedException { System.out.println(" [x] Received '" + message + "'"); int sleepTime=new Random().nextInt(2000); Thread.sleep(sleepTime); } }
References
https://pupli.net/2017/07/16/work-queues-sample-in-rabbitmq/
https://www.rabbitmq.com/tutorials/tutorial-two-java.html
Server : Consumer
public class Main { public static void main(String[] args) throws IOException, TimeoutException { String queueName = "queue2"; ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(queueName, true, false, false, null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); channel.basicQos(1); Consumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message=new String(body,"UTF-8"); try { doWork(message); } catch (Exception ex) { ex.printStackTrace(); } finally { channel.basicAck(envelope.getDeliveryTag(),false); } } }; channel.basicConsume(queueName,false,consumer); } public static void doWork(String message) throws InterruptedException { System.out.println(" [x] Received '" + message + "'"); int sleepTime=new Random().nextInt(2000); Thread.sleep(sleepTime); } }
Client : Producer
public class Main { public static void main(String[] args) throws IOException, TimeoutException, InterruptedException { String queueName = "queue2"; ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(queueName, true, false, false, null); int count = 0; while (count < 100) { Date date = new Date(); String message = String.format("%d : %s", count, date.toString()); channel.basicPublish("", queueName, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes("UTF-8")); System.out.println(String.format(" [x] Sent %s", message)); Thread.sleep(1000); count++; } } }
References
https://pupli.net/2017/07/16/work-queues-sample-in-rabbitmq/
https://www.rabbitmq.com/tutorials/tutorial-two-java.html
Server : Consumer
public class Main { public static void main(String[] args) throws IOException, TimeoutException { String queueName = "queue2"; ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(queueName, true, false, false, null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); channel.basicQos(1); Consumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message=new String(body,"UTF-8"); try { doWork(message); } catch (Exception ex) { ex.printStackTrace(); } finally { channel.basicAck(envelope.getDeliveryTag(),false); } } }; channel.basicConsume(queueName,false,consumer); } public static void doWork(String message) throws InterruptedException { System.out.println(" [x] Received '" + message + "'"); int sleepTime=new Random().nextInt(2000); Thread.sleep(sleepTime); } }
References
https://pupli.net/2017/07/16/work-queues-sample-in-rabbitmq/
https://www.rabbitmq.com/tutorials/tutorial-two-java.html
By default, RabbitMQ will send each message to the next consumer, in sequence. On average every consumer will get the same number of messages. This way of distributing messages is called round-robin.
References
https://pupli.net/2017/07/16/work-queues-sample-in-rabbitmq/
https://www.rabbitmq.com/tutorials/tutorial-two-java.html
Server : Consumer
public class Main { public static void main(String[] args) throws IOException, TimeoutException { String queueName = "queue2"; ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(queueName, true, false, false, null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); channel.basicQos(1); Consumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message=new String(body,"UTF-8"); try { doWork(message); } catch (Exception ex) { ex.printStackTrace(); } finally { channel.basicAck(envelope.getDeliveryTag(),false); } } }; channel.basicConsume(queueName,false,consumer); } public static void doWork(String message) throws InterruptedException { System.out.println(" [x] Received '" + message + "'"); int sleepTime=new Random().nextInt(2000); Thread.sleep(sleepTime); } }
Client : Producer
public class Main { public static void main(String[] args) throws IOException, TimeoutException, InterruptedException { String queueName = "queue2"; ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(queueName, true, false, false, null); int count = 0; while (count < 100) { Date date = new Date(); String message = String.format("%d : %s", count, date.toString()); channel.basicPublish("", queueName, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes("UTF-8")); System.out.println(String.format(" [x] Sent %s", message)); Thread.sleep(1000); count++; } } }
References
https://www.rabbitmq.com/tutorials/tutorial-two-java.html
https://github.com/mhdr/RabbitMQSamples/tree/master/002_WorkQueues
Server
public class Main { public static void main(String[] args) throws IOException, TimeoutException { String queueName="Hello"; ConnectionFactory factory=new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(queueName,false,false,false,null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); Consumer consumer=new DefaultConsumer(channel){ @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message=new String(body,"UTF-8"); System.out.println(" [x] Received '" + message + "'"); } }; channel.basicConsume(queueName,true,consumer); } }
Client
public class Main { public static void main(String[] args) throws IOException, TimeoutException, InterruptedException { String queueName="Hello"; ConnectionFactory factory=new ConnectionFactory(); factory.setHost("localhost"); Connection connection= factory.newConnection(); Channel channel= connection.createChannel(); channel.queueDeclare(queueName,false,false,false,null); int count=0; while (count<100){ Date date=new Date(); String message=String.format("Hello World : %s", date.toString()); channel.basicPublish("",queueName,null,message.getBytes("UTF-8")); System.out.println(" [x] Sent '" + message + "'"); count++; Thread.sleep(1000); } channel.close(); connection.close(); } }
References
https://www.rabbitmq.com/tutorials/tutorial-one-java.html
https://github.com/mhdr/RabbitMQSamples/tree/master/001_HelloWorld
Ubuntu 16.04 :
create this file if it does not exist :
/etc/systemd/system/rabbitmq-server.service.d/limits.conf
and add this :
[Service] LimitNOFILE=300000
sudo systemctl daemon-reload
sudo service rabbitmq-server restart
References
https://www.rabbitmq.com/install-debian.html
https://kimambo.de/increasing-limits-for-socket-descriptors-on-ubuntu-for-rabbitmq/
build.gradle
buildscript { repositories { jcenter() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:2.3.3' classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' } } allprojects { repositories { jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }
build.gradle
apply plugin: 'com.android.application' apply plugin: 'org.greenrobot.greendao' android { compileSdkVersion 26 buildToolsVersion "26.0.0" defaultConfig { applicationId "ir.mhdr.a097" minSdkVersion 17 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:26.+' compile 'com.android.support.constraint:constraint-layout:1.0.2' compile 'org.greenrobot:greendao:3.2.2' // This is only needed if you want to use encrypted databases compile 'net.zetetic:android-database-sqlcipher:3.5.6' testCompile 'junit:junit:4.12' }
App.java
public class App extends Application { public static final boolean ENCRYPTED = false; @Override public void onCreate() { super.onCreate(); DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, ENCRYPTED ? "notes-db-encrypted" : "notes-db"); Database db = ENCRYPTED ? helper.getEncryptedWritableDb("super-secret") : helper.getWritableDb(); Statics.daoSession = new DaoMaster(db).newSession(); } }
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ir.mhdr.a097"> <application android:name=".App" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Statice.java
public class Statics { public static DaoSession daoSession; }
Note.java
@Entity(indexes = { @Index(value = "text, date DESC", unique = true) }) public class Note { @Id(autoincrement = true) private Long id; @Index(unique = true) private String uuid; @NotNull private String text; @Property(nameInDb = "date") private Date date; @Transient private int tempUsageCount; @Generated(hash = 102375063) public Note(Long id, String uuid, @NotNull String text, Date date) { this.id = id; this.uuid = uuid; this.text = text; this.date = date; } @Generated(hash = 1272611929) public Note() { } public Long getId() { return this.id; } public void setId(Long id) { this.id = id; } public String getText() { return this.text; } public void setText(String text) { this.text = text; } public Date getDate() { return this.date; } public void setDate(Date date) { this.date = date; } public String getUuid() { return this.uuid; } public void setUuid(String uuid) { this.uuid = uuid; } }
MainActivity.java
public class MainActivity extends AppCompatActivity { private DaoSession daoSession; private NoteDao noteDao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); daoSession = Statics.daoSession; noteDao = daoSession.getNoteDao(); Note note = new Note(); note.setUuid(UUID.randomUUID().toString()); note.setDate(new Date()); note.setText("Hello World"); noteDao.save(note); } }
if using Kotlin
android { ... sourceSets { main.java.srcDirs += 'build/generated/source/greendao' } }
References
http://greenrobot.org/greendao/documentation/
https://github.com/mhdr/AndroidSamples/tree/master/097
https://github.com/greenrobot/greenDAO/issues/395
Connecting to a database behind a firewall
ssh -L 9000:localhost:5432 user@example.com
Remote port forwarding
ssh -R 9000:localhost:3000 user@example.com
sudo nano /etc/ssh/sshd_config GatewayPorts yes sudo service ssh restart