Results 1 to 3 of 3

Thread: sorry for the bare explanation:I can’t receive more than 2 messages...

  1. #1
    Join Date
    Dec 2006
    Posts
    16

    Default sorry for the bare explanation:I can’t receive more than 2 messages...

    sorry for the bare explanation.

    I have a listener (in the server side) who receive request for send files (Streams):

    public class RequestUpdateListener implements SessionAwareMessageListener {

    private JmsTemplate jmsTemplate;

    private String fileUpdateLocation;

    public void onMessage(Message request, Session session) throws JMSException {


    ActiveMQConnectionFactory connectionFactory = ((PooledConnectionFactory) jmsTemplate
    .getConnectionFactory()).getConnectionFactory();

    FileInputStream fis = null;
    try {
    fis = new FileInputStream(new File(fileUpdateLocation));
    StreamSender ss = new StreamSender();
    ss.send(connectionFactory, fis,uuid);

    } catch (Exception e) {
    e.printStackTrace();
    }

    }
    .............

    and a class:

    public class StreamSender {

    public void send(ConnectionFactory connectionFactory, FileInputStream fis, String uuid) {

    try {

    connection = (ActiveMQConnection) connectionFactory.createConnection();
    session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
    Destination destination = session.createQueue("TransferQueue");

    int deliveryMode = DeliveryMode.NON_PERSISTENT;
    int priority = 1;
    long timeToLive = 0;

    outputStreamMQ = connection.createOutputStream(destination, prop, deliveryMode, priority,
    timeToLive);


    int total = 0;
    int reads;
    byte[] array = new byte[8 * 1024];

    while ((reads = fis.read(array)) != -1) {
    outputStreamMQ.write(array, 0, reads);
    }

    JmsUtils.commitIfNecessary(session);
    ......

    and again the spring container:

    <bean id="updateContainer"
    class="org.springframework.jms.listener.DefaultMes sageListenerContainer">
    <property name="concurrentConsumers" value="50" />
    <property name="connectionFactory" ref="jmsFactory" />
    <property name="destination" ref="requestUpdateQueue" />
    <property name="messageListener" ref="requestUpdateListener" />
    </bean>



    and in the client side I have a listener who receive the Stream:

    public class NotificationListener implements SessionAwareMessageListener {


    public void onMessage(Message response, Session session) throws JMSException {

    String message = "xml descriptor";
    jmsTemplate.convertAndSend(requestUpdateQueue, message, new MessagePostProcessor() {
    public Message postProcessMessage(Message message) throws JMSException {
    ....
    return message;
    }
    });

    StreamReceiver receiver = new StreamReceiver();
    receiver.setConnectionFactory(connectionFactory);
    receiver.receive();

    }

    public class StreamReceiver {


    public void receive() {
    ...
    try {

    connection = (ActiveMQConnection) connectionFactory.createConnection();
    session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
    Destination destination = session.createQueue("TransferQueue");
    fisMQ = connection.createInputStream(destination, selector);
    fos = new FileOutputStream("...");

    int reads;
    int total = 0;
    byte[] array = new byte[8 * 1024];

    while ((reads = fisMQ.read(array)) != -1) {
    fos.write(array, 0, reads);
    total += reads;
    }
    JmsUtils.commitIfNecessary(session);
    .........

    Now the problem arise when more than 2 client running in different machines does a request simultaneously, the server (StreamSender) stop the transfer

    what could be this?

  2. #2
    Join Date
    Jun 2005
    Posts
    4,241

    Default

    You seem to be abusing the Spring JMS framework by using the low-level provider-specific API provided by ActiveMQ. E.g. I'm pretty sure JmsUtils is not doing what you hope it is because it doesn't know anything about the session you created. To get access to that you have by-passed the JmsTemplate, and it's quite possible (but not entirely clear from the code you posted) that you are not cleanly disposing of the resources (session, connection etc.) cleanly, which JmsTemplate would do for you if you were able to use the Jms API. The message broker might be waiting for you to tell it to close its resources, and hence the third (or any random number) client cannot connect?

  3. #3
    Join Date
    Dec 2006
    Posts
    16

    Default

    actually this is the code of the commitIfNecessary


    Code:
      public static void commitIfNecessary(Session session) throws JMSException {
            Assert.notNull(session, "Session must not be null");
            try {
                session.commit();
            }
            catch (TransactionInProgressException ex) {
                // Ignore -> can only happen in case of a JTA transaction.
            }
            catch (javax.jms.IllegalStateException ex) {
                // Ignore -> can only happen in case of a JTA transaction.
            }
        }
    It does not need to know nothing about the session

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •