Fila (queue)

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?

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

Eu to usando o OC4J com o banco oracle

a api usada eh AQJMS

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.

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

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

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

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.

blz Thingol

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

valeu

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

[code] 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);
	
}[/code]

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:

[code] 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);
}[/code]

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 :?

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