Websphere-mq-messagelistener-similar-to-jms-message-listener is it possible in MDB?

Hi,
      I have the MQConsumerClass that retrieves the messages from the MQ's working fine, but I want to create this class with MessageListener but I cannot find MessageListener or any example related to it.So, please tell me if there is any MessageListener function in WMQ Java API.
Regards
Mani

Hi Bloodasp,
What you are proposing sounds like a good plan and you should not encounter too many problems with it.
If you are going to run several clients connected to the same queue and they are to be considered functionally equivalent then your message receivers connected to this queue will receive messages in an order determined by the JMS provider itself. The canonical form of this is round-robin.
If you require targetting messages to particular message receivers then you can take a look at setting properties of the messages at the sender side and setting a message selector at the receiving side, it does not sound like this is what you are after though.
Hope this helps,
Tom Jenkinson

Similar Messages

  • How to send a JMS message to a remote Queue?

    Hi,
    I know how to create a JMS message and send it to an MDB that listens to a topic in the same container in which the JMS is created.
    In other words, if I have the following MDB:
    @MessageDriven(mappedName = "jms/MyQueue", ...)
    public class MyMDB implements MessageListener {
    Elsewhere in my JEE app I can create a Queue like this:
    @Resource(mappedName = "jms/MyQueue")
    Queue queue;
    and use it to send a message to the MDB.
    But How can I send a message to an MDB that's deployed in another app server on another machine in the network? Both of the app servers are Glassfish.
    Thanks in advance.
    Edited by: EJP on 9/08/2011 21:49: fixed your meaningless title

    Hi,
    The first thing I would like to suggest is, we never/can't send message directly to MDB. We always send/receive message(s) to/from the destination. In case of MDB, the application server register the MDB as message listener against particular destination, and invoked the onMessage() method when message arrives on particular destination.
    If I am not wrong, what you want to achieve is asynchronous communication between two applications deployed in two different machine. In your case, you want your one application works as message producer and other act as an message consumer, and both are deployed in different machine.
    In this situations, you only need to configure the JMS administration object, connection factories and destinations, on one Application server and configure other application server to use those configuration using JMS resource adapter. you can well achieve this by configuring the JMS Resource Adapter. you need to check the Glassfish documentation.
    If you don't want to break the JMS specification, always communicate with Messaging Provider through Resource Adapter.
    I hope this helps.

  • When using rabbitmq-jms for vFabric RabbitMQ javax.jms.Message.getJMSDestination does not return the actual destination when it is received from a consumer listening on a Topic with a wild card

    When using rabbitmq-jms for vFabric RabbitMQ javax.jms.Message.getJMSDestination does not return the actual destination when it is received from a consumer listening on a Topic with a wild card. I have tested with both 1.0.3 and 1.0.5 clients with RabbitMQ 3.1.5.
    I was wondering if the community was aware of this problem and if there are any workarounds? If not what is the proper channel to file a bug report. An example code snippet is below. The test fails because the TextMessageMatcher expects the destination passed in on construction (second parameter) to equal the desination on the message received (aquired from getJMSDestination).
            Mockery context = new Mockery();
            final MessageListener messageListener = context.mock(MessageListener.class);
            final Latch latch = new LatchImpl();
            final String prefix = "test" + System.currentTimeMillis();
            context.checking(new Expectations() {
                    oneOf(messageListener).onMessage(with(new TextMessageMatcher("MSG1", prefix + ".1234")));
                    will(new CustomAction("release latch") {
                        @Override
                        public Object invoke(Invocation invocation) throws Throwable {
                            latch.unlatch();
                            return null;
            final Connection connection = createConnection(null, null);
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            connection.start();
            Topic wildcardTopic = (Topic) getInitialContext().lookup(prefix + "." + "#");
            Topic destination = (Topic) getInitialContext().lookup(prefix + ".1234");
            final MessageConsumer consumer = session.createConsumer(wildcardTopic);
            consumer.setMessageListener(messageListener);
            MessageProducer producer = session.createProducer(null);
            producer.send(destination, session.createTextMessage("MSG1"));
            latch.await(5000);
            connection.close();
            Thread.sleep(5);
            context.assertIsSatisfied();

    Check where your MDB sends the [response] messages to.

  • Sending a JMS message inside a PostPersist entity listener method

    Hi to all,
    I have an entity called "Batch" that I want to persist. After the persist, I want to send a JMS message to notify batch insertion to the other clients.
    So I created the "Batch" entity as following :
    @Entity
    @EntityListeners({BatchServiceBean.class})
    @Table(name = "batch")The "BatchServiceBean" is a session bean which persists the batch and sends the JMS notification message.
    Inside this class we have the following method :
    @PostPersist
        private void sendInsertMessage(Batch insertedBatch) throws JMSException {
            AddBatchMessage message = new AddBatchMessage();
            message.setBatch(insertedBatch);
            try {
                messageSenderServiceBean.sendRefreshMessage(message);
            } catch (Exception oups) {
                oups.printStackTrace();
        }In the previous code, I recuperate the inserted batch and the "messageSenderServiceBean" facade to send a refresh message.
    My problem is that I can get the inserted batch, but the object "messageSenderServiceBean" is null knowing that I have the following annotation to get the "messageSenderServiceBean" facade.
    @EJB
        private MessageSenderServiceLocal                   messageSenderServiceBean;Whyhe object "messageSenderServiceBean" is null ??
    Can any one help me ??
    Thanks in advance.

    Hello,
    Injection only occurs on server managed objects, not JPA managed entities or other java objects such as the listeners registered with JPA. So your Listener class will need to look up the server objects or other resources directly from the context rather than rely on them being injected. I don't have any good examples handy, but similar to how you would look up an ejb/datasource etc before injection.
    Best Regards,
    Chris

  • How to stop and start MDBs to listen for JMS messages

    Hello! This might be more of an architecture question rather than a technical questing, but I post it here, in the lack of a better place...
    For several years I have been using Webster and Webster MQ to send messages back and forth to clients. The architecture for the middleware platform has been designed around the functionality of ListenerPorts. Listenerports is a Webster functionality that let you "stop" and start to listen to JMS messages for a given MDB either by admin console, or by JMX.
    The arhitecture we used was something like this :
    1.Client sends a persistent message to a queue. (order)
    2. An MDB pics up the order message, calls a SessionBean that "fronts" the IIOP back end system.
    This is quite "out of the box" architecture, but we used the Listenerports to solve a stability problem for our back end system.
    The backEnd system was quite unstable, so the EJB threw an exception (typically because of timeout or connection refused) back to the MDB.
    The Listenerport was "defined" to handle 3 errors before stopping, so the MDB resent the message twice before the listenerport automatically stopped. The nice thing about this feature was that the client could continue to send orders, and was not bothered when the back end system was down.
    When the backEnd system was up and running, we could start the listenerport and it was all back to normal state. We even had a start script that checked the state of the listenerport every 30 minute, and started it automatically if it was stopped, making the admin task of starting the MDB unnecessary..
    Now.. Why am I telling this story..
    I would like to know how this could be done using "clean" J2EE technologies..That is..Not using any technology that is not portable..
    I`m playing with glassfish at home, and it struck me that there is nothing in the J2EE spec that defines the functionality described above ? Am i missing something ?
    I Do not want to stop My application because the back end system is down? That is the only way (i know of) that i can "stop" to listen for messages..
    I can put all the messages on an error queue when the backbend system is down, but that would lead to more code just to handle the error messages. Maybe the easiest way to solve this is to "move" (programmatically) all messages from the error queue over to the "standard" queue every XX minute, but somehow that sounds "wrong"
    Can anyone give me some advice to how this problem situation should be solved ? I`m interested in the solution both from an architectural perspective and from a more technical perspective..
    Best regards
    Hans-Jacob Melby

    Breakpoints, whether normal or conditional, are just meant for debugging of your code.  I had the sense from your question that the pausing you want to do is a part of normal operation of your code.  I would NOT recommend using a breakpoint for that situation.  It would bring up the block diagram showing the breakpoint when it occurs.  A user besides the programmer would not know what to do in that case.
     Yes, both the inner and outer loops would have shift registers.
    Putting a case structure with a small while loop inside the "Pausing Case" is doable.  It just depends on what you are doing or waiting for while the program operation is "paused".

  • JMS Message Queue - stuck in

    I am on SOA SUITE 11.1.17
    I have a jms queue set up and am able to successfully send messages to it using the SOA JMS Adapter.  I am able to succesfully listen to a queue using a JMS adapter in a different project.
    However, here when I try to "listen" to the queue using a java program, the message is "received" in my java program and processed as it should be.  The java program is running in a while loop, so it stays running.
    On the queue, when the java program reads it, the message is moved to the "Messages Pending" column.  When I kill the java program, the message is returned to the "Messages Current"
    Would anyone have any ideas about this?  We have an existing java based program isn't properly "closing" the message.
    I tried:
    1.  placing msg.acknowledge() in the code, since the documentation states that messages that are in "Messages Pending" have been read, but not acknowledged or committed -- but this does nothing.
    2.  Setting the expiration on the message to 1, but that is a hack.  I would rather fix the problem than use a hack.
    Anyone have any ideas what is wrong?
    Thank you,
    Stuart
    import java.io.IOException;
    import java.io.InputStreamReader;
    import javax.jms.Connection;
    import javax.jms.JMSException;
    import javax.jms.Message;
    import javax.jms.MessageConsumer;
    import javax.jms.MessageListener;
    import javax.jms.Session;
    import javax.jms.TextMessage;
    public class JMSListenAndRespond extends JMSQueueHandler implements MessageListener {
      private Session jmsSession = null;
      private MessageConsumer jmsMessageConsumer = null;
      private Connection jmsConnection = null;
      int counter = 1 ;
      public static void main(String[] args) throws Exception {
        InputStreamReader commandBuffer = null;
        char command = '\0';
          // first listen for any messages
          JmsDataObject q = new JmsDataObject();
          q.setJmsCF("jms/TestConnectionFactory");
          q.setJmsQueue("jms/TestJMSQueue");
          q.setServerPwd("welcome1");
          q.setServerLogin("weblogic");
          q.setUrl("t3://localhost:7101");
          q.setJmsMsg("na -- we are listinging...");
        JMSListenAndRespond lis = new JMSListenAndRespond();
         lis.consumeMessage(q);
        System.out.println("(type q to exit at any time...)\n");
        try {
          // Now just loop, waiting for messages until user types 'q' to quit
          commandBuffer = new InputStreamReader(System.in);
        while (!(command == 'q')) {
           try {
              command = (char)commandBuffer.read();
              System.out.println("Command: "+command);
              lis.stopListening();
            } catch (IOException e) {
              System.err.println("I/O Exception: ");
              e.printStackTrace();
           } //while
        } finally {
                lis.stopListening();
          lis.stopListening();
       public void stopListening() {
        try {
          if (jmsMessageConsumer != null) {
            jmsMessageConsumer.close();
          if (jmsSession != null) {
            jmsSession.close();
          if (jmsConnection != null) {
            jmsConnection.close();
        } catch (JMSException e) {
          System.err.println("Couldn't properly close all resources.\n");
          e.printStackTrace();
      private void prepareToConsumeMessage() {
        // create JMS connection, session, consumer and register listener - then start session
            try {
          // create connection
          jmsConnection = getJmsConnectionFactory().createConnection();
          // create session
          jmsSession =   jmsConnection.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
          jmsMessageConsumer = jmsSession.createConsumer(getJmsDestination());
          // register a message listener (onMessage)
          jmsMessageConsumer.setMessageListener(this);
          // initiate connection - make sure to register your listener first or you might lose messages
          jmsConnection.start();
          System.out.println("\n...listening for message!\n");
        } catch (JMSException e) {
          System.err.println("Problem initializing JMS session");
          e.printStackTrace();
          System.exit(-1);
         * onMessage
         * The callback function invoked upon message reception
      public void onMessage(Message msg) {
        try {
          String msgText;
          if (msg instanceof TextMessage) {
            msgText = ((TextMessage)msg).getText();
            // this method expects a CSV string with the following makeup:
            // firstName,lastName,gender,birthdate,address,city,zipcode,state,insurancePolicyId
            String messageId = msg.getJMSMessageID();
          // code to process goes here.....
          } else {
            // if message is not a TextMessage, attempt a conversion to string
            System.out.println("\n** NEW MESSAGE (" + msg.getClass().getName() +
                               "):\n" +
                msg.toString());
        } catch (JMSException e) {
          e.printStackTrace();
      public void consumeMessage(JmsDataObject q ) {
        initializeJndiProperties(q);
        initializeJNDIandCF(q.getJmsQueue());
        prepareToConsumeMessage();
    import java.util.Properties;
    import javax.jms.Connection;
    import javax.jms.ConnectionFactory;
    import javax.jms.Destination;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    public abstract class JMSQueueHandler {
      protected void initializeJNDIandCF(String destinationQueueName) {
        // initialize JNDI context and lookup connection factory and destination
        try {
          // Initialize JNDI context
          jndiContext = new InitialContext(jndiProperties);
        } catch (NamingException e) {
          e.printStackTrace();
        try {
          // lookup JMS connection factory in JNDI
          jmsConnectionFactory =
              (ConnectionFactory)jndiContext.lookup(jndiProperties.getProperty("factory.name"));
          // lookup JMS destination in JNDI
          jmsDestination = (Destination)jndiContext.lookup(destinationQueueName);
        } catch (NamingException e) {
          System.err.println("Problem during the JNDI lookup\n");
          e.printStackTrace();
          System.exit(-1);
      public void initializeJndiProperties(JmsDataObject qdo ) {
        // set JNDI properties
        jndiProperties.put("java.naming.factory.initial","weblogic.jndi.WLInitialContextFactory");
        jndiProperties.put("java.naming.provider.url", qdo.getUrl() );
       // jndiProperties.put("java.naming.security.principal", NAMING_PRINCIPAL);
        jndiProperties.put("java.naming.security.principal", qdo.getServerLogin() ) ;
        //  jndiProperties.put("java.naming.security.credentials", NAMING_CREDENTIAL);
        jndiProperties.put("java.naming.security.credentials", qdo.getServerPwd() );
        //jndiProperties.put("factory.name", JMS_CONNECTION_FACTORY);
        jndiProperties.put("factory.name", qdo.getJmsCF() );
      //protected static final String NAMING_PROVIDER_URL = "t3://localhost:7101";
    //protected static final String NAMING_PRINCIPAL = "weblogic";
    // protected static final String NAMING_CREDENTIAL = "welcome1";
    // protected static final String JMS_CONNECTION_FACTORY = "jms/patientsJmsCF";
    // protected static final String JMS_CONNECTION_FACTORY = "jms/TestConnectionFactory";
      ConnectionFactory jmsConnectionFactory = null;
      Destination jmsDestination = null;
      InitialContext jndiContext = null;
      Properties jndiProperties = new Properties();
      public void setJmsConnectionFactory(ConnectionFactory jmsConnectionFactory) {
        this.jmsConnectionFactory = jmsConnectionFactory;
      public ConnectionFactory getJmsConnectionFactory() {
        return jmsConnectionFactory;
      public void setJmsDestination(Destination jmsDestination) {
        this.jmsDestination = jmsDestination;
      public Destination getJmsDestination() {
        return jmsDestination;

    Thanks for the reply. There are no errors what so ever regarding MDB issues. Not in the weblogic / console logging, nor in the logging of the component itself.
    The MDB itself is setup to have 16 concurrent beans per component deployment. The component is clustered over 4 server instances. So there are quite some concurrent MDBs running. However since the messages get stuck for weeks eventhough the component only has bursts of messages to process, one would think that the the stuck messages would be processed whenever the component has some spare time (which it has a lot between the bursts).
    Therefor i doubt it has anything to do with too little MDBs running. But frankly I have no idea what's wrong.

  • JMS Messages Stuck in Pending

    Hi,
    We have Weblogic JMS provider and we use spring JMS listener to read messages of the queues. Our Spring listeners are running inside a webMethods Integration Server container. For a few of the queues, we have been seeing messages that are stuck in the "Pending" state on the JMS queues. The state string inside webLogic is shown as "receive". We don't have any evidence from our logs that the message actually is received by the listener or by subsequent processes down stream. The messages gets cleared when the Weblogic server is restarted.
    Has anyone faced a similar issue or any ideas as to what might be causing this stuck messages?
    Our weblogic version is 9.2
    Regards,
    Aneel
    Edited by: user3127831 on Mar 24, 2009 7:02 AM

    Hi Aneel
    Typically JMS messages get stuck in pending state between components because of XA issues - due to configuration on one side of the fence or another, transactions aren't committed successfully, so a JMS message is placed on a queue successfully, but is not available due to the transaction that created it not committing successfully.
    What is creating the messages being placed on the queues? What's the difference between how you're creating messages for the queues you can read successfully and the ones that are not becoming available?

  • JMS Message Bridge - WLS to MQ

    Hi,
    Subsequent to my last posts on Foreign JMS Server setup (where I had to receive a msg from a remote MQ Queue), now I have a requirement to post messages to an remote MQ Queue for a diff application.
    As a POC, I configured the JMS Message Bridge with bridge source as my local JMS queue and bridge destination as the Remote MQ Queue and it works fine as expected !!
    just have couple of questions on that -
    1. For a long time, I was struggling with this error on server startup
    <BEA-190032> << eis/jms/WLSConnectionFactoryJNDINoTX > ResourceAllocationException thrown by resource adapter on call to ManagedConnectionFactory.createManagedConnection(): "javax.resource.ResourceException: Failed to start the connection ">
    Then I realized from the server log that the actual reason was authentication failure in MQ Queue Manager :
    JMSWMQ2013: The security authentication was not valid that was supplied for QueueManager '' with connection mode 'Client' and host name '77.40.190.130'. Please check if the supplied username and password are correct on the QueueManager you are connecting to AND
    JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2035' ('MQRC_NOT_AUTHORIZED').
    Since this MQ setup is managed by someone else, when they pass on the .binding file after creating queuemanager, queue, etc, Should I also ask them for the username and password for the QM?? I am not sure if this is a part of the .binding file.
    2. Some doubts around the QOS. As I understood, I am using the No-Transaction Adapter. This means I can use QOS as either "Atmost once" or "Duplicate OK". The latter seems to be ok so that I dont lost messages in any case. But I am yet to find out if the other application is ok to handle duplicates.
    But is there a restriction/limitation to use "Exactly Once" ?? I noticed that there is also an XA-Transaction Adapter in WLS. Is it not possible to use that with MQ?
    Thanks in advance.
    best regards,
    Murali

    In your binding file QCF or XAQCF definition , you will see a Channel field since you are using a client mode to connect to the queue manager. This channel is called a Server Connection Channel [ SVRCONN]. At the queue manager side of things, when this SVRCONN is defined, MQ Admin teams tend to define an attribute called MCAUSER. In this setup the userid used for authorisation at queue manager is the following in the below precedence:
    1. If MCAUSER is defined in the channel, that will be the user id and it overrides any security context sent from client application. This user id should have sufficient permissions to connect to queue manager , get , put. The MQ admin teams on certain platforms will be able to get the exact permission that is missed from the queue manager error logs when a 2035 security exception occurs.
    2. If no MCAUSER is defined then the userid passed in the createConnection JMS call will be the user context used.
    I am not exactly sure of the behaviour when no MCAUSER and no user id in createConnection calls, but i think it takes the user of the MQ Listener process which starts the SVRCONN channel instance when a client initiates the connection.
    So for your situation, it will be worth start checking with how the MQ side configuration is. This issue tends to be a very common issue with client applns connecting to qmgr.

  • Message Listener Problem (iDoc)

    I am receiving an iDoc successfully in the Message Listener within Mii.  I have created a Processing Rule for the Message Type and tied it to a simple BLS.  The BLS has an XML input parameter which is selected in the Processing Rule.
    The BLS simply maps the XML input parameter to an XML output parameter and that's it as I want to make sure communication is working before creating any BLS logic.
    The iDoc Message goes into failure status and this is what I get in the log:
    Unable to process request com.sap.jms.client.message.JMSObjectMessage@431f1d25
    [EXCEPTION]
    com.sap.xmii.bls.exceptions.TransactionLoadException: Unable to create transaction instance
    Any ideas why this is happening?

    After much searching and trial and error, I was able to locate the source of this problem.  While I was modifying the "Log Level" in the Processing Rule, someone else changed the Transaction Security to include the "SAP XMII Developer" role.  Once I remove this role from the BLS, the same symptom occurs. 
    It seems this is the only role that allows the Processing Rule to trigger the BLS's.  Is this hard coded somewhere in Mii that this role is required?  If so where can I find these types of requirements so I can avoid going through this for other Mii functionality in the future?
    Thanks

  • Need suggestion on  implementing JMS message error recovery

    Hi,
    Our application has a JMS topic where we publish application events. Now, there can be scenarios where the consumers cannot process the message due to some infrastructure issues and would error out. We need a way so that those messages can be reprocessed again later. we are thinking of the following design for JMS message error recovery
    1. Use a persistent TOPIC (this would ensure guaranteed delivery)
    2. Configure a error destination on JMS topic e.g a jms queue
    3. Have an error handling MDB listening to the Error destination. An error handling MDB would dequeue the errored messages from error destination and persist it to a Data base "error" table..
    4. Provide a mechanism to republish those messages to topic (e.g a scheduler or admin ui or a command line utility) .. The messages would deleted from database "error" table and published to topic again....
    A. Are there any issues with the above design which we need to handle?
    B. Are there any additional steps required in a Cluster environment with a distributed topic and distribute error destination? (our error mdb will have one-copy-per-application setting)
    B. From a performance angle, Is it OK to use persistent TOPIC ? Or will it better to persist the message to the db table and then publish it as a non persistent message ... ? (But i guess the performance should be more or less the same in both of these approaches)
    C. Are there any other recommended design patterns for error recovery of JMS messages
    Please advise.
    Regards,
    Arif

    Thanks Tom !
    We may not be able to go with the approach of delaying/pausing redelivery of the messsage because
    1. Pausing entire MDB approach: Our MDB application consumes messages generated by different producers and our MDB needs to continue processing the messages even if messages corresponding to one producer is erroring out
    2. Redelivery delay : This would only delay the retry of an errored message. But there would still be a problem if the message fails during all retries (i.e redelivery limit count). We don't want to lose this message. In our case, It is possible that a particular message cannot be processed due to unavailability of a third party system for hours or may be a day.
    Basically, i am looking on approaches for a robust and performant error recovery/retry framework for our application (refer details in my first post on this thread) while fully making use of all features provided by middleware (WLS). Please advise.
    Regards,
    Arif

  • Lost (and found) JMS - messages

              Using WLS 6.1 and have experienced that JMS messages has not been delivered to
              its consumer correctly. We are interested in any suggestions to what has happend,
              what can be done to avoid the problem in the future, or perhaps how we can find
              out more about the problem.
              We have a message driven bean A which sends messages to the queue Q, of which
              the message driven bean B is the only consumer.
              What we recently have experienced is that some of the messages delivered by A
              to Q never are delivered to B. But the messages seems to be persisted correctly,
              because after a restart they reappear!
              Following is a more detailed description of the scenario:
              1. A message is sendt with DeliveryMode=PERSISTENT and TimeToLive=0. QueueSender.send
              is invoked and returns normally.
              2. The consumers never gets the message (B.onMessage i never invoked with this
              message).
              3. Point 1-2 is repeated for 13 different messages over a period when ~100 similar
              messages are delivered normally.
              4. The server is then restarted.
              5. In the starup log it is indicated that 44 records are found in the JMSStore.
              6. When the server restarts, the "lost" messages gets delivered to B.
              After the server restart we have not experienced the problem again.
              Logs does not show anything unusual about the previous restart.
              Other details:
              There is always exatly 1 instance of A running, and 5-20 instances of B. A implements
              and uses a pool of javax.jms.XAQueueSession instances, which shares a single instance
              of javax.jms.XAQueueConnection. The aknowledge-mode for B is "Auto-aknowledge".
              We're using Weblogic Server 6.1.3.0 / Red Hat Linux 7.3.
              Any help on this problem is appreciated!
              

              I believe we've seen just the behaviour you describe on 6.1 SP2, but only on a
              multi-cpu box (Solaris), and only under load. We can't reproduce the problem reliably,
              and get no error messages/warnings anywhere, so very little to send to customer
              support; by the time we notice this, the problem's long passed, so a thread dump's
              of no use.
              We're going to try and see how SP5 (which has loads of JMS fixes) pans out.
              But if you find anything out, could you post here?
              simon.
              "Harald Stendal" <[email protected]> wrote:
              >
              >Using WLS 6.1 and have experienced that JMS messages has not been delivered
              >to
              >its consumer correctly. We are interested in any suggestions to what
              >has happend,
              >what can be done to avoid the problem in the future, or perhaps how we
              >can find
              >out more about the problem.
              >
              >We have a message driven bean A which sends messages to the queue Q,
              >of which
              >the message driven bean B is the only consumer.
              >What we recently have experienced is that some of the messages delivered
              >by A
              >to Q never are delivered to B. But the messages seems to be persisted
              >correctly,
              >because after a restart they reappear!
              >
              >Following is a more detailed description of the scenario:
              >
              >1. A message is sendt with DeliveryMode=PERSISTENT and TimeToLive=0.
              >QueueSender.send
              >is invoked and returns normally.
              >2. The consumers never gets the message (B.onMessage i never invoked
              >with this
              >message).
              >3. Point 1-2 is repeated for 13 different messages over a period when
              >~100 similar
              >messages are delivered normally.
              >4. The server is then restarted.
              >5. In the starup log it is indicated that 44 records are found in the
              >JMSStore.
              >6. When the server restarts, the "lost" messages gets delivered to B.
              >
              >After the server restart we have not experienced the problem again.
              >
              >Logs does not show anything unusual about the previous restart.
              >
              >Other details:
              >There is always exatly 1 instance of A running, and 5-20 instances of
              >B. A implements
              >and uses a pool of javax.jms.XAQueueSession instances, which shares a
              >single instance
              >of javax.jms.XAQueueConnection. The aknowledge-mode for B is "Auto-aknowledge".
              >
              >We're using Weblogic Server 6.1.3.0 / Red Hat Linux 7.3.
              >
              >Any help on this problem is appreciated!
              >
              

  • Processing JMS messages one at a time

    Hi, I'm on a project where we're trying to synch Siebel and EBS Customer information. However there are certain events that can trigger Customer data being sent twice simultaneously; this produces problematic racing conditions when the Customer data is new to the receiving system.
    We're trying to throttle that by sending the messages to a JMS queue and process them one at a time, ie, we only want one instance of the JMS queue listener activated at any one time (we don't expect continuous load; mainly small bursts). Unfortunately I'm not sure which properties have to be changed to do this. I have created a JMS listener that consumes message, pretty much created by the adapter wizard. Currently the listener is spawning new instances just as fast as the messages come in causing EBS AppAdapter errors (can't create new Customer as it already exists).
    Here's the JMS operation definition:
    <pc:inbound_binding />
    <operation name="Consume_Message">
    <jca:operation
    ActivationSpec="oracle.tip.adapter.jms.inbound.JmsConsumeActivationSpec"
    DestinationName="jms/CustomerInterface"
    UseMessageListener="false"
    PayloadType="TextMessage"
    OpaqueSchema="false" >
    </jca:operation>
    <input>
    <jca:header message="hdr:InboundHeader_msg" part="inboundHeader"/>
    </input>
    </operation>
    </binding>
    This is the activation agent:
    <activationAgents>
    <activationAgent className="oracle.tip.adapter.fw.agent.jca.JCAActivationAgent" partnerLink="ReceiveAccountJmsAdapter">
    <property name="portType">Consume_Message_ptt</property>
    </activationAgent>
    </activationAgents>
    This is the connector-factory:
         <connector-factory location="eis/CustomerInterface" connector-name="Jms Adapter">
              <config-property name="connectionFactoryLocation" value="jms/Queue/CustomerInterface"/>
              <config-property name="factoryProperties" value=""/>
              <config-property name="acknowledgeMode" value="AUTO_ACKNOWLEDGE"/>
              <config-property name="isTopic" value="false"/>
              <config-property name="isTransacted" value="false"/>
              <config-property name="username" value="oc4jadmin"/>
              <config-property name="password" value="********"/>
              <connection-pooling use="none">
              </connection-pooling>
              <security-config use="none">
              </security-config>
         </connector-factory>
    What else will I have to do to get this to work? Or will I be forced to deploy it to it's own BPEL domain where dspMaxThreads and dspMinThreads are set to 1?
    -- Just tried to put it on its own domain and change the dspMaxThreads/dspMinThreads and that didn't work.
    - Dale
    Message was edited by:
    Dale Earnest

    Hi Al,
    Yes - it possible.
    Please read the section Describing Message Ordering of the Adapter Life-Cycle Management of the Application Server Adapter Concepts Guide found here: http://download.oracle.com/docs/cd/B31017_01/integrate.1013/b31005/life_cycle.htm#BABJIFJI
    Best regards
    Christian Damsgaard

  • JMS message not getting delivered

    I'm trying to create a simple MDB with JDeveloper 10.1.3.2.
    I've tried to configure the sender and receiver to use the embedded OC4J message service.
    The code compiles and runs without any errors but the message doesn't seem to get delivered to the MDB.
    How could I debug message delivery in this case?
    What could be causing the message delivery to fail?
    Here's the code from a session bean that sends the message:
    @Resource(mappedName="jms/Topic/testTCF") private ConnectionFactory connectionFactory;
    @Resource(mappedName="jms/Topic/testTopic") private Topic topic;
    public void sendMessage() {
    try {
    Connection con = connectionFactory.createConnection();
    Session session = con.createSession(true, 0);
    MessageProducer producer = session.createProducer(topic);
    TextMessage msg = session.createTextMessage();
    msg.setText("hello");
    producer.send(msg);
    con.close();
    } catch (JMSException e) { }
    MDB:
    @MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName="connectionFactoryJndiName", propertyValue="jms/Topic/testTCF"),
    @ActivationConfigProperty(propertyName="destinationName", propertyValue="jms/Topic/testTopic"),
    @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Topic")
    public class MessageReceiver1Bean implements MessageListener {
    public void onMessage(Message message) {
    System.out.println("hello");
    Message service configuration:
    <jms-server port="9227">
    <queue location="jms/Queue/testQueue" name="queue"/>
    <queue-connection-factory location="jms/Queue/testQCF"/>
    <topic location="jms/Topic/testTopic" name="topic"/>
    <topic-connection-factory location="jms/Topic/testTCF"/>
    <log><file path="../log/jms.log"/></log>
    </jms-server>

              A few questions to better understand your case,
              1) are you using pub/sub (topics) or ptp (queues) ?
              2) are you producing inside a transaction (either use JTA or jms transacted session)
              3) do you use/set TimeToDeliver parameter ?
              4) when you monitor, do you see your messages under pending count ?
              "Rajiv Kadayam" <[email protected]> wrote:
              >
              >I'm having trouble with the 6.1sp5 version of weblogic specifically with
              >the JMS
              >server not quite notifying my message listeners whenever a new message
              >is received
              >in the queue. I can see the messages via the console by way of clicking
              >"monitor
              >all desitinations". I don't see any exceptions at all. This piece of
              >code does
              >work in Weblogic 7 and it did work on weblogic 6.1sp4. I'm not quite
              >using MDBs
              >and my publishers are CORBA services and there are no EJB components
              >involved.
              >
              >The trouble is there are no exceptions and my message listeners are just
              >waiting.
              >any tips or ideas would be greatly appreciated.
              >
              >thanks
              >rajiv
              

  • JMS Messages getting stuck in queues

    Hi,
    I am facing this peculiar issue with queue messages not getting picked up.
    Application Architecture: There is 1 JMS queue ( which resides in WLDomain1 with in a Unix Box) and there are 2 windows boxes having 2 weblogic domains each with 3 instances of MDB deployed on each of the domains. So total of 12 consumers (2 Box * 2 Domain * 3 Instances of MDB) listens to the JMS queue.
    Issue: After bringing everything up I am able to see 12 consumer count listening to the queue. But when I run the application which writes total of 13 messages in the queue only 7 of them are getting processed and 6 messages are always getting stuck in the queues. Interestingly this 7 messages are mostly getting processed by consumers with in the same windows box. And the selection of windows box is completely random. To confirm whether both the windows boxes are configured fine I tried to test them individually and it works fine individually, the problem happens only if I bring up both the boxes together.
    Another observation is, if I bring down the non working domains, the pending messages start getting processed by the working domains. It gives an impression that the non working domains seem to lock the messages for processing but doesn't actually process it. Only when I bring down the domains it releases this lock.
    Below is the JMS Life cycle events I captured from log files :
    1. Start domain1 in WIN Box1
    ####<Nov 24, 2009 7:54:00 PM CST> <> <> <1259114040304> <783400> <> <> <JMSModule!Queue> <ConsumerCreate> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection59.session60.consumer62)> <> <>
    ####<Nov 24, 2009 7:54:00 PM CST> <> <> <1259114040309> <239900> <> <> <JMSModule!Queue> <ConsumerCreate> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection59.session63.consumer65)> <> <>
    ####<Nov 24, 2009 7:54:00 PM CST> <> <> <1259114040313> <2100> <> <> <JMSModule!Queue> <ConsumerCreate> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection59.session66.consumer68)> <> <>
    2. Start domain2 in WIN Box 1
    ####<Nov 24, 2009 7:54:55 PM CST> <> <> <1259114095403> <38600> <> <> <JMSModule!Queue> <ConsumerCreate> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection69.session70.consumer72)> <> <>
    ####<Nov 24, 2009 7:54:55 PM CST> <> <> <1259114095407> <335400> <> <> <JMSModule!Queue> <ConsumerCreate> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection69.session73.consumer75)> <> <>
    ####<Nov 24, 2009 7:54:55 PM CST> <> <> <1259114095410> <997700> <> <> <JMSModule!Queue> <ConsumerCreate> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection69.session76.consumer78)> <> <>
    3. Start domain1 in WIN Box 2
    ####<Nov 24, 2009 7:56:12 PM CST> <> <> <1259114172061> <316500> <> <> <JMSModule!Queue> <ConsumerCreate> <<anonymous>> <MC:CA(/<IP_BOX2>):OAMI(server.jms.connection79.session80.consumer82)> <> <>
    ####<Nov 24, 2009 7:56:12 PM CST> <> <> <1259114172066> <324300> <> <> <JMSModule!Queue> <ConsumerCreate> <<anonymous>> <MC:CA(/<IP_BOX2>):OAMI(server.jms.connection79.session83.consumer85)> <> <>
    ####<Nov 24, 2009 7:56:12 PM CST> <> <> <1259114172072> <757000> <> <> <JMSModule!Queue> <ConsumerCreate> <<anonymous>> <MC:CA(/<IP_BOX2>):OAMI(server.jms.connection79.session86.consumer88)> <> <>
    4. Start domain2 in WIN Box 2
    ####<Nov 24, 2009 7:56:54 PM CST> <> <> <1259114214000> <142800> <> <> <JMSModule!Queue> <ConsumerCreate> <<anonymous>> <MC:CA(/<IP_BOX2>):OAMI(server.jms.connection89.session90.consumer92)> <> <>
    ####<Nov 24, 2009 7:56:54 PM CST> <> <> <1259114214005> <38200> <> <> <JMSModule!Queue> <ConsumerCreate> <<anonymous>> <MC:CA(/<IP_BOX2>):OAMI(server.jms.connection89.session93.consumer95)> <> <>
    ####<Nov 24, 2009 7:56:54 PM CST> <> <> <1259114214009> <22400> <> <> <JMSModule!Queue> <ConsumerCreate> <<anonymous>> <MC:CA(/<IP_BOX2>):OAMI(server.jms.connection89.session96.consumer98)> <> <>
    At this point console shows 12 consumers listening the queue which is absolutely fine.
    5. Run application
    --Message Production
    This produces 13 messages ( I have not pasted the complete log)
    -- Message Consumption ( Only 7 messages are consumed)
    ####<Nov 24, 2009 8:00:05 PM CST> <> <> <1259114405953> <576400> <ID:<1047832.1259114392542.0>> <> <JMSModule!Queue> <Consumed> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection59.session63.consumer65)> <&lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;mes:WLJMSMessage xmlns:mes="http://www.bea.com/WLS/JMS/Message"&gt;&lt;mes:Header&gt;&lt;mes:JMSTimestamp&gt;1259114392542&lt;/mes:JMSTimestamp&gt;&lt;mes:Properties/&gt;&lt;/mes:Header&gt;&lt;/mes:WLJMSMessage&gt;> <>
    ####<Nov 24, 2009 8:00:10 PM CST> <> <> <1259114410091> <310100> <ID:<1047832.1259114393181.0>> <> <JMSModule!Queue> <Consumed> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection59.session66.consumer68)> <&lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;mes:WLJMSMessage xmlns:mes="http://www.bea.com/WLS/JMS/Message"&gt;&lt;mes:Header&gt;&lt;mes:JMSTimestamp&gt;1259114393181&lt;/mes:JMSTimestamp&gt;&lt;mes:Properties/&gt;&lt;/mes:Header&gt;&lt;/mes:WLJMSMessage&gt;> <>
    ####<Nov 24, 2009 8:00:10 PM CST> <> <> <1259114410130> <364600> <ID:<1047832.1259114400626.0>> <> <JMSModule!Queue> <Consumed> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection59.session63.consumer65)> <&lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;mes:WLJMSMessage xmlns:mes="http://www.bea.com/WLS/JMS/Message"&gt;&lt;mes:Header&gt;&lt;mes:JMSTimestamp&gt;1259114400626&lt;/mes:JMSTimestamp&gt;&lt;mes:Properties/&gt;&lt;/mes:Header&gt;&lt;/mes:WLJMSMessage&gt;> <>
    ####<Nov 24, 2009 8:00:10 PM CST> <> <> <1259114410134> <540700> <ID:<1047832.1259114393125.0>> <> <JMSModule!Queue> <Consumed> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection69.session76.consumer78)> <&lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;mes:WLJMSMessage xmlns:mes="http://www.bea.com/WLS/JMS/Message"&gt;&lt;mes:Header&gt;&lt;mes:JMSTimestamp&gt;1259114393125&lt;/mes:JMSTimestamp&gt;&lt;mes:Properties/&gt;&lt;/mes:Header&gt;&lt;/mes:WLJMSMessage&gt;> <>
    ####<Nov 24, 2009 8:00:10 PM CST> <> <> <1259114410137> <632400> <ID:<1047832.1259114393128.0>> <> <JMSModule!Queue> <Consumed> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection69.session73.consumer75)> <&lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;mes:WLJMSMessage xmlns:mes="http://www.bea.com/WLS/JMS/Message"&gt;&lt;mes:Header&gt;&lt;mes:JMSTimestamp&gt;1259114393128&lt;/mes:JMSTimestamp&gt;&lt;mes:Properties/&gt;&lt;/mes:Header&gt;&lt;/mes:WLJMSMessage&gt;> <>
    ####<Nov 24, 2009 8:00:12 PM CST> <> <> <1259114412026> <984200> <ID:<1047832.1259114393123.0>> <> <JMSModule!Queue> <Consumed> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection59.session60.consumer62)> <&lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;mes:WLJMSMessage xmlns:mes="http://www.bea.com/WLS/JMS/Message"&gt;&lt;mes:Header&gt;&lt;mes:JMSTimestamp&gt;1259114393123&lt;/mes:JMSTimestamp&gt;&lt;mes:Properties/&gt;&lt;/mes:Header&gt;&lt;/mes:WLJMSMessage&gt;> <>
    ####<Nov 24, 2009 8:00:16 PM CST> <> <> <1259114416045> <41800> <ID:<1047832.1259114400005.0>> <> <JMSModule!Queue> <Consumed> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection69.session70.consumer72)> <&lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;mes:WLJMSMessage xmlns:mes="http://www.bea.com/WLS/JMS/Message"&gt;&lt;mes:Header&gt;&lt;mes:JMSTimestamp&gt;1259114400005&lt;/mes:JMSTimestamp&gt;&lt;mes:Properties/&gt;&lt;/mes:Header&gt;&lt;/mes:WLJMSMessage&gt;> <>
    6. At this point Admin Consol shows 6 messages pending in the queue
    and From consumer numbers it is evident that consumers in WIN Box2 domains have not processed any messages
    Now if I stop server in WIN Box2 Domain1, WIN Box1 picks up the messages instantely
    ####<Nov 24, 2009 8:13:22 PM CST> <> <> <1259115202343> <897600> <> <> <JMSModule!Queue> <ConsumerDestroy> <<anonymous>> <MC:CA(/<IP_BOX2>):OAMI(server.jms.connection79.session80.consumer82)> <> <>
    ####<Nov 24, 2009 8:13:22 PM CST> <> <> <1259115202346> <421900> <> <> <JMSModule!Queue> <ConsumerDestroy> <<anonymous>> <MC:CA(/<IP_BOX2>):OAMI(server.jms.connection79.session83.consumer85)> <> <>
    ####<Nov 24, 2009 8:13:22 PM CST> <> <> <1259115202379> <582300> <> <> <JMSModule!Queue> <ConsumerDestroy> <<anonymous>> <MC:CA(/<IP_BOX2>):OAMI(server.jms.connection79.session86.consumer88)> <> <>
    ####<Nov 24, 2009 8:13:24 PM CST> <> <> <1259115204888> <4600> <ID:<1047832.1259114400029.0>> <> <JMSModule!Queue> <Consumed> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection69.session76.consumer78)> <&lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;mes:WLJMSMessage xmlns:mes="http://www.bea.com/WLS/JMS/Message"&gt;&lt;mes:Header&gt;&lt;mes:JMSTimestamp&gt;1259114400029&lt;/mes:JMSTimestamp&gt;&lt;mes:Properties/&gt;&lt;/mes:Header&gt;&lt;/mes:WLJMSMessage&gt;> <>
    ####<Nov 24, 2009 8:13:32 PM CST> <> <> <1259115212820> <256700> <ID:<1047832.1259114400258.0>> <> <JMSModule!Queue> <Consumed> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection59.session66.consumer68)> <&lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;mes:WLJMSMessage xmlns:mes="http://www.bea.com/WLS/JMS/Message"&gt;&lt;mes:Header&gt;&lt;mes:JMSTimestamp&gt;1259114400258&lt;/mes:JMSTimestamp&gt;&lt;mes:Properties/&gt;&lt;/mes:Header&gt;&lt;/mes:WLJMSMessage&gt;> <>
    ####<Nov 24, 2009 8:13:43 PM CST> <> <> <1259115223579> <280600> <ID:<1047832.1259114400032.0>> <> <JMSModule!Queue> <Consumed> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection59.session60.consumer62)> <&lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;mes:WLJMSMessage xmlns:mes="http://www.bea.com/WLS/JMS/Message"&gt;&lt;mes:Header&gt;&lt;mes:JMSTimestamp&gt;1259114400032&lt;/mes:JMSTimestamp&gt;&lt;mes:Properties/&gt;&lt;/mes:Header&gt;&lt;/mes:WLJMSMessage&gt;> <>
    7. At this poing Admin Consol shows 3 messages pending in the queue
    Now if I stop server in WIN Box2 Domain2, the remaining 3 gets processed
    ####<Nov 24, 2009 8:16:08 PM CST> <> <> <1259115368998> <193400> <> <> <JMSModule!Queue> <ConsumerDestroy> <<anonymous>> <MC:CA(/<IP_BOX2>):OAMI(server.jms.connection89.session90.consumer92)> <> <>
    ####<Nov 24, 2009 8:16:08 PM CST> <> <> <1259115369000> <885500> <> <> <JMSModule!Queue> <ConsumerDestroy> <<anonymous>> <MC:CA(/<IP_BOX2>):OAMI(server.jms.connection89.session93.consumer95)> <> <>
    ####<Nov 24, 2009 8:16:09 PM CST> <> <> <1259115369002> <902500> <> <> <JMSModule!Queue> <ConsumerDestroy> <<anonymous>> <MC:CA(/<IP_BOX2>):OAMI(server.jms.connection89.session96.consumer98)> <> <>
    ####<Nov 24, 2009 8:16:25 PM CST> <> <> <1259115385151> <123700> <ID:<1047832.1259114400324.0>> <> <JMSModule!Queue> <Consumed> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection69.session70.consumer72)> <&lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;mes:WLJMSMessage xmlns:mes="http://www.bea.com/WLS/JMS/Message"&gt;&lt;mes:Header&gt;&lt;mes:JMSTimestamp&gt;1259114400324&lt;/mes:JMSTimestamp&gt;&lt;mes:Properties/&gt;&lt;/mes:Header&gt;&lt;/mes:WLJMSMessage&gt;> <>
    ####<Nov 24, 2009 8:16:29 PM CST> <> <> <1259115389660> <836600> <ID:<1047832.1259114400535.0>> <> <JMSModule!Queue> <Consumed> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection59.session63.consumer65)> <&lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;mes:WLJMSMessage xmlns:mes="http://www.bea.com/WLS/JMS/Message"&gt;&lt;mes:Header&gt;&lt;mes:JMSTimestamp&gt;1259114400535&lt;/mes:JMSTimestamp&gt;&lt;mes:Properties/&gt;&lt;/mes:Header&gt;&lt;/mes:WLJMSMessage&gt;> <>
    ####<Nov 24, 2009 8:16:37 PM CST> <> <> <1259115397823> <610200> <ID:<1047832.1259114400432.0>> <> <JMSModule!Queue> <Consumed> <<anonymous>> <MC:CA(/<IP_BOX1>):OAMI(server.jms.connection69.session73.consumer75)> <&lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;mes:WLJMSMessage xmlns:mes="http://www.bea.com/WLS/JMS/Message"&gt;&lt;mes:Header&gt;&lt;mes:JMSTimestamp&gt;1259114400432&lt;/mes:JMSTimestamp&gt;&lt;mes:Properties/&gt;&lt;/mes:Header&gt;&lt;/mes:WLJMSMessage&gt;> <>
    Kindly throw some light on this issue. Also do let me know if you need any more specific details about this.
    Thanks,
    Abhijeet
    Edited by: user5240164 on Nov 25, 2009 11:35 AM
    Edited by: user5240164 on Nov 28, 2009 1:21 PM

    Hi,
    The problem may be conflicting names in your configuration. To ensure proper operation of WL Security, JMS, JTA, and JDBC, make sure that (A) each domain has a unique name, and (B) no two WebLogic servers have the same name (even if in two different domains).
    To ensure a more even distribution of messages, either simply send more than a token amount messages (eg, a hundred or so, rather than just 12), or configure a custom connection factory on the domain that hosts the queue, reduce MessagesMaximum on the connection factory to 1, and then modify each MDB to refer to the custom connection factory. The MessagesMaximum setting controls the number of messages that can be pre-pushed (pipelined) to a single asynchronous consumer.
    For more information see "Best Practices for JMS Beginners and Advanced Users" in the latest versions of the JMS admin guide, and "JMS Performance & Tuning Check List" in the WebLogic Performance and Tuning guide.
    Tom

  • Processing JMS messages in sequence one after another

    This is my use case which I wan to implement in OSB.
    1. I have a queue which will receive messages in huge numbers from a single sender.
    2. I have a proxy which will read each message and process the message and send it out.
    In step 1 , I want each message to be read sequentially and when step 2 finishes executing then I want to read the next message from the queue.
    I need to give an acknowledgment to JMS that the message has finished processing and it can make the next message available to the proxy.
    What is the best option to implement this use case ?.
    Regards

    By default Weblogic JMS Queues are FIFO. But that is true only if there is only one consumer of the queue.
    In case of a clustered environment that is not true and in case of OSB even with a single managed server multiple threads are created for a JMS listener Proxy(by default 16). So there will be 16 instances of the Proxy trying to read messages from the Queue and each will be handed out a message and sequential integrity is disturbed.
    There are three ways to overcome this problem:
    1. Unit of Order
    This is suitable only when you want messages of the same group to be processed sequentially while multiple groups can be processed in parallel.
    For e.x. you are getting multiple orders for multiple customers and you want to ensure that the orders of same customer are processed sequentially (in case a customer tries to change the quantity of an order then the latest one should be processed last). In this case you can set UOO as the CustomerID and each customer's order will be processed sequentially but orders of different customers will be still processed in parallel. WLS JMS achieves this by assigning a target queue instance on the cluster for each UOO value. It will assign Q!MS1 to CustID=1, Q!MS2 to CustID=2 and so on. All messages of the same UOO(of the same customer) will go to the same instance on the queue. Furthermore it will ensure that no two messages of the same UOO are released together to the listeners. So if a queue instance has 5 messages each of both Cust=1 and Cust=2, only one message each of Cust1 and Cust2 will be processed by the listeners even if there are 16 listening threads.
    Pros and Cons:
    Overall performance is improved since you can still achieve some parallel processing.
    There will be a slight overhead of processing the UOO headers on the JMS servers.
    Can not ensure sequencing of all the messages. (Although you can achieve that by setting the same UOO on all the messages)
    If the managed server assigned to a UOO is down, if a publisher tried to put the next message for that UOO, it will fail since it will not try to send that message to any other managed server.
    2. Single threaded processing
    If you don't want to process even different groups of messages in parallel and if you want absolute sequencing (i.e. irrespective of the CustomerID you want all the messages to be processed in the sequence they arrive) you will need to process them in a single threaded model. The JMS queue should be deployed on only one managed server of the cluster. The JMS proxy listening to the queue should also be deployed on a single managed server(You will need to change the targeting for the EJB created for this Proxy in the Deployments) and there should be a Work Manager for this Proxy with Maximum Thread Constraint set as 1. In the Connection Factory which the Proxy uses, set the Maximum Messages per session to 1. Another approach for Single threaded could be to set the same value of UOO on all of the messages. This will make all the messages to go to the same Q instance in the cluster and also will make sure that even if Proxy has multiple threads, only one message will be processed at a time.
    Pros and Cons:
    Completely single threaded processing, will take more time since messages will be processed one after the other.
    Load balancing will go awry as all the messages will be processed by only one server.
    3. Using custom implementation
    The most complex way is to create a completely custom implementation. Put all the messages in a DB and then process them one at a time based on timestamp.
    Pros and Cons:
    It will take more effort to implement than the other two approaches.
    It will again need single threaded processing after the messages are put on the DB
    Performance wise there will be more impact because of additional DB calls
    More complex to maintain
    Based on your exact requirements you can choose which approach you want. If you have SOA suite as well them it would be better to move this solution to SOA suite as OESB(Mediator) component of SOA suite has re-sequencing feature.

Maybe you are looking for