On Thu, May 28, 2009 at 3:15 PM, Andreas Veithen
<andreas.veit...@gmail.com>wrote:

> Nope. The JMSConnectionFactory class has changed quite a lot over the
> past months and can't be considered as a stable API.

I think here the problem is code is not clearly put to the
JMSConnectionFactory and
same code can be seen in ServiceTaskManager, JMSUtils etc..

> It is therefore
> not appropriate as an extension point.

I think it is a good enough point if above issue is not there.

> Also, its responsibility is
> much broader than looking up the (Queue|Topic)?ConnectionFactory. If
> the purpose is to make the lookup strategy configurable, then we
> should introduce an appropriate abstraction just for that.


yes, that may be done by properly re factoring the code and introducing new
interfaces.
What I tried to do was to give this support without introducing new
interfaces and only extending things.

Anyway I could get done this feature with an inonly message. will attach the
patch.

Has anyone tested this feature with a application server?


thanks,
Amila.





Andreas
>
> On Wed, May 27, 2009 at 17:44, Amila Suriarachchi
> <amilasuriarach...@gmail.com> wrote:
> > On Tue, May 26, 2009 at 9:58 PM, Andreas Veithen
> > <andreas.veit...@gmail.com>wrote:
> >
> >> Sounds really cool :-)
> >>
> >> You are right that JNDI is not necessary to get distributed
> >> transaction working. However it will still be required because it is
> >> the only way the JMS transport can acquire the connection factory. So
> >> you have two options:
> >>
> >> 1. Propose a clean way how to modify the JMS transport so that it can
> >> get the connection factory without JNDI.
> >
> >
> > I think this is possible. In fact at jms transport connection factory
> access
> > methods are abstracted out to JMSConnectionFactory. However there is
> small
> > code duplication at this class and JMSUtils class.
> > So if we can use only JMSConnectionFactory class then it can be overrid
> with
> > a custom class.
> >
> > attached a patch with some modifications.
> >
> > thanks,
> > Amila.
> >
> >>
> >>
> >> 2. Use a simple JNDI implementation. This is actually not difficult at
> >> all and can be done with a few lines of code. This is exactly how I
> >> implemented the unit tests for the JMS transport. There I use mockejb
> >> and the code basically does the following:
> >>
> >> MockContextFactory.setAsInitial();
> >> context = new InitialContext();
> >> context.bind(jndiName, connectionFactory);
> >>
> >>
> >> Andreas
> >>
> >> On Tue, May 26, 2009 at 18:12, Amila Suriarachchi
> >> <amilasuriarach...@gmail.com> wrote:
> >> > On Sun, May 24, 2009 at 5:15 AM, Andreas Veithen
> >> > <andreas.veit...@gmail.com>wrote:
> >> >
> >> >> Amila,
> >> >>
> >> >> AFAIK there is only a single requirement to make the JMS transport
> >> >> work with JTA, namely that there is a connection factory which
> >> >> participates in distributed transactions and which can be looked up
> >> >> using JNDI. This is something that should also be provided by
> >> >> standalone JTA implementations.
> >> >
> >> >
> >> > thanks for your reply.
> >> >
> >> > Is it a requirement to have a JNDI look up for transaction libraries?
> >> >
> >> > Please have look at these two code samples.
> >> >
> >> >  private void sendMessage() {
> >> >
> >> >        UserTransactionManager userTransactionManager = new
> >> > UserTransactionManager();
> >> >        String uri = "tcp://amila:61616";
> >> >        Connection connection = null;
> >> >
> >> >        try {
> >> >            userTransactionManager.init();
> >> >
> >> >            // creating a jms XA Connection factor
> >> >            ActiveMQXAConnectionFactory xaConnectionFactory = new
> >> > ActiveMQXAConnectionFactory();
> >> >            xaConnectionFactory.setBrokerURL(uri);
> >> >
> >> >            AtomikosConnectionFactoryBean connectionFactoryBean = new
> >> > AtomikosConnectionFactoryBean();
> >> >            connectionFactoryBean.setUniqueResourceName("JMSFactory");
> >> >
> >> > connectionFactoryBean.setXaConnectionFactory(xaConnectionFactory);
> >> >            connectionFactoryBean.setMaxPoolSize(5);
> >> >
> >> >            // doing the transaction
> >> >            userTransactionManager.begin();
> >> >
> >> >            connection = connectionFactoryBean.createConnection();
> >> >            // send the message to jms queue
> >> >            connection.start();
> >> >
> >> >            Session session = connection.createSession(true,
> >> > Session.SESSION_TRANSACTED);
> >> >            Destination orderQueue =
> session.createQueue("SampleQueue");
> >> >            MessageProducer producer =
> session.createProducer(orderQueue);
> >> >
> >> >
> >> >            //get the message from the data base
> >> >            AtomikosDataSourceBean dataSourceBean = new
> >> > AtomikosDataSourceBean();
> >> >            dataSourceBean.setUniqueResourceName("MyDataSource");
> >> >
> >> >
> >>
> dataSourceBean.setXaDataSourceClassName("org.apache.derby.jdbc.EmbeddedXADataSource");
> >> >            Properties properties = new Properties();
> >> >            properties.put("databaseName",
> >> > "/home/amila/msc/project/atomikos/db/TEST_DB");
> >> >            dataSourceBean.setXaProperties(properties);
> >> >
> >> >            java.sql.Connection sqlConnection =
> >> > dataSourceBean.getConnection();
> >> >
> >> >            Statement statement = sqlConnection.createStatement();
> >> >
> >> >            ResultSet resultSet = statement.executeQuery("select * from
> >> > message_to_send");
> >> >            while (resultSet.next()) {
> >> >                // send the message to jms queue
> >> >                System.out.println("Value ==> " +
> resultSet.getString(2));
> >> >                TextMessage textMessage =
> >> session.createTextMessage("Testing
> >> > message to send");
> >> >                producer.send(textMessage);
> >> >                System.out.println("Send the message ... ");
> >> >
> >> >            }
> >> >
> >> >            statement.close();
> >> >            statement = sqlConnection.createStatement();
> >> >            statement.execute("delete from message_to_send");
> >> >            statement.close();
> >> >
> >> >            userTransactionManager.commit();
> >> >
> >> >
> >> >            sqlConnection.close();
> >> >
> >> >            producer.close();
> >> >            connection.close();
> >> >            userTransactionManager.close();
> >> >            System.out.println("Closed the connections");
> >> >            connectionFactoryBean.close();
> >> >
> >> >        } catch (SystemException e) {
> >> >            e.printStackTrace();  //To change body of catch statement
> use
> >> > File | Settings | File Templates.
> >> >        } catch (JMSException e) {
> >> >            e.printStackTrace();  //To change body of catch statement
> use
> >> > File | Settings | File Templates.
> >> >        } catch (NotSupportedException e) {
> >> >            e.printStackTrace();  //To change body of catch statement
> use
> >> > File | Settings | File Templates.
> >> >        } catch (HeuristicMixedException e) {
> >> >            e.printStackTrace();  //To change body of catch statement
> use
> >> > File | Settings | File Templates.
> >> >        } catch (HeuristicRollbackException e) {
> >> >            e.printStackTrace();  //To change body of catch statement
> use
> >> > File | Settings | File Templates.
> >> >        } catch (RollbackException e) {
> >> >            e.printStackTrace();  //To change body of catch statement
> use
> >> > File | Settings | File Templates.
> >> >        } catch (SQLException e) {
> >> >            e.printStackTrace();  //To change body of catch statement
> use
> >> > File | Settings | File Templates.
> >> >        }
> >> >
> >> >
> >> >    }
> >> >
> >> >
> >> >  private void receiveMessage() {
> >> >
> >> >        UserTransactionManager userTransactionManager = new
> >> > UserTransactionManager();
> >> >        String uri = "tcp://amila:61616";
> >> >        Connection connection = null;
> >> >
> >> >        try {
> >> >            userTransactionManager.init();
> >> >
> >> >            // creating a jms XA Connection factor
> >> >            ActiveMQXAConnectionFactory xaConnectionFactory = new
> >> > ActiveMQXAConnectionFactory();
> >> >            xaConnectionFactory.setBrokerURL(uri);
> >> >
> >> >            AtomikosConnectionFactoryBean connectionFactoryBean = new
> >> > AtomikosConnectionFactoryBean();
> >> >            connectionFactoryBean.setUniqueResourceName("JMSFactory");
> >> >
> >> > connectionFactoryBean.setXaConnectionFactory(xaConnectionFactory);
> >> >            connectionFactoryBean.setMaxPoolSize(5);
> >> >
> >> >            // doing the transaction
> >> >            userTransactionManager.begin();
> >> >
> >> >            connection = connectionFactoryBean.createConnection();
> >> >            // send the message to jms queue
> >> >            connection.start();
> >> >
> >> >            Session session = connection.createSession(true,
> >> > Session.SESSION_TRANSACTED);
> >> >            Destination orderQueue =
> session.createQueue("SampleQueue");
> >> >
> >> >            MessageConsumer messageConsumer =
> >> > session.createConsumer(orderQueue);
> >> >
> >> >            //get the message from the data base
> >> >            AtomikosDataSourceBean dataSourceBean = new
> >> > AtomikosDataSourceBean();
> >> >            dataSourceBean.setUniqueResourceName("MyDataSource");
> >> >
> >> >
> >>
> dataSourceBean.setXaDataSourceClassName("org.apache.derby.jdbc.EmbeddedXADataSource");
> >> >            Properties properties = new Properties();
> >> >            properties.put("databaseName",
> >> > "/home/amila/msc/project/atomikos/db/TEST_DB");
> >> >            dataSourceBean.setXaProperties(properties);
> >> >
> >> >            java.sql.Connection sqlConnection =
> >> > dataSourceBean.getConnection();
> >> >
> >> >            Message message = messageConsumer.receiveNoWait();
> >> >
> >> >            while (message != null){
> >> >                TextMessage textMessage = (TextMessage) message;
> >> >                System.out.println("Got the message " +
> >> > textMessage.getText());
> >> >                Statement statement = sqlConnection.createStatement();
> >> >                statement.execute("insert into received_messages
> >> > (message_id,message) values ('2','" + textMessage.getText() + "')");
> >> >                statement.close();
> >> >                message = messageConsumer.receiveNoWait();
> >> >
> >> >            }
> >> > //
> >> >            userTransactionManager.commit();
> >> >
> >> >            sqlConnection.close();
> >> >
> >> >            messageConsumer.close();
> >> >            connection.close();
> >> >            userTransactionManager.close();
> >> >            System.out.println("Closed the connections");
> >> >            connectionFactoryBean.close();
> >> >
> >> >        } catch (SystemException e) {
> >> >            e.printStackTrace();  //To change body of catch statement
> use
> >> > File | Settings | File Templates.
> >> >        } catch (JMSException e) {
> >> >            e.printStackTrace();  //To change body of catch statement
> use
> >> > File | Settings | File Templates.
> >> >        } catch (NotSupportedException e) {
> >> >            e.printStackTrace();  //To change body of catch statement
> use
> >> > File | Settings | File Templates.
> >> >        } catch (HeuristicMixedException e) {
> >> >            e.printStackTrace();  //To change body of catch statement
> use
> >> > File | Settings | File Templates.
> >> >        } catch (HeuristicRollbackException e) {
> >> >            e.printStackTrace();  //To change body of catch statement
> use
> >> > File | Settings | File Templates.
> >> >        } catch (RollbackException e) {
> >> >            e.printStackTrace();  //To change body of catch statement
> use
> >> > File | Settings | File Templates.
> >> >        } catch (SQLException e) {
> >> >            e.printStackTrace();  //To change body of catch statement
> use
> >> > File | Settings | File Templates.
> >> >        }
> >> >
> >> >    }
> >> >
> >> > At the send method it reads some data base records and put them to a
> jms
> >> > queue. Then delete the records. I want all these actions happen in one
> >> > transaction. So it has to use a distributed transaction.
> >> >
> >> > To have distributed transaction I have used the Atomikos library and
> >> there
> >> > is no JNDI look up. So users can run this in their jvm without running
> an
> >> > Application server.
> >> >
> >> > The real thing I want to have is to read the database records and send
> >> them
> >> > as soap messages using the jms transport. And read the message at the
> >> server
> >> > side. Since reading the message is also done in a distributed
> transaction
> >> we
> >> > can achive application to application reliability.
> >> >
> >> > Can this be done with the existing jms transport JTA support. I think
> it
> >> has
> >> > to change to support these types of libraries.
> >> >
> >> > thanks,
> >> > Amila.
> >> >
> >> >
> >> >
> >> >
> >> >
> >> >>
> >> >> Andr
> >> >>
> >> >> On Wed, May 20, 2009 at 07:09, Amila Suriarachchi
> >> >> <amilasuriarach...@gmail.com> wrote:
> >> >> > hi,
> >> >> >
> >> >> > I am trying to write a sample code using JMS transport to send a
> >> message
> >> >> > reliably from application to application.
> >> >> >
> >> >> > At the client side,
> >> >> > Axis2 client should be able to update a database and write to a jms
> >> queue
> >> >> in
> >> >> > a same distributed transaction and
> >> >> >
> >> >> > At the server side
> >> >> > it should be able to read the message from jms transport and update
> a
> >> >> data
> >> >> > base in a same distributed transaction.
> >> >> >
> >> >> >
> >> >> > Here I am planing to use a standalone jta implementation like
> >> atomikos[1]
> >> >> or
> >> >> > bitronix[2].
> >> >> >
> >> >> > As I saw current JMS transport do support JTA. But As I saw it is
> >> >> required
> >> >> > to use a Application container (eg. jboss)
> >> >> > which has inbuilt JTA support. Is this correct or is there are a
> way
> >> to
> >> >> > configure standalone libraries.
> >> >> >
> >> >> > When Axis2 point of view people run the client in a stanalone
> >> >> applications
> >> >> > and server most of the time in tomcat. So it is usefull to have
> >> >> > support these standalone libraries as well.
> >> >> >
> >> >> > thanks,
> >> >> > Amila.
> >> >> >
> >> >> >
> >> >> > [1]http://www.atomikos.com/Main/ProductsOerview#ate
> >> >> > [2]http://docs.codehaus.org/display/BTM/Home
> >> >> > --
> >> >> > Amila Suriarachchi
> >> >> > WSO2 Inc.
> >> >> > blog: http://amilachinthaka.blogspot.com/
> >> >> >
> >> >>
> >> >
> >> >
> >> >
> >> > --
> >> > Amila Suriarachchi
> >> > WSO2 Inc.
> >> > blog: http://amilachinthaka.blogspot.com/
> >> >
> >>
> >
> >
> >
> > --
> > Amila Suriarachchi
> > WSO2 Inc.
> > blog: http://amilachinthaka.blogspot.com/
> >
>



-- 
Amila Suriarachchi
WSO2 Inc.
blog: http://amilachinthaka.blogspot.com/

Reply via email to