Fila (queue)

9 respostas
J

Boa tarde pessoal,

queria saber se tem como eu ter um identificador na fila, por exemplo, vou gravar um xml na fila e quero guardar junto do XML o codigo do cliente que mandou o xml.

Tenho necessidade de saber quem mandou o xml, e essa informação não está especificada dentro do XML. Então a unica forma, seria mantendo esse “identificador”.

Pensei em adicionar esse identificado ao xml e gravar. Mas gostaria de uma solução melhor que essa. Pois eu teria que adicionar e depois remover isso do XML.

Sera que tem como eu identificar a fila por um outro campo da tabela?

9 Respostas

T

Por “fila” você se refere a uma “message queue”, como o WebSphere MQ ou o MSMQ ou o JBoss MQ?

J

Eu to usando o OC4J com o banco oracle

a api usada eh AQJMS

T

Dê uma olhada na documentação; normalmente isso é possível, sem ter de pôr isso no próprio dado a ser mandado. Costuma ser uma propriedade da mensagem que você pode setar.

Se não me engano, quando você recebe uma mensagem, uma das propriedades já é o remetente da mensagem. Procure na documentação.

J

vc sabe como faz isso em qualquer outro container ou banco?

só pra eu ter uma leve ideia de como faz isso?

T

http://download.oracle.com/docs/cd/B12037_01/server.101/b10785/toc.htm
http://download.oracle.com/docs/cd/B12037_01/server.101/b10785/aq_envir.htm#sthref256

http://download.oracle.com/docs/cd/B12037_01/server.101/b10785/part5.htm#g996906
http://download.oracle.com/docs/cd/B12037_01/server.101/b10785/jm_share.htm#i1006330
http://www.novell.com/documentation/extend52/Docs/help/MP/jms/tutorial/chat-1.htm

T

No exemplo da Novell, o cara que envia setou uma propriedade da mensagem (setStringProperty), e então quem recebe deve checar essa propriedade. Mas acho que há uma propriedade padrão (que não achei no Google) que dá esse valor também, automaticamente.

J

blz Thingol

vou dar uma estudada e depois volto a postar o resultado disso

valeu

J

Thingol,

eu consegui mandar o parametro de identificação para a fila, mas não estou conseguindo obter a fila de acordo com aquele parametro. Olha meu codig para enfileirar
public void enfileirarTeste(AQSession aq_sess, String xml, String nomeFila, String nomeParametro, String valorParametro) throws AQException , JMSException
    {
		db_conn = ((AQOracleSession)aq_sess).getDBConnection();
	    
		/* Get a handle to queue table - aq_table4 in aqjava schema: */
		q_table = aq_sess.getQueueTable (SCHEMA_TABLE_QUEUE, NOME_QUEUE_TABLE);
		System.out.println("Successful getQueueTable");  
	    
		/* Get a handle to a queue - aq_queue4 in aquser schema: */
		queue = aq_sess.getQueue (SCHEMA_TABLE_QUEUE, nomeFila);
		System.out.println("Successful getQueue");  
	    
		[b]AQAgent agente = new AQAgent(nomeParametro, valorParametro);
	        AQMessageProperty prop = new AQMessageProperty();
	        prop.setSender(agente);
	    
		/* Creating a message to contain raw payload: */
		message = queue.createMessage();
		message.setMessageProperty(prop);[/b]	    
		/* Get handle to the AQRawPayload object and populate it with raw data: */
		b_array = xml.getBytes();
		 //b_array = (byte[])xml;
		raw_payload = message.getRawPayload();
	    
		raw_payload.setStream(b_array, b_array.length);
		
		/* Creating a AQEnqueueOption object with default options: */
		 enq_option = new AQEnqueueOption();
	    
		/* Enqueue the message: */
		queue.enqueue(enq_option, message);
		
	}

repare a parte negritada, eh onde eu coloquei os parametros. E no banco, ele aparece no campo SENDER NAME: o nome do parametro que mandei, e em SENDER ADDRESS aparece o valor do parametro que eu mandei.

na hora de recuperar, o meu metodo eh esse:
public String desinfileirar(AQSession aq_sess, String nomeFila) throws AQException
    {
	        db_conn = ((AQOracleSession)aq_sess).getDBConnection();
		
	        /* Get a handle to queue table - aq_table4 in aqjava schema: */
	        q_table = aq_sess.getQueueTable (SCHEMA_TABLE_QUEUE, NOME_QUEUE_TABLE);
	        System.out.println("Successful getQueueTable");  
	        
	        /* Get a handle to a queue - aq_queue4 in aquser schema: */
	        queue = aq_sess.getQueue (SCHEMA_TABLE_QUEUE, nomeFila);
	        System.out.println("Successful getQueue");  
		
		/* Creating a AQDequeueOption object with default options: */
		    deq_option = new AQDequeueOption();
	   [u][b] deq_option.setConsumerName("nome");
	    deq_option.setCondition("nome");[/b][/u]	    
		/* Dequeue a message: */
		    message = queue.dequeue(deq_option);
		    System.out.println("Successful dequeue "); 
		   
		  [b] if(message.getMessageProperty().getSender().getAddress().equals("javaCBA"))
		   {
		       System.out.println("achei a fila certa");
		   }[/b]	
	   
		/* Retrieve raw data from the message: */
		    raw_payload = message.getRawPayload();
		
		    b_array = raw_payload.getBytes();
		
	    return new String(b_array);
	}

Na condição que eu fiz, ele entra e consegue confirmar se a fila é a fila que eu quero obter, mas se tiver varias filas ele não sabe identificar isso.

Por exemplo, se tiver uma fila com o valor do parametro igual a JAVACBA, ele vai conseguir tratar corretamente a fila. Mas se não tiver, ou se a primeira não for esse valor, já da erro.

To colocando o codigo setConsumer (que ta em negrito e sublinhado), ele não acha a fila.

Preciso de ajuda :?

J

ah esqueci de falar que o erro que acontece eh esse:

oracle.AQ.AQOracleSQLException: ORA-24039: Queue FILA_MSG not created in queue table for multiple consumers
Criado 10 de fevereiro de 2009
Ultima resposta 11 de fev. de 2009
Respostas 9
Participantes 2