package com.produban.openbus.storm; import java.util.Arrays; import java.util.Map; import org.wso2.siddhi.core.SiddhiManager; import org.wso2.siddhi.core.event.Event; import org.wso2.siddhi.core.query.output.QueryCallback; import org.wso2.siddhi.core.stream.input.InputHandler; import org.wso2.siddhi.query.api.query.Query; import backtype.storm.task.TopologyContext; import backtype.storm.topology.BasicOutputCollector; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.topology.base.BaseBasicBolt; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Tuple; import backtype.storm.tuple.Values; public class SiddhiBoltAux extends BaseBasicBolt { /** * */ private static final long serialVersionUID = 296651450802350256L; private transient SiddhiManager siddhiManager; private BasicOutputCollector collector; public void init(){ //SiddhiConfiguration configuration = new SiddhiConfiguration(); siddhiManager = new SiddhiManager(); gestionaStream("define stream streamPostfix (MSGID string, USERFROM string, TOUSER string,DSN string, SIZE int);","insert",""); String query1ID=gestionaQuery( "from streamPostfix[DSN=='2.0.0' or DSN=='2.6.0' or DSN=='2.4.0']#window.time(20000) as resp "+ "join "+ "streamPostfix[ USERFROM != 'null' and SIZE >0 ]#window.time(20000) as tam "+ "on resp.MSGID==tam.MSGID "+ "insert all-events into respuestasOK "+ "tam.MSGID,resp.DSN,sum(tam.SIZE) as TAMANO group by tam.MSGID,tam.DSN;" , "insert", "", true); } public SiddhiBoltAux(){ init(); } @Override public void execute(Tuple arg0, BasicOutputCollector arg1) { // TODO Auto-generated method stub collector=arg1; String[] campos=arg0.getString(0).split("\001"); if(siddhiManager==null){ init(); } //recuperamos el Stream para pasarle la tupla InputHandler inputHandler = siddhiManager.getInputHandler("streamPostfix"); //Adaptamos los campos al formato definido por el stream //podr�amos recuperar el formato de los campos desde la metadata if(campos[12]==null) campos[12]="null"; if(campos[15]==null) campos[15]="null"; if(campos[20]==null) campos[20]="null"; if(campos[13].equals("null")) campos[13]="-1"; try { //Pasamos los valores relevantes de latupla al Stream de WSO2 inputHandler.send(new Object[]{campos[2],campos[12],campos[15],campos[20],Integer.parseInt(campos[13])}); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { // TODO Auto-generated method stub declarer.declare(new Fields("streamID", "datos")); } @Override public void prepare(Map stormConf, TopologyContext context) { super.prepare(stormConf, context); } /** * <p>M�todo para a�adir o eliminar Streams del Siddhi-CEP</p> * @param streamDefinition Definici�n del STREAM a crear/eliminar * @param opcion Valores: *<p>      - insert: Crea el Stream indicado</p> *<p>      - delete: Elimina el Stream indicado</p> * @param streamID Nombre del STREAM si ha si ha sido creado. Si streamID no est� informado, se permite la creaci�n. * Si streamID est� informado se permite el borrado. * */ public void gestionaStream(String streamDefinition, String opcion,String streamID){ if(streamID!=null ){ if(opcion.equals("insert")){ //creamos siddhiManager.defineStream(streamDefinition); } }else{ System.out.println("El STREAM: "+streamID+" no existe"); if(opcion.equals("delete")){ //eliminamos siddhiManager.removeStream(streamID); } } } /** * <p>M�todo para a�adir o eliminar Queries del Siddhi-CEP</p> * <p>En la creaci�n/actualizaci�n adem�s se generar�n las funciones callback. * </p> * @param queryDef Nombre de la QUERY a crear/eliminar * @param opcion Valores: *<p>      - insert: Crea la QUERY indicada</p> *<p>      - delete: Elimina la QUERY indicada</p> * @param queryID Identificador de la query insertada en el Siddhi-CEP. * Si el ID no est� especificado solo se permite la inserci�n. * Si est� especificada permitimos el borrado y la inserci�n pasa a ser una actualizaci�n. * @param callback * <p>      - true: Genera la salida de los eventos al siguiente BOLT</p> * <p>      - false: No se genera callback</p> */ public String gestionaQuery(String queryDef, String opcion,String queryID,boolean callback){ String queryReference=queryID; if(opcion.equals("delete")){ //borramos la query del ID especificado siddhiManager.removeQuery(queryID); /*�Como tratamos las excepciones quepuedan llegar? - QueryID nulo - QueryID inv�lido */ } else if(opcion.equals("insert")){ if(queryID!=null){ //queryAntigua=siddhiManager.getQuery(queryID); //Si existe el ID y es v�lido, borramos la regla //if (queryAntigua!=null){ siddhiManager.removeQuery(queryID); /*�Como tratamos las excepciones quepuedan llegar? - QueryID nulo - QueryID inv�lido */ //} } //a�adimos la nueva Query queryReference=siddhiManager.addQuery(queryDef); /*�Como tratamos las excepciones quepuedan llegar? - queryDef nulo - queryDef inv�lido */ //actualizamos en la metadatael queryID devuelto por la creaci�n //Generamos callback si es necesario if(callback){ siddhiManager.addCallback(queryReference, new QueryCallback() { @Override public void receive(long timeStamp, Event[] inEvents, Event[] removeEvents) { // EventPrinter.print(timeStamp, inEvents, removeEvents); //generar la emisi�n de la tupla /*habr�a que generarun formato com�n de sailda a todas las reglas para pasar al Bolt de escrituraa ElasticSearch */ if(inEvents!=null){ for(Event e:inEvents){ System.out.println("++"+Arrays.toString(e.getData())); //collector.emit(new Values(e.getStreamId(), Arrays.toString(e.getData()))); collector.emit(new Values(e.getStreamId(), e.getData())); } } if(removeEvents!=null){ for(Event e:removeEvents){ System.out.println("--"+Arrays.toString(e.getData())); //collector.emit(new Values(e.getStreamId(), Arrays.toString(e.getData()))); collector.emit(new Values(e.getStreamId(), e.getData())); } } } }); } } return queryReference; } }