All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jgroups.demos.QuoteServer Maven / Gradle / Ivy


package org.jgroups.demos;


import org.jgroups.JChannel;
import org.jgroups.JChannel;
import org.jgroups.ReceiverAdapter;
import org.jgroups.View;
import org.jgroups.blocks.RpcDispatcher;
import org.jgroups.logging.Log;
import org.jgroups.logging.LogFactory;
import org.jgroups.util.Util;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.*;


/**
 * Example of a replicated quote server. The server maintains state which consists of a list
 * of quotes and their corresponding values. When it is started, it tries to reach other
 * quote servers to get its initial state. If it does not receive any response after 5
 * seconds, it assumes it is the first server and starts processing requests.

* Any updates are multicast across the cluster * @author Bela Ban */ public class QuoteServer extends ReceiverAdapter { final Map stocks=new HashMap<>(); JChannel channel; RpcDispatcher disp; static final String channel_name="Quotes"; protected Log log=LogFactory.getLog(getClass()); static final String props=null; // default stack from JChannel private void integrate(HashMap state) { if(state != null) state.keySet().forEach(key -> stocks.put(key, state.get(key))); } public void viewAccepted(View new_view) { System.out.println("Accepted view (" + new_view.size() + new_view.getMembers() + ')'); } public void start() { try { channel=new JChannel(props); disp=(RpcDispatcher)new RpcDispatcher(channel, this) .setMembershipListener(this).setStateListener(this); channel.connect(channel_name); System.out.println("\nQuote Server started at " + new Date()); System.out.println("Joined channel '" + channel_name + "' (" + channel.getView().size() + " members)"); channel.getState(null, 0); System.out.println("Ready to serve requests"); } catch(Exception e) { log.error("QuoteServer.start() : " + e); System.exit(-1); } } /* Quote methods: */ public float getQuote(String stock_name) throws Exception { System.out.print("Getting quote for " + stock_name + ": "); Float retval=stocks.get(stock_name); if(retval == null) { System.out.println("not found"); throw new Exception("Stock " + stock_name + " not found"); } System.out.println(retval.floatValue()); return retval; } public void setQuote(String stock_name, Float value) { System.out.println("Setting quote for " + stock_name + ": " + value); stocks.put(stock_name, value); } public Map getAllStocks() { System.out.print("getAllStocks: "); printAllStocks(); return stocks; } public void printAllStocks() { System.out.println(stocks); } public void getState(OutputStream ostream) throws Exception { Util.objectToStream(stocks, new DataOutputStream(ostream)); } public void setState(InputStream istream) throws Exception { integrate((HashMap)Util.objectFromStream(new DataInputStream(istream))); } public static void main(String args[]) { try { QuoteServer server=new QuoteServer(); server.start(); while(true) { Util.sleep(10000); } } catch(Throwable t) { t.printStackTrace(); } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy