Re: Message-Driven Bean OnMesssage() etc

Johan Eltes <[email protected]> Sun, 1 Jan 2006 16:18:06 +0100
Newsgroups gmane.comp.java.sun.ejb.general
Message-ID <[email protected]>
If you have many MDB instances (e.g. threaded MDBs) simultaneously
pulling messages off the queue/topic, you could let each mdb instance
forward the message without creating a new thread. You wouldn't
usually need to do asynchronous *wihin* an MDB, since the MDB is
asynchronous itself. What exactly is it you need to achieve by
threading, in addition to what you get by having an MDB?

/Johan

1 jan 2006 kl. 01.06 skrev Jingwen Jin:

> Hi, Thanks a lot for the suggestion. The fact that EJB does not
> support
> multi-threading surprised me. As I said, I wanted my MDB to store
> incoming
> messages in a data structure, and then have threads working on the
> sending of
> messages. How could such a task be achieved by using multiple
> beans? More
> details would be very helpful.
>
> When google-ing, I found somebody commenting that multi-threading
> would work
> when separating the "multi threadedness" into a separate layer
> outside of the
> EJB layer. In such a case, a java job scheduler is needed to handle
> the
> scheduling. Have you or has anybody on the list used any scheduler
> (such as the
> Quartz scheduler)?
>
> Thank you,
>
> Jingwen
>
>
> ---- Original message ----
>> Date: Thu, 29 Dec 2005 09:29:03 +0100
>> From: Johan Eltes <[email protected]>
>> Subject: Re: Message-Driven Bean OnMesssage() etc
>> To: [email protected]
>>
>> You are not allowed to create threads in an EJB.
>> One of the reasons is that transaction contexts are bound to threads.
>> If you create a thread (most app servers will not let you), that the
>> app server will not be able to manage it.
>>
>> Would it be possible to have multiple MDBs (MDB pool size > 1)
>> instead of forking threads within your business logic?
>>
>> /Johan
>>
>> 29 dec 2005 kl. 06.00 skrev Jingwen Jin:
>>
>>> I'm writing a pub/sub server that, on receiving an incoming message,
>>> stores it into a messageArray, and then creates a thread to forward
>>> messages in the array. The following code works ok if the
>>> "forwardMessage"
>>> method is called within onMessage(); messages get delivered.
>>>
>>> But whenever I try to deliver the messages in messageArray using a
>>> thread
>>> as shown below, I get the following exception and messages don't get
>>> delivered:
>>>
>>> ReplyMsgBean.forwardMessage: JMSException:
>>> com.sun.messaging.jms.JMSException: [SEND_REPLY(9)] [C4036]: A
>>> server
>>> error occurred. : transaction failed: Unexpected Broker Exception:
>>> [received message with Unknown Transaction ID -1: ignoring message]
>>>
>>> It looks like the server could not create the connection within the
>>> forwardMessage method.
>>>
>>> I'd appreciate any suggestions.
>>>
>>> Thanks,
>>>
>>> Jingwen
>>>
>>> ---------------------------------
>>>
>>>
>>>
>>> public class ReplyMsgBean implements MessageDrivenBean,
>>> MessageListener {
>>> ...
>>>     public ReplyMsgBean() throws Exception {
>>>  messageArray = new ArrayList();
>>>  mft = new MessageForwardingThread();
>>>  mft.start();
>>>     }
>>>     public void ejbCreate() {
>>>         try {
>>>             Context initial = new InitialContext();
>>>             cf = (ConnectionFactory) initial.lookup(
>>>                     "java:comp/env/jms/MyConnectionFactory");
>>>         } catch (Exception ex) {
>>>             logger.severe("ReplyMsgBean.ejbCreate: Exception: " +
>>>                 ex.toString());
>>>         }
>>>     }
>>>     public void onMessage(Message inMessage) {
>>>        put the message into messageArray
>>>     }
>>>     private static void forwardMessage(TextMessage msg) {
>>>          ...
>>>          Connection con = cf.createConnection();
>>>          Session ses = con.createSession(true, 0);
>>>          producer = ses.createProducer(topic);
>>>  producer.send(msg);
>>>          con.close();
>>>     }
>>>
>>>
>>>    final class MessageForwardingThread extends Thread {
>>>          ...
>>>  public final void run() {
>>>              for every-message (msg) in messageArray
>>>   ReplyMsgBean.forwardMessage(msg);
>>>
>>>  }
>>>
>>>    }
>>>
>>> ====================================================================
>>> ==
>>> =====
>>> To unsubscribe, send email to [email protected] and include in
>>> the body
>>> of the message "signoff EJB-INTEREST".  For general help, send
>>> email to
>>> [email protected] and include in the body of the message "help".
>>>
>>
>> =====================================================================
>> ======
>> To unsubscribe, send email to [email protected] and include in
>> the body
>> of the message "signoff EJB-INTEREST".  For general help, send
>> email to
>> [email protected] and include in the body of the message "help".
>
> ======================================================================
> =====
> To unsubscribe, send email to [email protected] and include in
> the body
> of the message "signoff EJB-INTEREST".  For general help, send
> email to
> [email protected] and include in the body of the message "help".
>

===========================================================================
To unsubscribe, send email to [email protected] and include in the body
of the message "signoff EJB-INTEREST".  For general help, send email to
[email protected] and include in the body of the message "help".