blob: 26cc1ee599580bf319ed0851e287f70c312e0846 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cocoon.samples.jms;
import java.util.Hashtable;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.hsqldb.Trigger;
/**
* Example Trigger for HSQLDB doing cache invalidation through the eventcache
* block and JMS messages.
*
* @version CVS $Id$
* @author <a href="mailto:haul@apache.org">haul</a>
*/
public class JMSTrigger implements Trigger {
// this exmaple class uses defaults to run with OpenJMS
// TODO make this somehow configurable...
protected String contextFactoryName = "org.exolab.jms.jndi.InitialContextFactory";
protected String scheme = "rmi";
protected String host = "localhost";
protected String port = "";
protected String jndiname = "";
protected String topicFactoryName = "JmsTopicConnectionFactory";
protected String topicName = "topic1";
protected int deliveryMode = DeliveryMode.NON_PERSISTENT;
protected int priority = 4;
protected long timeToLive = 10000;
protected Topic topic = null;
protected TopicPublisher publisher = null;
protected TopicSession session = null;
protected TopicConnection connection = null;
protected Context context = null;
protected TopicConnectionFactory topicConnectionFactory = null;
/**
*
*/
public JMSTrigger() {
super();
}
/**
* Get initial context.
*
* @return initial context
* @throws NamingException
*/
public Context getContext() throws NamingException {
Hashtable properties = new Hashtable();
properties.put(Context.INITIAL_CONTEXT_FACTORY, this.contextFactoryName);
if (this.port.length() == 0) {
if (scheme.equals("tcp") || scheme.equals("tcps")) {
port = "3035";
} else if (scheme.equals("http")) {
port = "8080";
} else if (scheme.equals("https")) {
port = "8443";
} else if (scheme.equals("rmi")) {
port = "1099";
}
}
String name = "";
if (scheme.equals("rmi")) {
name = this.jndiname;
}
String url = scheme + "://" + host + ":" + port + "/" + name;
properties.put(Context.PROVIDER_URL, url);
return new InitialContext(properties);
}
private void setupConnection() throws NamingException, JMSException {
// setup JMS connection
this.context = this.getContext();
this.topicConnectionFactory = (TopicConnectionFactory) this.context.lookup(this.topicFactoryName);
this.connection = this.topicConnectionFactory.createTopicConnection();
this.connection.start();
}
private void setupSession() throws JMSException {
this.session = connection.createTopicSession(false, Session.CLIENT_ACKNOWLEDGE);
this.topic = session.createTopic(this.topicName);
this.publisher = session.createPublisher(topic);
}
private void connect() throws NamingException, JMSException {
if (this.connection == null)
this.setupConnection();
if (this.session == null)
this.setupSession();
}
private void disconnect() throws JMSException, NamingException {
// do we really need to do this every time??
// OTOH we should expect to run this trigger rather infrequently.
this.session.close();
this.session = null;
this.connection.close();
this.connection = null;
this.topicConnectionFactory = null;
this.context.close();
this.context = null;
}
/*
* @see org.hsqldb.Trigger#fire(java.lang.String, java.lang.String, java.lang.Object[])
*/
public void fire(String trigName, String tabName, Object[] row) {
try {
connect();
TextMessage message =
this.session.createTextMessage(
trigName.toLowerCase() + "|" + tabName.toLowerCase());
this.publisher.publish(
this.topic,
message,
this.deliveryMode,
this.priority,
this.timeToLive);
disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
/* (non-Javadoc)
* @see org.hsqldb.Trigger#fire(int, java.lang.String, java.lang.String, java.lang.Object[], java.lang.Object[])
*/
public void fire(int arg0, String arg1, String arg2, Object[] arg3, Object[] arg4) {
// TODO Auto-generated method stub
}
}