quality@glassfish.java.net

Re: b65: transactional JMS - number of messages not checked on subsequent calls?

From: Christoph John <christoph.john_at_macd.com>
Date: Mon, 5 Oct 2009 22:27:05 +0200 (CEST)

Hi,

someone other already filed a bug regarding the JMS LOCAL issue. Can't
currently check who, I'm at home now. ;)
However, if I remember correctly the behaviour is fixed in b66.

Cheers
Chris

On Mon, October 5, 2009 18:10, Judy Tang wrote:
> Hi Matthias,
>
>
> Thanks for getting back to this thread and filed issues. I also saw
> Christoph hitting the same problem.
> Good catch :-)
>
>
> Thanks,
> Judy
>
>
> matthias.fraass_at_tricoder.net wrote:
>> Hi,
>>
>>
>> FYI - I filed bugs for these Issues:
>> imq.transaction.producer.maxNumMsgs ->
>> https://glassfish.dev.java.net/issues/show_bug.cgi?id=9976
>>
>>
>> JMS Admin GUI ->
>> https://glassfish.dev.java.net/issues/show_bug.cgi?id=9977
>>
>>
>> Best regards,
>>
>>
>> Matthias
>>
>>
>>
>> 2009/10/1 matthias.fraass_at_tricoder.net
>> <mailto:matthias.fraass_at_tricoder.net> <matthias.fraass_at_gmail.com
>> <mailto:matthias.fraass_at_gmail.com>>
>>
>>
>> Additional Info:
>> This only occurs with EMBEDDED JMS!
>> When I set the JMS to local or remote, the behaviour is like v2.1:
>> always fails correctly.
>>
>> Another thing - the Admin GUI has a bug:
>> Configuration -> Java Message Service: Changing the "Type" to
>> EMBEDDED or REMOTE sets the Type correctly in domain.xml. But
>> after reloading the page, "LOCAL" is displayed, no matter what is set up
>> in domain.xml. Should I file a bug for this?
>>
>>
>> -Matthias
>>
>>
>>
>> 2009/10/1 matthias.fraass_at_tricoder.net
>> <mailto:matthias.fraass_at_tricoder.net> <matthias.fraass_at_gmail.com
>> <mailto:matthias.fraass_at_gmail.com>>
>>
>>
>> Hi all,
>>
>>
>> summary: I think that the imq.transaction.producer.maxNumMsgs
>> is only checked once after GF start (in the first transaction?) and then
>> never again. Only the first call fails, subsequent calls that violate
>> this threshold don't fail.
>>
>> Setup:
>> - GF v3 b65
>> - JMS Queue "jms/SomeQueue" is configured with "Local"
>> transation support. -
>> domains\domain1\imq\instances\imqbroker\props\config.properties ->
>> imq.transaction.producer.maxNumMsgs=1000
>>
>> So I have this restful webservice, which I wrote to check how
>> many messages per second GF can produce:
>>
>> @Stateless
>> @Path("/jms")
>> public class JMSRestfulWebService {
>> @GET
>> @TransactionAttribute(TransactionAttributeType.REQUIRED)
>> public String putMessage() throws ... {
>> System.out.println("called putMessage");
>>
>>
>> javax.jms.Connection connection = connectionFactory.createConnection();
>> javax.jms.Session session =
>> connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
>> MessageProducer messageProducer =
>> session.createProducer(queue); long start = System.currentTimeMillis();
>> int i=0; long now=0; do {
>> now = System.currentTimeMillis(); TextMessage message =
>> session.createTextMessage(); message.setText("Hello, JMS!");
>> messageProducer.send(message); i++; }
>> while ((now-start) < 1000);
>>
>> return "JMS produced " + i + " messages in 1s"; }
>>
>>
>> }
>>
>>
>> and a consuming MDB:
>>
>> @MessageDriven(
>> activationConfig = { @ActivationConfigProperty( propertyName =
>> "destinationType",
>> propertyValue = "javax.jms.Queue" ) },
>> mappedName = "jms/SomeQueue") public class SomeMessageDrivenBean
>> implements MessageListener { ...
>> public void onMessage(Message message) { System.out.println("Hey! Someone
>> called me @" + System.currentTimeMillis());
>> }
>>
>>
>> }
>>
>>
>> The JMSRestfulWebService above produces about 4300 messages
>> per second. All within one transaction. On the first call after GF start
>> via http://localhost:8080/webservicetest/jms, I get the error message:
>>
>>> "com.sun.messaging.jmq.jmsserver.util.BrokerException:
>>>
>> transaction failed: [B4303]: The maximum number of messages [1.000] that
>> the producer can process in a single transaction
>> (TID=1467650178062093569) has been exceeded. Please either
>> limit the # of messages per transaction or increase the
>> imq.transaction.producer.maxNumMsgs property."
>>
>> Which is correct.
>>
>>
>> But on the second call (and from then on), there's no such
>> message and about 4300+ messages are produced and consumed! When I
>> restart the sever, the same behavior occurs: first call -> exception,
>> second+ call -> no exception.
>>
>> I double checked the following things:
>> - increasing the imq.transaction.producer.maxNumMsgs to 10.000
>> leads to no exception at all, which is correct. - I put the test case in
>> a Session Bean with the same results. So it doesn't have to do with the
>> RESTful webservice.
>> - Glassfish v2.1 works correctly (tested with a SessionBean
>> producing the messages): the exception is thrown every time!
>>
>> So the imq.transaction.producer.maxNumMsgs *is* checked - but
>> only for the first transaction?
>>
>> Best regards,
>>
>>
>> Matthias
>>
>>
>>
>>
>