Child pages
  • JMS priority
Skip to end of metadata
Go to start of metadata

Sziasztok!

A következő a problémám: van egy szolgáltatásunk ami JMS queue-be dobja a elvégzendő feladatokat (sms küldés).

Vannak olyan SMS-ek amelyeknek hamarabb ki kell menniük és vannak olyanok amik ráérnek. Ennek megfelelően van priorizálva a queuq berakáskor.

 

 connection = smsQueueFactory.createConnection(); 
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);


MessageProducer messageProducer = session.createProducer(smsQueue);
messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
messageProducer.setPriority(prioritas);
MapMessage tm = session.createMapMessage();
tm.setInt("smsKod", smsKod);

messageProducer.send(tm);

Azt tapasztalom hogy amikor bedobok sok alacsony prioritású üzenetet, és később egy magas prioritásút, akkor nem az történik mint várnám hogy a magasabb előre kerül és hamarabb kerül feldolgozásra.

Úgy tűnik nekem hogy a prioritás az másodlagos, elsődleges szempont hogy mikor került be a queuba, és azon belül veszi figyel a prioritást, létezik ez? Valaki találkozott már ezzel a a problémával?

Ötlet, javaslat?

Esetleg elrontok valamit ?

Glassfish 3.1.x - NetBeans fejlesztő környezet 1.6.x Java, OpenMQ (ami a gf-ben van)


      
      
Page viewed times
#trackbackRdf ($trackbackUtils.getContentIdentifier($page) $page.title $trackbackUtils.getPingUrl($page))
  • No labels

4 Comments

  1. Ránézésre jónak kellene lennie... hm... esetleg megpróbálhatnád a másik send metódust... de sajnos nincs ötletem.

     

    1. Szia!

      Próbáltam sajnos nem segített.

      Készítettem egy tesztet hogy hogyan is viselkedik.
      A van egy SessionBean-em ami lényegi részt tekintve így néz ki:


          private void sendJMSMessageToPrior2(String Szoveg, int priority) throws JMSException {
              Connection connection = null;
              Session session = null;
              try {
                  connection = prior2Factory.createConnection();
                  session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
                  MessageProducer messageProducer = session.createProducer(prior2);

                  messageProducer.setPriority(priority);
                  TextMessage tm = session.createTextMessage();         
                  tm.setText(Szoveg);           

                  messageProducer.send(tm, DeliveryMode.NON_PERSISTENT,priority, Message.DEFAULT_TIME_TO_LIVE);
              } finally {
                  if (session != null) {
                      try {
                          session.close();
                      } catch (JMSException e) {
                          log.error(e);
                      }
                  }
                  if (connection != null) {
                      connection.close();
                  }
              }
          }



          @Override
          public void moreSendQueue() {       
              for(int i = 0; i < 10; i++) {
                  try {
                      sendJMSMessageToPrior2(String.valueOf(i) + ", Alacsony prioritású", 1);
                  } catch (JMSException ex) {
                      log.error(ex.toString());
                  }
              }
          }

          @Override
          public void sendMagas() {
                  try {
                      sendJMSMessageToPrior2("Magas prioritású", 9);
                  } catch (JMSException ex) {
                      log.error(ex.toString());
                  }
          }




      MDB-ben van egy sleep hogy a feldolgozást demonstrálja.



          @Override
          public void onMessage(Message message) {

              try {
                  TextMessage tm = (TextMessage)message;
                  log.info(tm.getText() + ", \tPrioritás: " + message.getJMSPriority() +  ", \tTimestamp "+ new SimpleDateFormat("yyyy.MM.dd HH:mm:ss.SSS").format(new Date(message.getJMSTimestamp())));
                  Thread.sleep(500);

              } catch (Exception e) {
                  log.fatal(e);
              }
          }


       

       
       Mivel az a cél hogy egy szálon történjen a feldolgozás így glassfish-ejb-jar.xml -ben:

           <ejb>
            <ejb-name>Prior2MessageBean</ejb-name>
            <bean-pool>
              <steady-pool-size>1</steady-pool-size>
              <resize-quantity>1</resize-quantity>
              <max-pool-size>1</max-pool-size>
            </bean-pool>
          </ejb>

       

      A moreSendQueue ManagedBean oldalról hívom a metódust akkor a queue-ba bekerül 10 db 1 prioritású üzenet.
      majd ugyan ebből a ManagedBean -ből meghívom a sendMagas metódust elhelyez egy magas prioritású üzenetet
      a végrehajtása a következőkép történik


       0, Alacsony prioritású,     Prioritás: 1,     Timestamp 2013.08.20 16:08:42.093
       1, Alacsony prioritású,     Prioritás: 1,     Timestamp 2013.08.20 16:08:42.094
      // kb itt került be queue-ba a "Magas prioritású, Prioritás: 9" üzenet
        2, Alacsony prioritású,     Prioritás: 1,     Timestamp 2013.08.20 16:08:42.095
       3, Alacsony prioritású,     Prioritás: 1,     Timestamp 2013.08.20 16:08:42.095
       4, Alacsony prioritású,     Prioritás: 1,     Timestamp 2013.08.20 16:08:42.096
       5, Alacsony prioritású,     Prioritás: 1,     Timestamp 2013.08.20 16:08:42.097
       6, Alacsony prioritású,     Prioritás: 1,     Timestamp 2013.08.20 16:08:42.097
       7, Alacsony prioritású,     Prioritás: 1,     Timestamp 2013.08.20 16:08:42.098
       8, Alacsony prioritású,     Prioritás: 1,     Timestamp 2013.08.20 16:08:42.099
       9, Alacsony prioritású,     Prioritás: 1,     Timestamp 2013.08.20 16:08:42.099
       Magas prioritású,             Prioritás: 9,     Timestamp 2013.08.20 16:08:43.470


      Módosítottam a moreSendQueue metódust úgy hogy egymás után nagyobb prioritású üzeneteket küldjön be.


          @Override
          public void moreSendQueue() {       
              for(int i = 0; i < 10; i++) {
                  try {
                      sendJMSMessageToPrior2(String.valueOf(i) + ", Alacsony prioritású", i);
                  } catch (JMSException ex) {
                      log.error(ex.toString());
                  }
              }
          }
       ekkor


      9, Alacsony prioritású,     Prioritás: 9,     Timestamp 2013.08.20 16:13:16.142
      8, Alacsony prioritású,     Prioritás: 8,     Timestamp 2013.08.20 16:13:16.141
      7, Alacsony prioritású,     Prioritás: 7,     Timestamp 2013.08.20 16:13:16.125
      6, Alacsony prioritású,     Prioritás: 6,     Timestamp 2013.08.20 16:13:16.124
      5, Alacsony prioritású,     Prioritás: 5,     Timestamp 2013.08.20 16:13:16.124
      4, Alacsony prioritású,     Prioritás: 4,     Timestamp 2013.08.20 16:13:16.123
      3, Alacsony prioritású,     Prioritás: 3,     Timestamp 2013.08.20 16:13:16.123
      2, Alacsony prioritású,     Prioritás: 2,     Timestamp 2013.08.20 16:13:16.122
      1, Alacsony prioritású,     Prioritás: 1,     Timestamp 2013.08.20 16:13:16.121
      0, Alacsony prioritású,     Prioritás: 0,     Timestamp 2013.08.20 16:13:16.120
      Magas prioritású,             Prioritás: 9,     Timestamp 2013.08.20 16:13:16.908

      Mint látszik is moreSendQueue hívásakor bekerülő üzeneteket priorizálva dolgozza fel.

      Azt hiszem valami ilyesmi kellene nekem csak OpenMQ -ra:

      http://activemq.apache.org/how-can-i-support-priority-queues.html

      Ötlet?

      1. Sajnos nincs ötletem... :/

        Ha lesz egy kis időm, akkor játszadozok majd ezzel a dologgal, de most sajnos nincs elegendő időm... (sad)

        Ha találsz megoldást, akkor azért ne tartsd magadban... (smile)

        1. Úgy néz ki megtaláltam a megoldást!

          Az OpenMQ egyik paraméterét kell át álltani, mégpedig a consumerFlowLimit -et.

          Bővebb információ:
          http://openmessaging.blogspot.hu/2009/03/consumer-flow-control-and-message.html
          http://openmessaging.blogspot.hu/2009/08/how-to-set-arbitrary-broker-properties.html

          Köszi a segítséget!