Win a copy of Design for the Mind this week in the Design forum!
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

EJB timeout issue

 
nandkishor rao
Ranch Hand
Posts: 53
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I have implemented ejbTimeout in my MDB. I want the ejbTimeout to be called only once when the timeout happens but it is called at regular intervals.

Below is the code how i am creating a Timer
TimerService ts = this.ctx.getTimerService();
long timerValue = scheduledTime.getTimeInMillis();
Timer timer = ts.createTimer(timerValue, "mytimer");
 
Jaikiran Pai
Marshal
Pie
Posts: 10447
227
IntelliJ IDE Ubuntu
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
How is the TimerService configured/deployed?
[ April 18, 2007: Message edited by: Jaikiran Pai ]
 
nandkishor rao
Ranch Hand
Posts: 53
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
This is what I have configured using EJB docklet.

/***************************************************************************
* todo Document me!
*
* @ejb.bean name="RcuTimerMDB" jndi-name="RcuTimerMDB"
* destination-type="javax.jms.Queue"
*
* @ejb.transaction type="Required"
*
* @weblogic.message-driven destination-jndi-name="RcuTimerQueue"
*
* @weblogic.pool initial-beans-in-free-pool="1" max-beans-in-free-pool="1"
*
* @weblogic.enable-call-by-reference True
*
* @version $Id$
*/
 
Mark Spritzler
ranger
Sheriff
Posts: 17278
6
IntelliJ IDE Mac Spring
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Please do not post duplicate threads. I have deleted your duplicate post already.

Thanks

Mark
 
nandkishor rao
Ranch Hand
Posts: 53
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Anyone any clues
 
Jaikiran Pai
Marshal
Pie
Posts: 10447
227
IntelliJ IDE Ubuntu
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Tried this with a sample application and worked fine for me:



Sent 1 message to the queue on which this MDB was listening. The timer got triggered after 20 seconds and only once for this one message. Is your code similar or do you have something else?
 
nandkishor rao
Ranch Hand
Posts: 53
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
this My mdb has to start by itself so when my application is deployed it calls the ejbCreate(), from there I am posting a message to the MDB itself and that is how my mdb gets the first message. After receiving the message in onMessage(), it sets my timer value. So my ejbTimeout method is called but the problem is it is called more than once.
In my ejbTimeout I have implemented my buisness logic which is calling some helper java classes to insert data into database. But after inserting
some rows into database it giving me a EJBException: transaction timed out after 34 secs. After this exception is thrown, ejbCreate() and ejbTimeout() is called several times , don't know why,Is it because of the exception???
 
Jaikiran Pai
Marshal
Pie
Posts: 10447
227
IntelliJ IDE Ubuntu
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
when my application is deployed it calls the ejbCreate(), from there I am posting a message to the MDB itself and that is how my mdb gets the first message


Any reason why you are doing this? The MDB publishing a message to itself.


transaction timed out after 34 secs. After this exception is thrown, ejbCreate() and ejbTimeout() is called several times , don't know why,Is it because of the exception???


That's the problem. Since the transaction is rolled back, the message is being redelivered and looks like on redelivery of the message a new instance of the MDB is created and hence the ejbCreate method is being called again.
 
nandkishor rao
Ranch Hand
Posts: 53
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I have taken care that the message to MDB itself should be delivered once
and the message is getting consumed.

I am putting my code of ejbCreate()
Here counter is a static variable in some other class
/**
* This method is required by the EJB Specification.
*/
public void ejbCreate() {
log.debug("ejbCreate() of RcuTimerMDB - ejbCreate called");
if (RcuAfmDao.COUNTER == 0) {
this.subject = "RCUTimerToRunAt2PM";
postMessage();
RcuAfmDao.COUNTER++;
}
}
private void postMessage() {
// post a dummy message to the same queue bean
JMSQueueDispatcherInterface dispatcher = (JMSQueueDispatcher) ApplicationContextManager.getApplicationContext()
.getBean("jMSQueueDispatcher");
log.debug("inside postMessage" + dispatcher.toString());
dispatcher.dispatchToQueue(JMSQueueCommon.RCU_TIMER_QUEUE, new String(this.subject));
log.debug("posted Message to: " + JMSQueueCommon.RCU_TIMER_QUEUE + "SUBJECT: " + this.subject);

}
 
Jaikiran Pai
Marshal
Pie
Posts: 10447
227
IntelliJ IDE Ubuntu
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Nandkishor, as per the specs whenever the transaction in the onMessage method gets rollbacked (maybe due to an exception), the server will redeliver the message (upto the redeliverylimit value) to the MDB. Effectively, this means that the onMessage method will be called that many times (you can verify this by adding some System.out.println statements in that method) and as a result the createTimer code will be executed repeatedly.
 
nandkishor rao
Ranch Hand
Posts: 53
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Thanks man, I think thats the problem.
Anyways I am putting my onMessage code here.
May be if there i anything more which you can find out.

public void onMessage(Message msg) {
final ObjectMessage om = (ObjectMessage) msg;
log.debug("Message received" + om);
try {
String message = (String) om.getObject();
Calendar scheduledTime;
if (message.equals("RCUTimerToRunAt2PM")) {
scheduledTime = Calendar.getInstance();
scheduledTime.set(Calendar.HOUR_OF_DAY, 0);
scheduledTime.set(Calendar.MINUTE, 0);
scheduledTime.set(Calendar.SECOND, 0);
scheduledTime.set(Calendar.MILLISECOND, 0);
// Changing for now to RUN
scheduledTime.add(Calendar.HOUR_OF_DAY, +17);
scheduledTime.add(Calendar.MINUTE, +55);
log.debug("Setting the scheduler to run at 2 PM SCHEDULED TIME SET : " + scheduledTime.get(Calendar.HOUR_OF_DAY));
log.debug("Setting the scheduler to run at 2 PM " + scheduledTime.get(Calendar.MINUTE));

Calendar currentTime = Calendar.getInstance();
long timerValue = 0;
if (scheduledTime.getTimeInMillis() > currentTime.getTimeInMillis()) {
// if (scheduledTime.get(Calendar.HOUR_OF_DAY) >
// currentTime.get(Calendar.HOUR_OF_DAY)) {
timerValue = scheduledTime.getTimeInMillis() - currentTime.getTimeInMillis();
log.debug("Timer value set to read PACS CSV at 2 PM, TIMER VALUE: " + timerValue
+ " AND SCHEDULED TIME: " + scheduledTime.get(Calendar.HOUR_OF_DAY));
} else {
int todaysDay = currentTime.get(Calendar.DAY_OF_WEEK);
scheduledTime.set(Calendar.DAY_OF_WEEK, todaysDay + 1);
scheduledTime.set(Calendar.HOUR_OF_DAY, +14);
scheduledTime.set(Calendar.MINUTE, 0);
scheduledTime.set(Calendar.SECOND, 0);
scheduledTime.set(Calendar.MILLISECOND, 0);

timerValue = scheduledTime.getTimeInMillis();
log.debug("Timer value set to read PACS CSV tomorrow at 2PM, TIMER VALUE: " + timerValue
+ " AND SCHEDULED TIME: " + scheduledTime.get(Calendar.HOUR_OF_DAY));

String day;
switch (scheduledTime.get(Calendar.DAY_OF_WEEK)) {
case Calendar.SUNDAY:
day = "SUNDAY";
break;
case Calendar.MONDAY:
day = "MONDAY";
break;
case Calendar.TUESDAY:
day = "TUESDAY";
break;
case Calendar.WEDNESDAY:
day = "WEDNESDAY";
break;
case Calendar.THURSDAY:
day = "THURSDAY";
break;
case Calendar.FRIDAY:
day = "FRIDAY";
break;
case Calendar.SATURDAY:
day = "SATURDAY";
break;
default:
day = "UNKNOWN";
break;
}
log.debug("Scheduled Day: " + day);
this.subject = "RCUTimerToRunAt2PM";
log.debug("subject value :-" + this.subject);
}
TimerService ts = this.ctx.getTimerService();
// Here TimerName will be this.subject
Timer timer = ts.createTimer(timerValue, this.subject);
}
 
nandkishor rao
Ranch Hand
Posts: 53
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Please help me out

I am getting this exception while the ejbTimeout() is called
in this I have implemented my buisness logic which is working very fine but after sometime i am getting this exception . As far as I know the default timeout for MDB is 1 day then why is the transaction timeout.

Unexpected exception while enlisting XAConnection java.sql.SQLException: Transaction rolled back: Transaction timed out after 32 seconds
BEA1-553C4F1FEDDAA91F05EC
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic