Hi , 
I am looking to migrate one of my apps to Tomee but have run into an issue.
We have a server side deployment and a swing based client which communicate
with each other through JMS.

Following is my configuration on the server side :

    <Resource id="MyJmsResourceAdapter" type="ActiveMQResourceAdapter">
        BrokerXmlConfig = broker:(tcp://127.0.0.1:61616)
        ServerUrl = tcp://127.0.0.1:61616
    </Resource>

    <Resource id="MyJmsConnectionFactory"
type="javax.jms.ConnectionFactory">
        ResourceAdapter = MyJmsResourceAdapter
    </Resource>

    <Container id="MyJmsMdbContainer" ctype="MESSAGE">
        ResourceAdapter = MyJmsResourceAdapter
    </Container>

    <Resource id="MyResQueue" type="javax.jms.Queue" />


============================================
My server side code is as follows (posting relevant snippets from a servlet
class):
    @Resource
    private ConnectionFactory connectionFactory;

    @Resource(name = "MyResQueue")
    private Queue queue;


private Optional<String> receiveMessages() {
        Optional<String> text = Optional.absent();
        try {

            Connection queueConnection =
connectionFactory.createConnection();
            Session queueSession = queueConnection.createSession(false,
Session.AUTO_ACKNOWLEDGE);

            MessageConsumer receiver = queueSession.createConsumer(queue);
            queueConnection.start();
            try {
                Message m = receiver.receive(1000);
                if (m != null && m instanceof TextMessage) {
                    TextMessage tm = (TextMessage) m;
                    text = Optional.of(tm.getText());
                    logger.debug(String.format("Received TextMessage with
text '%s'.", text));
                } else {
                    logger.debug(String.format("No TextMessage received:
'%s'", m));
                }
            } finally {
                queueSession.close();
                queueConnection.close();
            }
        } catch (Exception e) {
            logger.error("Receiving messages failed: " + e.getMessage(), e);
        }
        return text;
    }

    private void sendMessage(String text) {
        try {
        
            Connection connection = connectionFactory.createConnection();
            Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
            MessageProducer producer = session.createProducer(queue);

            TextMessage testMessage = session.createTextMessage();
            testMessage.setText(text);
            testMessage.setStringProperty("aKey", "someRandomTestValue");
            producer.send(testMessage);
            logger.debug("Successfully sent message.");
        } catch (Exception e) {
            logger.error("Sending JMS message failed: "+e.getMessage(), e);
        }
    }


=========================

I have built a test remote client (running on a different JVM) from the
examples mentioned here as follows :

public class SenderTest {

    @BeforeClass
    public static void configureClientResources() {
        // can be set this way or with the key Resource/<type>
        // in fact we create on client side a mini jndi tree
        // the key is the jndi name (the one used for the lookup)
        System.setProperty("aConnectionFactory",
"connectionfactory:org.apache.activemq.ActiveMQConnectionFactory:tcp://127.0.0.1:61616");
        System.setProperty("aQueue",
"queue:org.apache.activemq.command.ActiveMQQueue:MyResQueue");
    }


    @Test
    public void send() throws Exception {
        final Properties properties = new Properties();
        properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.openejb.client.RemoteInitialContextFactory");
        final Context context = new InitialContext(properties);

        final Queue destination = (Queue) context.lookup("java:aQueue");
        assertNotNull(destination);
        assertEquals("MyResQueue", destination.getQueueName());

        final ConnectionFactory connectionFactory = (ConnectionFactory)
context.lookup("java:aConnectionFactory");
        assertNotNull(connectionFactory);

        try {
      
            Connection connection = connectionFactory.createConnection();
            Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
            MessageProducer producer = session.createProducer(destination);

            TextMessage testMessage = session.createTextMessage();
            testMessage.setText(new Date().toString());
            testMessage.setStringProperty("aKey", "someRandomTestValue");
            producer.send(testMessage);
            System.out.println("Successfully sent message.");
        } catch (Exception e) {
            System.out.println("Sending JMS message failed: " +
e.getMessage());
        }
    }

    @Test
    public void receive() throws Exception {
        final Properties properties = new Properties();
        properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.openejb.client.RemoteInitialContextFactory");
        final Context context = new InitialContext(properties);

        final Queue destination = (Queue) context.lookup("java:aQueue");
        assertNotNull(destination);
        assertEquals("MyResQueue", destination.getQueueName());

        final ConnectionFactory connectionFactory = (ConnectionFactory)
context.lookup("java:aConnectionFactory");
        assertNotNull(connectionFactory);

        try {
            String text = null;
            Connection queueConnection =
connectionFactory.createConnection();
            Session queueSession = queueConnection.createSession(false,
Session.AUTO_ACKNOWLEDGE);

            MessageConsumer receiver =
queueSession.createConsumer(destination);
            queueConnection.start();
            try {
                Message m = receiver.receive(1000);
                if (m != null && m instanceof TextMessage) {
                    TextMessage tm = (TextMessage) m;
                    text = tm.getText();
                    System.out.println(String.format("Received TextMessage
with text '%s'.", text));
                } else {
                    System.out.println(String.format("No TextMessage
received: '%s'", m));
                }
            } finally {
                queueSession.close();
                queueConnection.close();
            }
        } catch (Exception e) {
            System.out.println("Receiving messages failed: " +
e.getMessage());
        }
    }
}
=================================================================


With the above setup I am expecting the messages to flow from server side to
client and vice-versa since I am subscribing to the same queue "MyResQueue".
This is not happening. The above setup works only if I perform both the
sending and receiving of messages through the servlet code or through remote
client .

So in the above code if I invoke sendMessage(String text) and
receiveMessages() from the servlet it works fine. If I invoke send() and
receive() from SenderTest it works fine. But if I invoke sendMessage(String
text) from servlet and receive from SenderTest it doesn't work. 

Is there anything wrong in my configuration or am I missing something in my
code ?
Any help would be appreciated.

Thanks,
S



--
View this message in context: 
http://tomee-openejb.979440.n4.nabble.com/Tomee-Remote-JMS-client-communication-issue-tp4681776.html
Sent from the TomEE Users mailing list archive at Nabble.com.

Reply via email to