mirror of https://github.com/apache/activemq.git
Porting apollo examples structure to ActiveMQ 5.9.
This commit is contained in:
parent
0320630066
commit
2ecf41d02f
|
@ -32,16 +32,6 @@
|
|||
</includes>
|
||||
</fileSet>
|
||||
|
||||
<!-- Copy over all sample configurations -->
|
||||
<fileSet>
|
||||
<directory>src/sample-conf</directory>
|
||||
<outputDirectory>conf/</outputDirectory>
|
||||
<includes>
|
||||
<include>activemq-*.xml</include>
|
||||
<include>jetty-*.xml</include>
|
||||
</includes>
|
||||
</fileSet>
|
||||
|
||||
<!-- lets copy the portions of the admin web app we need - as we can't exclude stuff from the WAR -->
|
||||
<fileSet>
|
||||
<directory>../activemq-web-console/src/main/webapp/images</directory>
|
||||
|
|
|
@ -33,14 +33,27 @@
|
|||
<exclude>conf/*.ts</exclude>
|
||||
<exclude>conf/*.ks</exclude>
|
||||
<exclude>conf/*.cert</exclude>
|
||||
<exclude>example/**/*.sh</exclude>
|
||||
<exclude>example/**/*.rb</exclude>
|
||||
<exclude>examples/**/*.sh</exclude>
|
||||
<exclude>examples/**/*.rb</exclude>
|
||||
<exclude>webapps/*.ico</exclude>
|
||||
<exclude>examples/**/pom.xml</exclude>
|
||||
</excludes>
|
||||
<fileMode>0644</fileMode>
|
||||
<directoryMode>0755</directoryMode>
|
||||
<lineEnding>unix</lineEnding>
|
||||
</fileSet>
|
||||
|
||||
<!-- Copy over the files that need to be filtered -->
|
||||
<fileSet>
|
||||
<directory>src/release</directory>
|
||||
<outputDirectory>/</outputDirectory>
|
||||
<includes>
|
||||
<include>examples/**/pom.xml</include>
|
||||
</includes>
|
||||
<lineEnding>unix</lineEnding>
|
||||
<filtered>true</filtered>
|
||||
</fileSet>
|
||||
|
||||
<fileSet>
|
||||
<directory>src/release</directory>
|
||||
<outputDirectory>/</outputDirectory>
|
||||
|
@ -98,8 +111,9 @@
|
|||
<directory>src/release</directory>
|
||||
<outputDirectory>/</outputDirectory>
|
||||
<includes>
|
||||
<include>example/**/*.sh</include>
|
||||
<include>example/**/*.rb</include>
|
||||
<include>examples/**/*.sh</include>
|
||||
<include>examples/**/*.rb</include>
|
||||
<include>examples/**/*.py</include>
|
||||
</includes>
|
||||
<directoryMode>0755</directoryMode>
|
||||
<fileMode>0755</fileMode>
|
||||
|
|
|
@ -33,10 +33,22 @@
|
|||
<exclude>conf/*.ks</exclude>
|
||||
<exclude>conf/*.cert</exclude>
|
||||
<exclude>webapps/*.ico</exclude>
|
||||
<exclude>examples/**/pom.xml</exclude>
|
||||
</excludes>
|
||||
<lineEnding>dos</lineEnding>
|
||||
</fileSet>
|
||||
|
||||
<!-- Copy over the files that need to be filtered -->
|
||||
<fileSet>
|
||||
<directory>src/release</directory>
|
||||
<outputDirectory>/</outputDirectory>
|
||||
<includes>
|
||||
<include>examples/**/pom.xml</include>
|
||||
</includes>
|
||||
<lineEnding>dos</lineEnding>
|
||||
<filtered>true</filtered>
|
||||
</fileSet>
|
||||
|
||||
<fileSet>
|
||||
<directory>src/release</directory>
|
||||
<outputDirectory>/</outputDirectory>
|
||||
|
|
|
@ -112,6 +112,8 @@
|
|||
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
|
||||
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
|
||||
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
|
||||
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
|
||||
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
|
||||
</transportConnectors>
|
||||
|
||||
<!-- destroy the spring context on shutdown to stop jetty -->
|
||||
|
|
|
@ -1,67 +0,0 @@
|
|||
#!/usr/bin/ruby
|
||||
# ------------------------------------------------------------------------
|
||||
# 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.
|
||||
# ------------------------------------------------------------------------
|
||||
|
||||
require 'rubygems'
|
||||
require 'stomp'
|
||||
|
||||
@conn = Stomp::Connection.open '', '', 'localhost', 61613, false
|
||||
@messages = 10000
|
||||
@batches = 40
|
||||
@subscribers = 10
|
||||
@size = 256
|
||||
|
||||
@DATA = "abcdefghijklmnopqrstuvwxyz";
|
||||
@body = "";
|
||||
for i in 0..(@size-1)
|
||||
@body += @DATA[ i % @DATA.length,1]
|
||||
end
|
||||
|
||||
@times = []
|
||||
@conn.subscribe '/queue/response', { :ack =>"auto" }
|
||||
|
||||
for i in 1..(@batches)
|
||||
@body += @DATA[ i % @DATA.length,1]
|
||||
sleep 1 if i == 1
|
||||
|
||||
@start = Time.now
|
||||
|
||||
for j in 1..@messages
|
||||
@conn.send '/topic/event', @body, {'persistent'=>'false'}
|
||||
$stdout.print "Sent #{j} messages\n" if j%1000==0
|
||||
end
|
||||
@conn.send '/topic/event', "REPORT", {'persistent'=>'false'}
|
||||
|
||||
@remaining = @subscribers
|
||||
while @remaining > 0
|
||||
@msg = @conn.receive
|
||||
if @msg.command == "MESSAGE"
|
||||
@remaining -= 1
|
||||
$stdout.print "Received report: #{@msg.body}, remaining: #{@remaining}\n"
|
||||
else
|
||||
$stdout.print "#{@msg.command}: #{@msg.body}\n"
|
||||
end
|
||||
end
|
||||
@diff = Time.now-@start
|
||||
|
||||
$stdout.print "Batch #{i} of #{@batches} completed in #{@diff} seconds.\n"
|
||||
@times[i] = @diff
|
||||
end
|
||||
|
||||
@conn.send '/topic/event', "SHUTDOWN", {'persistent'=>'false'}
|
||||
|
||||
@conn.disconnect
|
|
@ -0,0 +1,80 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>example</groupId>
|
||||
<artifactId>amqp-example</artifactId>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
|
||||
<name>example</name>
|
||||
<description>ActiveMQ AMQP Java Examples</description>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>Fusesource Snapshots</id>
|
||||
<url>http://repo.fusesource.com/nexus/content/repositories/snapshots</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.geronimo.specs</groupId>
|
||||
<artifactId>geronimo-jms_1.1_spec</artifactId>
|
||||
<version>1.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.qpid</groupId>
|
||||
<artifactId>qpid-amqp-1-0-client-jms</artifactId>
|
||||
<version>${qpid-jms-version}</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>2.1</version>
|
||||
<configuration>
|
||||
<source>1.6</source>
|
||||
<target>1.6</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<!-- include all the dependencies into the jar so it's easier to execute the example -->
|
||||
<plugin>
|
||||
<groupId>org.fusesource.mvnplugins</groupId>
|
||||
<artifactId>maven-uberize-plugin</artifactId>
|
||||
<version>1.14</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals><goal>uberize</goal></goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
## Overview
|
||||
|
||||
This is an example of how use the Java JMS api with ActiveMQ via the AMQP protocol.
|
||||
|
||||
## Prereqs
|
||||
|
||||
- Install Java SDK
|
||||
- Install [Maven](http://maven.apache.org/download.html)
|
||||
|
||||
## Building
|
||||
|
||||
Run:
|
||||
|
||||
mvn install
|
||||
|
||||
## Running the Examples
|
||||
|
||||
In one terminal window run:
|
||||
|
||||
java -cp target/amqp-example-0.1-SNAPSHOT.jar example.Listener
|
||||
|
||||
In another terminal window run:
|
||||
|
||||
java -cp target/amqp-example-0.1-SNAPSHOT.jar example.Publisher
|
||||
|
||||
You can control to which AMQP server the examples try to connect to by
|
||||
setting the following environment variables:
|
||||
|
||||
* `ACTIVEMQ_HOST`
|
||||
* `ACTIVEMQ_PORT`
|
||||
* `ACTIVEMQ_USER`
|
||||
* `ACTIVEMQ_PASSWORD`
|
|
@ -0,0 +1,90 @@
|
|||
/**
|
||||
* 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 example;
|
||||
|
||||
import org.apache.qpid.amqp_1_0.jms.impl.*;
|
||||
import javax.jms.*;
|
||||
|
||||
class Listener {
|
||||
|
||||
public static void main(String []args) throws JMSException {
|
||||
|
||||
String user = env("ACTIVEMQ_USER", "admin");
|
||||
String password = env("ACTIVEMQ_PASSWORD", "password");
|
||||
String host = env("ACTIVEMQ_HOST", "localhost");
|
||||
int port = Integer.parseInt(env("ACTIVEMQ_PORT", "5672"));
|
||||
String destination = arg(args, 0, "topic://event");
|
||||
|
||||
ConnectionFactoryImpl factory = new ConnectionFactoryImpl(host, port, user, password);
|
||||
Destination dest = null;
|
||||
if( destination.startsWith("topic://") ) {
|
||||
dest = new TopicImpl(destination);
|
||||
} else {
|
||||
dest = new QueueImpl(destination);
|
||||
}
|
||||
|
||||
Connection connection = factory.createConnection(user, password);
|
||||
connection.start();
|
||||
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
|
||||
MessageConsumer consumer = session.createConsumer(dest);
|
||||
long start = System.currentTimeMillis();
|
||||
long count = 1;
|
||||
System.out.println("Waiting for messages...");
|
||||
while(true) {
|
||||
Message msg = consumer.receive();
|
||||
if( msg instanceof TextMessage ) {
|
||||
String body = ((TextMessage) msg).getText();
|
||||
if( "SHUTDOWN".equals(body)) {
|
||||
long diff = System.currentTimeMillis() - start;
|
||||
System.out.println(String.format("Received %d in %.2f seconds", count, (1.0*diff/1000.0)));
|
||||
connection.close();
|
||||
System.exit(1);
|
||||
} else {
|
||||
try {
|
||||
if( count != msg.getIntProperty("id") ) {
|
||||
System.out.println("mismatch: "+count+"!="+msg.getIntProperty("id"));
|
||||
}
|
||||
} catch (NumberFormatException ignore) {
|
||||
}
|
||||
if( count == 1 ) {
|
||||
start = System.currentTimeMillis();
|
||||
} else if( count % 1000 == 0 ) {
|
||||
System.out.println(String.format("Received %d messages.", count));
|
||||
}
|
||||
count ++;
|
||||
}
|
||||
|
||||
} else {
|
||||
System.out.println("Unexpected message type: "+msg.getClass());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static String env(String key, String defaultValue) {
|
||||
String rc = System.getenv(key);
|
||||
if( rc== null )
|
||||
return defaultValue;
|
||||
return rc;
|
||||
}
|
||||
|
||||
private static String arg(String []args, int index, String defaultValue) {
|
||||
if( index < args.length )
|
||||
return args[index];
|
||||
else
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,84 @@
|
|||
/**
|
||||
* 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 example;
|
||||
|
||||
import org.apache.qpid.amqp_1_0.jms.impl.*;
|
||||
import javax.jms.*;
|
||||
|
||||
class Publisher {
|
||||
|
||||
public static void main(String []args) throws Exception {
|
||||
|
||||
String user = env("ACTIVEMQ_USER", "admin");
|
||||
String password = env("ACTIVEMQ_PASSWORD", "password");
|
||||
String host = env("ACTIVEMQ_HOST", "localhost");
|
||||
int port = Integer.parseInt(env("ACTIVEMQ_PORT", "5672"));
|
||||
String destination = arg(args, 0, "topic://event");
|
||||
|
||||
int messages = 10000;
|
||||
int size = 256;
|
||||
|
||||
String DATA = "abcdefghijklmnopqrstuvwxyz";
|
||||
String body = "";
|
||||
for( int i=0; i < size; i ++) {
|
||||
body += DATA.charAt(i%DATA.length());
|
||||
}
|
||||
|
||||
ConnectionFactoryImpl factory = new ConnectionFactoryImpl(host, port, user, password);
|
||||
Destination dest = null;
|
||||
if( destination.startsWith("topic://") ) {
|
||||
dest = new TopicImpl(destination);
|
||||
} else {
|
||||
dest = new QueueImpl(destination);
|
||||
}
|
||||
|
||||
Connection connection = factory.createConnection(user, password);
|
||||
connection.start();
|
||||
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
|
||||
MessageProducer producer = session.createProducer(dest);
|
||||
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
|
||||
|
||||
for( int i=1; i <= messages; i ++) {
|
||||
TextMessage msg = session.createTextMessage("#:"+i);
|
||||
msg.setIntProperty("id", i);
|
||||
producer.send(msg);
|
||||
if( (i % 1000) == 0) {
|
||||
System.out.println(String.format("Sent %d messages", i));
|
||||
}
|
||||
}
|
||||
|
||||
producer.send(session.createTextMessage("SHUTDOWN"));
|
||||
Thread.sleep(1000*3);
|
||||
connection.close();
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
private static String env(String key, String defaultValue) {
|
||||
String rc = System.getenv(key);
|
||||
if( rc== null )
|
||||
return defaultValue;
|
||||
return rc;
|
||||
}
|
||||
|
||||
private static String arg(String []args, int index, String defaultValue) {
|
||||
if( index < args.length )
|
||||
return args[index];
|
||||
else
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
#!/usr/bin/env python
|
||||
"""
|
||||
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.
|
||||
"""
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
from proton import *
|
||||
|
||||
user = os.getenv('ACTIVEMQ_USER') or 'admin'
|
||||
password = os.getenv('ACTIVEMQ_PASSWORD') or 'password'
|
||||
host = os.getenv('ACTIVEMQ_HOST') or '127.0.0.1'
|
||||
port = int(os.getenv('ACTIVEMQ_PORT') or 5672)
|
||||
destination = sys.argv[1:2] or ['topic://event']
|
||||
destination = destination[0]
|
||||
|
||||
msg = Message()
|
||||
mng = Messenger()
|
||||
mng.password=password
|
||||
mng.start()
|
||||
mng.subscribe("amqp://%s@%s:%d/%s"%(user, host, port, destination))
|
||||
|
||||
count = 0
|
||||
start = time.time()
|
||||
while True:
|
||||
mng.recv(10)
|
||||
while mng.incoming:
|
||||
mng.get(msg)
|
||||
if msg.body=="SHUTDOWN":
|
||||
diff = time.time() - start
|
||||
print 'Received %d frames in %f seconds' % (count, diff)
|
||||
exit(0)
|
||||
else:
|
||||
if count==0:
|
||||
start = time.time()
|
||||
count+=1
|
||||
if count % 1000 == 0:
|
||||
print 'Received %d messages.' % (count)
|
||||
|
||||
mng.stop()
|
|
@ -0,0 +1,57 @@
|
|||
#!/usr/bin/env python
|
||||
"""
|
||||
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.
|
||||
"""
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
from proton import *
|
||||
|
||||
user = os.getenv('ACTIVEMQ_USER') or 'admin'
|
||||
password = os.getenv('ACTIVEMQ_PASSWORD') or 'password'
|
||||
host = os.getenv('ACTIVEMQ_HOST') or '127.0.0.1'
|
||||
port = int(os.getenv('ACTIVEMQ_PORT') or 5672)
|
||||
destination = sys.argv[1:2] or ['topic://event']
|
||||
destination = destination[0]
|
||||
address = "amqp://%s@%s:%d/%s"%(user, host, port, destination)
|
||||
|
||||
msg = Message()
|
||||
mng = Messenger()
|
||||
mng.password=password
|
||||
mng.start()
|
||||
|
||||
messages = 10000
|
||||
|
||||
msg.address = address
|
||||
msg.body = unicode('Hello World from Python')
|
||||
|
||||
count = 0
|
||||
start = time.time()
|
||||
for _ in xrange(messages):
|
||||
mng.put(msg)
|
||||
count += 1
|
||||
if count % 1000 == 0 :
|
||||
print("Sent %d messages"%(count))
|
||||
|
||||
msg.body = unicode("SHUTDOWN")
|
||||
mng.put(msg)
|
||||
mng.send
|
||||
|
||||
diff = time.time() - start
|
||||
print 'Sent %s frames in %f seconds' % (count, diff)
|
||||
|
||||
mng.stop()
|
|
@ -0,0 +1,76 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>example</groupId>
|
||||
<artifactId>mqtt-example</artifactId>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
|
||||
<name>example</name>
|
||||
<description>ActiveMQ MQTT Java Examples</description>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>Fusesource Snapshots</id>
|
||||
<url>http://repo.fusesource.com/nexus/content/repositories/snapshots</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.fusesource.mqtt-client</groupId>
|
||||
<artifactId>mqtt-client</artifactId>
|
||||
<version>${mqtt-client-version}</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>2.1</version>
|
||||
<configuration>
|
||||
<source>1.6</source>
|
||||
<target>1.6</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<!-- include all the dependencies into the jar so it's easier to execute the example -->
|
||||
<plugin>
|
||||
<groupId>org.fusesource.mvnplugins</groupId>
|
||||
<artifactId>maven-uberize-plugin</artifactId>
|
||||
<version>1.14</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals><goal>uberize</goal></goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
## Overview
|
||||
|
||||
This is an example of how use the MQTT protocol with ActiveMQ.
|
||||
|
||||
## Prereqs
|
||||
|
||||
- Install Java SDK
|
||||
- Install [Maven](http://maven.apache.org/download.html)
|
||||
|
||||
## Building
|
||||
|
||||
Run:
|
||||
|
||||
mvn install
|
||||
|
||||
## Running the Examples
|
||||
|
||||
In one terminal window run:
|
||||
|
||||
java -cp target/mqtt-example-0.1-SNAPSHOT.jar example.Listener
|
||||
|
||||
In another terminal window run:
|
||||
|
||||
java -cp target/mqtt-example-0.1-SNAPSHOT.jar example.Publisher
|
||||
|
||||
You can control to which stomp server the examples try to connect to by
|
||||
setting the following environment variables:
|
||||
|
||||
* `MQTT_HOST`
|
||||
* `MQTT_PORT`
|
||||
* `MQTT_USER`
|
||||
* `MQTT_PASSWORD`
|
|
@ -0,0 +1,123 @@
|
|||
/**
|
||||
* 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 example;
|
||||
|
||||
import org.fusesource.hawtbuf.*;
|
||||
import org.fusesource.mqtt.client.*;
|
||||
|
||||
/**
|
||||
* Uses an callback based interface to MQTT. Callback based interfaces
|
||||
* are harder to use but are slightly more efficient.
|
||||
*/
|
||||
class Listener {
|
||||
|
||||
public static void main(String []args) throws Exception {
|
||||
|
||||
String user = env("ACTIVEMQ_USER", "admin");
|
||||
String password = env("ACTIVEMQ_PASSWORD", "password");
|
||||
String host = env("ACTIVEMQ_HOST", "localhost");
|
||||
int port = Integer.parseInt(env("ACTIVEMQ_PORT", "1883"));
|
||||
final String destination = arg(args, 0, "/topic/event");
|
||||
|
||||
|
||||
MQTT mqtt = new MQTT();
|
||||
mqtt.setHost(host, port);
|
||||
mqtt.setUserName(user);
|
||||
mqtt.setPassword(password);
|
||||
|
||||
|
||||
final CallbackConnection connection = mqtt.callbackConnection();
|
||||
connection.listener(new org.fusesource.mqtt.client.Listener() {
|
||||
long count = 0;
|
||||
long start = System.currentTimeMillis();
|
||||
|
||||
public void onConnected() {
|
||||
}
|
||||
public void onDisconnected() {
|
||||
}
|
||||
public void onFailure(Throwable value) {
|
||||
value.printStackTrace();
|
||||
System.exit(-2);
|
||||
}
|
||||
public void onPublish(UTF8Buffer topic, Buffer msg, Runnable ack) {
|
||||
String body = msg.utf8().toString();
|
||||
if( "SHUTDOWN".equals(body)) {
|
||||
long diff = System.currentTimeMillis() - start;
|
||||
System.out.println(String.format("Received %d in %.2f seconds", count, (1.0*diff/1000.0)));
|
||||
connection.disconnect(new Callback<Void>() {
|
||||
@Override
|
||||
public void onSuccess(Void value) {
|
||||
System.exit(0);
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Throwable value) {
|
||||
value.printStackTrace();
|
||||
System.exit(-2);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
if( count == 0 ) {
|
||||
start = System.currentTimeMillis();
|
||||
}
|
||||
if( count % 1000 == 0 ) {
|
||||
System.out.println(String.format("Received %d messages.", count));
|
||||
}
|
||||
count ++;
|
||||
}
|
||||
}
|
||||
});
|
||||
connection.connect(new Callback<Void>() {
|
||||
@Override
|
||||
public void onSuccess(Void value) {
|
||||
Topic[] topics = {new Topic(destination, QoS.AT_LEAST_ONCE)};
|
||||
connection.subscribe(topics, new Callback<byte[]>() {
|
||||
public void onSuccess(byte[] qoses) {
|
||||
}
|
||||
public void onFailure(Throwable value) {
|
||||
value.printStackTrace();
|
||||
System.exit(-2);
|
||||
}
|
||||
});
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Throwable value) {
|
||||
value.printStackTrace();
|
||||
System.exit(-2);
|
||||
}
|
||||
});
|
||||
|
||||
// Wait forever..
|
||||
synchronized (Listener.class) {
|
||||
while(true)
|
||||
Listener.class.wait();
|
||||
}
|
||||
}
|
||||
|
||||
private static String env(String key, String defaultValue) {
|
||||
String rc = System.getenv(key);
|
||||
if( rc== null )
|
||||
return defaultValue;
|
||||
return rc;
|
||||
}
|
||||
|
||||
private static String arg(String []args, int index, String defaultValue) {
|
||||
if( index < args.length )
|
||||
return args[index];
|
||||
else
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,100 @@
|
|||
/**
|
||||
* 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 example;
|
||||
|
||||
import org.fusesource.hawtbuf.AsciiBuffer;
|
||||
import org.fusesource.hawtbuf.Buffer;
|
||||
import org.fusesource.hawtbuf.UTF8Buffer;
|
||||
import org.fusesource.mqtt.client.Future;
|
||||
import org.fusesource.mqtt.client.FutureConnection;
|
||||
import org.fusesource.mqtt.client.MQTT;
|
||||
import org.fusesource.mqtt.client.QoS;
|
||||
|
||||
import java.util.LinkedList;
|
||||
|
||||
/**
|
||||
* Uses a Future based API to MQTT.
|
||||
*/
|
||||
class Publisher {
|
||||
|
||||
public static void main(String []args) throws Exception {
|
||||
|
||||
String user = env("ACTIVEMQ_USER", "admin");
|
||||
String password = env("ACTIVEMQ_PASSWORD", "password");
|
||||
String host = env("ACTIVEMQ_HOST", "localhost");
|
||||
int port = Integer.parseInt(env("ACTIVEMQ_PORT", "1883"));
|
||||
final String destination = arg(args, 0, "/topic/event");
|
||||
|
||||
int messages = 10000;
|
||||
int size = 256;
|
||||
|
||||
String DATA = "abcdefghijklmnopqrstuvwxyz";
|
||||
String body = "";
|
||||
for( int i=0; i < size; i ++) {
|
||||
body += DATA.charAt(i%DATA.length());
|
||||
}
|
||||
Buffer msg = new AsciiBuffer(body);
|
||||
|
||||
MQTT mqtt = new MQTT();
|
||||
mqtt.setHost(host, port);
|
||||
mqtt.setUserName(user);
|
||||
mqtt.setPassword(password);
|
||||
|
||||
FutureConnection connection = mqtt.futureConnection();
|
||||
connection.connect().await();
|
||||
|
||||
final LinkedList<Future<Void>> queue = new LinkedList<Future<Void>>();
|
||||
UTF8Buffer topic = new UTF8Buffer(destination);
|
||||
for( int i=1; i <= messages; i ++) {
|
||||
|
||||
// Send the publish without waiting for it to complete. This allows us
|
||||
// to send multiple message without blocking..
|
||||
queue.add(connection.publish(topic, msg, QoS.AT_LEAST_ONCE, false));
|
||||
|
||||
// Eventually we start waiting for old publish futures to complete
|
||||
// so that we don't create a large in memory buffer of outgoing message.s
|
||||
if( queue.size() >= 1000 ) {
|
||||
queue.removeFirst().await();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
queue.add(connection.publish(topic, new AsciiBuffer("SHUTDOWN"), QoS.AT_LEAST_ONCE, false));
|
||||
while( !queue.isEmpty() ) {
|
||||
queue.removeFirst().await();
|
||||
}
|
||||
|
||||
connection.disconnect().await();
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
private static String env(String key, String defaultValue) {
|
||||
String rc = System.getenv(key);
|
||||
if( rc== null )
|
||||
return defaultValue;
|
||||
return rc;
|
||||
}
|
||||
|
||||
private static String arg(String []args, int index, String defaultValue) {
|
||||
if( index < args.length )
|
||||
return args[index];
|
||||
else
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,610 @@
|
|||
article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
|
||||
audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
|
||||
audio:not([controls]){display:none;}
|
||||
html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
|
||||
a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
|
||||
a:hover,a:active{outline:0;}
|
||||
sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
|
||||
sup{top:-0.5em;}
|
||||
sub{bottom:-0.25em;}
|
||||
img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;}
|
||||
button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
|
||||
button,input{*overflow:visible;line-height:normal;}
|
||||
button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
|
||||
button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}
|
||||
input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;}
|
||||
input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
|
||||
textarea{overflow:auto;vertical-align:top;}
|
||||
body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;}
|
||||
a{color:#0088cc;text-decoration:none;}
|
||||
a:hover{color:#005580;text-decoration:underline;}
|
||||
.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";}
|
||||
.row:after{clear:both;}
|
||||
[class*="span"]{float:left;margin-left:20px;}
|
||||
.span1{width:60px;}
|
||||
.span2{width:140px;}
|
||||
.span3{width:220px;}
|
||||
.span4{width:300px;}
|
||||
.span5{width:380px;}
|
||||
.span6{width:460px;}
|
||||
.span7{width:540px;}
|
||||
.span8{width:620px;}
|
||||
.span9{width:700px;}
|
||||
.span10{width:780px;}
|
||||
.span11{width:860px;}
|
||||
.span12,.container{width:940px;}
|
||||
.offset1{margin-left:100px;}
|
||||
.offset2{margin-left:180px;}
|
||||
.offset3{margin-left:260px;}
|
||||
.offset4{margin-left:340px;}
|
||||
.offset5{margin-left:420px;}
|
||||
.offset6{margin-left:500px;}
|
||||
.offset7{margin-left:580px;}
|
||||
.offset8{margin-left:660px;}
|
||||
.offset9{margin-left:740px;}
|
||||
.offset10{margin-left:820px;}
|
||||
.offset11{margin-left:900px;}
|
||||
.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";}
|
||||
.row-fluid:after{clear:both;}
|
||||
.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;}
|
||||
.row-fluid>[class*="span"]:first-child{margin-left:0;}
|
||||
.row-fluid .span1{width:6.382978723%;}
|
||||
.row-fluid .span2{width:14.89361702%;}
|
||||
.row-fluid .span3{width:23.404255317%;}
|
||||
.row-fluid .span4{width:31.914893614%;}
|
||||
.row-fluid .span5{width:40.425531911%;}
|
||||
.row-fluid .span6{width:48.93617020799999%;}
|
||||
.row-fluid .span7{width:57.446808505%;}
|
||||
.row-fluid .span8{width:65.95744680199999%;}
|
||||
.row-fluid .span9{width:74.468085099%;}
|
||||
.row-fluid .span10{width:82.97872339599999%;}
|
||||
.row-fluid .span11{width:91.489361693%;}
|
||||
.row-fluid .span12{width:99.99999998999999%;}
|
||||
.container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";}
|
||||
.container:after{clear:both;}
|
||||
.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";}
|
||||
.container-fluid:after{clear:both;}
|
||||
p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;}
|
||||
.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;}
|
||||
h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;}
|
||||
h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;}
|
||||
h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;}
|
||||
h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;}
|
||||
h4,h5,h6{line-height:18px;}
|
||||
h4{font-size:14px;}h4 small{font-size:12px;}
|
||||
h5{font-size:12px;}
|
||||
h6{font-size:11px;color:#999999;text-transform:uppercase;}
|
||||
.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;}
|
||||
.page-header h1{line-height:1;}
|
||||
ul,ol{padding:0;margin:0 0 9px 25px;}
|
||||
ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
|
||||
ul{list-style:disc;}
|
||||
ol{list-style:decimal;}
|
||||
li{line-height:18px;}
|
||||
ul.unstyled{margin-left:0;list-style:none;}
|
||||
dl{margin-bottom:18px;}
|
||||
dt,dd{line-height:18px;}
|
||||
dt{font-weight:bold;}
|
||||
dd{margin-left:9px;}
|
||||
hr{margin:18px 0;border:0;border-top:1px solid #e5e5e5;border-bottom:1px solid #ffffff;}
|
||||
strong{font-weight:bold;}
|
||||
em{font-style:italic;}
|
||||
.muted{color:#999999;}
|
||||
abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;}
|
||||
blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;}
|
||||
blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';}
|
||||
blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}
|
||||
q:before,q:after,blockquote:before,blockquote:after{content:"";}
|
||||
address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;}
|
||||
small{font-size:100%;}
|
||||
cite{font-style:normal;}
|
||||
code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
|
||||
code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;}
|
||||
pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;}pre.prettyprint{margin-bottom:18px;}
|
||||
pre code{padding:0;background-color:transparent;}
|
||||
form{margin:0 0 18px;}
|
||||
fieldset{padding:0;margin:0;border:0;}
|
||||
legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;}
|
||||
label,input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;}
|
||||
label{display:block;margin-bottom:5px;color:#333333;}
|
||||
input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
|
||||
.uneditable-textarea{width:auto;height:auto;}
|
||||
label input,label textarea,label select{display:block;}
|
||||
input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:0;cursor:pointer;border-radius:0 \0/;}
|
||||
input[type="file"]{padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
|
||||
input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;}
|
||||
select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;}
|
||||
select{width:220px;background-color:#ffffff;}
|
||||
select[multiple],select[size]{height:auto;}
|
||||
input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
|
||||
textarea{height:auto;}
|
||||
input[type="hidden"]{display:none;}
|
||||
.radio,.checkbox{padding-left:18px;}
|
||||
.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;}
|
||||
.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
|
||||
.radio.inline,.checkbox.inline{display:inline-block;margin-bottom:0;vertical-align:middle;}
|
||||
.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
|
||||
.controls>.radio.inline:first-child,.controls>.checkbox.inline:first-child{padding-top:0;}
|
||||
input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;}
|
||||
input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;}
|
||||
input[type="file"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
|
||||
.input-mini{width:60px;}
|
||||
.input-small{width:90px;}
|
||||
.input-medium{width:150px;}
|
||||
.input-large{width:210px;}
|
||||
.input-xlarge{width:270px;}
|
||||
.input-xxlarge{width:530px;}
|
||||
input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;}
|
||||
input.span1,textarea.span1,.uneditable-input.span1{width:50px;}
|
||||
input.span2,textarea.span2,.uneditable-input.span2{width:130px;}
|
||||
input.span3,textarea.span3,.uneditable-input.span3{width:210px;}
|
||||
input.span4,textarea.span4,.uneditable-input.span4{width:290px;}
|
||||
input.span5,textarea.span5,.uneditable-input.span5{width:370px;}
|
||||
input.span6,textarea.span6,.uneditable-input.span6{width:450px;}
|
||||
input.span7,textarea.span7,.uneditable-input.span7{width:530px;}
|
||||
input.span8,textarea.span8,.uneditable-input.span8{width:610px;}
|
||||
input.span9,textarea.span9,.uneditable-input.span9{width:690px;}
|
||||
input.span10,textarea.span10,.uneditable-input.span10{width:770px;}
|
||||
input.span11,textarea.span11,.uneditable-input.span11{width:850px;}
|
||||
input.span12,textarea.span12,.uneditable-input.span12{width:930px;}
|
||||
input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;}
|
||||
.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
|
||||
.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;}
|
||||
.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
|
||||
.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
|
||||
.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;}
|
||||
.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
|
||||
.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
|
||||
.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;}
|
||||
.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
|
||||
input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
|
||||
.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;}
|
||||
.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
|
||||
:-moz-placeholder{color:#999999;}
|
||||
::-webkit-input-placeholder{color:#999999;}
|
||||
.help-block{margin-top:5px;margin-bottom:0;color:#999999;}
|
||||
.help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;}
|
||||
.input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";}
|
||||
.input-prepend:after,.input-append:after{clear:both;}
|
||||
.input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;}
|
||||
.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;}
|
||||
.input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
|
||||
.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;}
|
||||
.input-prepend .add-on{*margin-top:1px;}
|
||||
.input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
|
||||
.input-append .uneditable-input{border-right-color:#ccc;}
|
||||
.input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
|
||||
.input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;}
|
||||
.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;}
|
||||
.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;}
|
||||
.form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;}
|
||||
.form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;}
|
||||
.control-group{margin-bottom:9px;}
|
||||
.form-horizontal legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;}
|
||||
.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";}
|
||||
.form-horizontal .control-group:after{clear:both;}
|
||||
.form-horizontal .control-group>label{float:left;width:140px;padding-top:5px;text-align:right;}
|
||||
.form-horizontal .controls{margin-left:160px;}
|
||||
.form-horizontal .form-actions{padding-left:160px;}
|
||||
table{max-width:100%;border-collapse:collapse;border-spacing:0;}
|
||||
.table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;border-top:1px solid #ddd;}
|
||||
.table th{font-weight:bold;vertical-align:bottom;}
|
||||
.table td{vertical-align:top;}
|
||||
.table thead:first-child tr th,.table thead:first-child tr td{border-top:0;}
|
||||
.table tbody+tbody{border-top:2px solid #ddd;}
|
||||
.table-condensed th,.table-condensed td{padding:4px 5px;}
|
||||
.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;}
|
||||
.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;}
|
||||
.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;}
|
||||
.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;}
|
||||
.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;}
|
||||
.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;}
|
||||
.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;}
|
||||
table .span1{float:none;width:44px;margin-left:0;}
|
||||
table .span2{float:none;width:124px;margin-left:0;}
|
||||
table .span3{float:none;width:204px;margin-left:0;}
|
||||
table .span4{float:none;width:284px;margin-left:0;}
|
||||
table .span5{float:none;width:364px;margin-left:0;}
|
||||
table .span6{float:none;width:444px;margin-left:0;}
|
||||
table .span7{float:none;width:524px;margin-left:0;}
|
||||
table .span8{float:none;width:604px;margin-left:0;}
|
||||
table .span9{float:none;width:684px;margin-left:0;}
|
||||
table .span10{float:none;width:764px;margin-left:0;}
|
||||
table .span11{float:none;width:844px;margin-left:0;}
|
||||
table .span12{float:none;width:924px;margin-left:0;}
|
||||
[class^="icon-"]{display:inline-block;width:14px;height:14px;vertical-align:text-top;background-image:url(../img/glyphicons-halflings.png);background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child{*margin-left:0;}
|
||||
.icon-white{background-image:url(../img/glyphicons-halflings-white.png);}
|
||||
.icon-glass{background-position:0 0;}
|
||||
.icon-music{background-position:-24px 0;}
|
||||
.icon-search{background-position:-48px 0;}
|
||||
.icon-envelope{background-position:-72px 0;}
|
||||
.icon-heart{background-position:-96px 0;}
|
||||
.icon-star{background-position:-120px 0;}
|
||||
.icon-star-empty{background-position:-144px 0;}
|
||||
.icon-user{background-position:-168px 0;}
|
||||
.icon-film{background-position:-192px 0;}
|
||||
.icon-th-large{background-position:-216px 0;}
|
||||
.icon-th{background-position:-240px 0;}
|
||||
.icon-th-list{background-position:-264px 0;}
|
||||
.icon-ok{background-position:-288px 0;}
|
||||
.icon-remove{background-position:-312px 0;}
|
||||
.icon-zoom-in{background-position:-336px 0;}
|
||||
.icon-zoom-out{background-position:-360px 0;}
|
||||
.icon-off{background-position:-384px 0;}
|
||||
.icon-signal{background-position:-408px 0;}
|
||||
.icon-cog{background-position:-432px 0;}
|
||||
.icon-trash{background-position:-456px 0;}
|
||||
.icon-home{background-position:0 -24px;}
|
||||
.icon-file{background-position:-24px -24px;}
|
||||
.icon-time{background-position:-48px -24px;}
|
||||
.icon-road{background-position:-72px -24px;}
|
||||
.icon-download-alt{background-position:-96px -24px;}
|
||||
.icon-download{background-position:-120px -24px;}
|
||||
.icon-upload{background-position:-144px -24px;}
|
||||
.icon-inbox{background-position:-168px -24px;}
|
||||
.icon-play-circle{background-position:-192px -24px;}
|
||||
.icon-repeat{background-position:-216px -24px;}
|
||||
.icon-refresh{background-position:-240px -24px;}
|
||||
.icon-list-alt{background-position:-264px -24px;}
|
||||
.icon-lock{background-position:-287px -24px;}
|
||||
.icon-flag{background-position:-312px -24px;}
|
||||
.icon-headphones{background-position:-336px -24px;}
|
||||
.icon-volume-off{background-position:-360px -24px;}
|
||||
.icon-volume-down{background-position:-384px -24px;}
|
||||
.icon-volume-up{background-position:-408px -24px;}
|
||||
.icon-qrcode{background-position:-432px -24px;}
|
||||
.icon-barcode{background-position:-456px -24px;}
|
||||
.icon-tag{background-position:0 -48px;}
|
||||
.icon-tags{background-position:-25px -48px;}
|
||||
.icon-book{background-position:-48px -48px;}
|
||||
.icon-bookmark{background-position:-72px -48px;}
|
||||
.icon-print{background-position:-96px -48px;}
|
||||
.icon-camera{background-position:-120px -48px;}
|
||||
.icon-font{background-position:-144px -48px;}
|
||||
.icon-bold{background-position:-167px -48px;}
|
||||
.icon-italic{background-position:-192px -48px;}
|
||||
.icon-text-height{background-position:-216px -48px;}
|
||||
.icon-text-width{background-position:-240px -48px;}
|
||||
.icon-align-left{background-position:-264px -48px;}
|
||||
.icon-align-center{background-position:-288px -48px;}
|
||||
.icon-align-right{background-position:-312px -48px;}
|
||||
.icon-align-justify{background-position:-336px -48px;}
|
||||
.icon-list{background-position:-360px -48px;}
|
||||
.icon-indent-left{background-position:-384px -48px;}
|
||||
.icon-indent-right{background-position:-408px -48px;}
|
||||
.icon-facetime-video{background-position:-432px -48px;}
|
||||
.icon-picture{background-position:-456px -48px;}
|
||||
.icon-pencil{background-position:0 -72px;}
|
||||
.icon-map-marker{background-position:-24px -72px;}
|
||||
.icon-adjust{background-position:-48px -72px;}
|
||||
.icon-tint{background-position:-72px -72px;}
|
||||
.icon-edit{background-position:-96px -72px;}
|
||||
.icon-share{background-position:-120px -72px;}
|
||||
.icon-check{background-position:-144px -72px;}
|
||||
.icon-move{background-position:-168px -72px;}
|
||||
.icon-step-backward{background-position:-192px -72px;}
|
||||
.icon-fast-backward{background-position:-216px -72px;}
|
||||
.icon-backward{background-position:-240px -72px;}
|
||||
.icon-play{background-position:-264px -72px;}
|
||||
.icon-pause{background-position:-288px -72px;}
|
||||
.icon-stop{background-position:-312px -72px;}
|
||||
.icon-forward{background-position:-336px -72px;}
|
||||
.icon-fast-forward{background-position:-360px -72px;}
|
||||
.icon-step-forward{background-position:-384px -72px;}
|
||||
.icon-eject{background-position:-408px -72px;}
|
||||
.icon-chevron-left{background-position:-432px -72px;}
|
||||
.icon-chevron-right{background-position:-456px -72px;}
|
||||
.icon-plus-sign{background-position:0 -96px;}
|
||||
.icon-minus-sign{background-position:-24px -96px;}
|
||||
.icon-remove-sign{background-position:-48px -96px;}
|
||||
.icon-ok-sign{background-position:-72px -96px;}
|
||||
.icon-question-sign{background-position:-96px -96px;}
|
||||
.icon-info-sign{background-position:-120px -96px;}
|
||||
.icon-screenshot{background-position:-144px -96px;}
|
||||
.icon-remove-circle{background-position:-168px -96px;}
|
||||
.icon-ok-circle{background-position:-192px -96px;}
|
||||
.icon-ban-circle{background-position:-216px -96px;}
|
||||
.icon-arrow-left{background-position:-240px -96px;}
|
||||
.icon-arrow-right{background-position:-264px -96px;}
|
||||
.icon-arrow-up{background-position:-289px -96px;}
|
||||
.icon-arrow-down{background-position:-312px -96px;}
|
||||
.icon-share-alt{background-position:-336px -96px;}
|
||||
.icon-resize-full{background-position:-360px -96px;}
|
||||
.icon-resize-small{background-position:-384px -96px;}
|
||||
.icon-plus{background-position:-408px -96px;}
|
||||
.icon-minus{background-position:-433px -96px;}
|
||||
.icon-asterisk{background-position:-456px -96px;}
|
||||
.icon-exclamation-sign{background-position:0 -120px;}
|
||||
.icon-gift{background-position:-24px -120px;}
|
||||
.icon-leaf{background-position:-48px -120px;}
|
||||
.icon-fire{background-position:-72px -120px;}
|
||||
.icon-eye-open{background-position:-96px -120px;}
|
||||
.icon-eye-close{background-position:-120px -120px;}
|
||||
.icon-warning-sign{background-position:-144px -120px;}
|
||||
.icon-plane{background-position:-168px -120px;}
|
||||
.icon-calendar{background-position:-192px -120px;}
|
||||
.icon-random{background-position:-216px -120px;}
|
||||
.icon-comment{background-position:-240px -120px;}
|
||||
.icon-magnet{background-position:-264px -120px;}
|
||||
.icon-chevron-up{background-position:-288px -120px;}
|
||||
.icon-chevron-down{background-position:-313px -119px;}
|
||||
.icon-retweet{background-position:-336px -120px;}
|
||||
.icon-shopping-cart{background-position:-360px -120px;}
|
||||
.icon-folder-close{background-position:-384px -120px;}
|
||||
.icon-folder-open{background-position:-408px -120px;}
|
||||
.icon-resize-vertical{background-position:-432px -119px;}
|
||||
.icon-resize-horizontal{background-position:-456px -118px;}
|
||||
.dropdown{position:relative;}
|
||||
.dropdown-toggle{*margin-bottom:-3px;}
|
||||
.dropdown-toggle:active,.open .dropdown-toggle{outline:0;}
|
||||
.caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"\2193";}
|
||||
.dropdown .caret{margin-top:8px;margin-left:2px;}
|
||||
.dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);}
|
||||
.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;max-width:220px;_width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.bottom-up{top:auto;bottom:100%;margin-bottom:2px;}
|
||||
.dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;}
|
||||
.dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;}
|
||||
.dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;}
|
||||
.dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);}
|
||||
.dropdown.open .dropdown-menu{display:block;}
|
||||
.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
|
||||
.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
|
||||
.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;}
|
||||
.collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;}
|
||||
.close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;}
|
||||
.btn{display:inline-block;padding:4px 10px 4px;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#fafafa;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-repeat:no-repeat;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:first-child{*margin-left:0;}
|
||||
.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}
|
||||
.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
|
||||
.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;color:rgba(0, 0, 0, 0.5);outline:0;}
|
||||
.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
|
||||
.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
|
||||
.btn-large .icon{margin-top:1px;}
|
||||
.btn-small{padding:5px 9px;font-size:11px;line-height:16px;}
|
||||
.btn-small .icon{margin-top:-1px;}
|
||||
.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;}
|
||||
.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active{color:rgba(255, 255, 255, 0.75);}
|
||||
.btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;}
|
||||
.btn-primary:active,.btn-primary.active{background-color:#003399 \9;}
|
||||
.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;}
|
||||
.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;}
|
||||
.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;}
|
||||
.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
|
||||
.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;}
|
||||
.btn-success:active,.btn-success.active{background-color:#408140 \9;}
|
||||
.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;}
|
||||
.btn-info:active,.btn-info.active{background-color:#24748c \9;}
|
||||
button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}
|
||||
button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;}
|
||||
button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;}
|
||||
.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";}
|
||||
.btn-group:after{clear:both;}
|
||||
.btn-group:first-child{*margin-left:0;}
|
||||
.btn-group+.btn-group{margin-left:5px;}
|
||||
.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;}
|
||||
.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
|
||||
.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
|
||||
.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
|
||||
.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
|
||||
.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
|
||||
.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;}
|
||||
.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;}
|
||||
.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;}
|
||||
.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
|
||||
.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);}
|
||||
.btn .caret{margin-top:7px;margin-left:0;}
|
||||
.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);}
|
||||
.btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);}
|
||||
.btn-small .caret{margin-top:4px;}
|
||||
.alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
|
||||
.alert,.alert-heading{color:#c09853;}
|
||||
.alert .close{position:relative;top:-2px;right:-21px;line-height:18px;}
|
||||
.alert-success{background-color:#dff0d8;border-color:#d6e9c6;}
|
||||
.alert-success,.alert-success .alert-heading{color:#468847;}
|
||||
.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;}
|
||||
.alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;}
|
||||
.alert-info{background-color:#d9edf7;border-color:#bce8f1;}
|
||||
.alert-info,.alert-info .alert-heading{color:#3a87ad;}
|
||||
.alert-block{padding-top:14px;padding-bottom:14px;}
|
||||
.alert-block>p,.alert-block>ul{margin-bottom:0;}
|
||||
.alert-block p+p{margin-top:5px;}
|
||||
.nav{margin-left:0;margin-bottom:18px;list-style:none;}
|
||||
.nav>li>a{display:block;}
|
||||
.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;}
|
||||
.nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;}
|
||||
.nav-list>li>a,.nav-list .nav-header{display:block;padding:3px 15px;margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
|
||||
.nav-list .nav-header{font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-transform:uppercase;}
|
||||
.nav-list>li+.nav-header{margin-top:9px;}
|
||||
.nav-list .active>a{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;}
|
||||
.nav-list .icon{margin-right:2px;}
|
||||
.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";}
|
||||
.nav-tabs:after,.nav-pills:after{clear:both;}
|
||||
.nav-tabs>li,.nav-pills>li{float:left;}
|
||||
.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;}
|
||||
.nav-tabs{border-bottom:1px solid #ddd;}
|
||||
.nav-tabs>li{margin-bottom:-1px;}
|
||||
.nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;}
|
||||
.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;}
|
||||
.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
|
||||
.nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;}
|
||||
.nav-stacked>li{float:none;}
|
||||
.nav-stacked>li>a{margin-right:0;}
|
||||
.nav-tabs.nav-stacked{border-bottom:0;}
|
||||
.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
|
||||
.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}
|
||||
.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}
|
||||
.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;}
|
||||
.nav-pills.nav-stacked>li>a{margin-bottom:3px;}
|
||||
.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;}
|
||||
.nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;}
|
||||
.nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
|
||||
.nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;}
|
||||
.nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;}
|
||||
.nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;}
|
||||
.nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;}
|
||||
.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;}
|
||||
.nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);}
|
||||
.tabs-stacked .open>a:hover{border-color:#999999;}
|
||||
.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";}
|
||||
.tabbable:after{clear:both;}
|
||||
.tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;}
|
||||
.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;}
|
||||
.tab-content>.active,.pill-content>.active{display:block;}
|
||||
.tabs-below .nav-tabs{border-top:1px solid #ddd;}
|
||||
.tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;}
|
||||
.tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;}
|
||||
.tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;}
|
||||
.tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;}
|
||||
.tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;}
|
||||
.tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;}
|
||||
.tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
|
||||
.tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;}
|
||||
.tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;}
|
||||
.tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;}
|
||||
.tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
|
||||
.tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;}
|
||||
.tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;}
|
||||
.navbar{overflow:visible;margin-bottom:18px;}
|
||||
.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);}
|
||||
.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;}
|
||||
.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;}
|
||||
.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);}
|
||||
.btn-navbar .icon-bar+.icon-bar{margin-top:3px;}
|
||||
.nav-collapse.collapse{height:auto;}
|
||||
.navbar .brand:hover{text-decoration:none;}
|
||||
.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;}
|
||||
.navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;}
|
||||
.navbar .btn,.navbar .btn-group{margin-top:5px;}
|
||||
.navbar .btn-group .btn{margin-top:0;}
|
||||
.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";}
|
||||
.navbar-form:after{clear:both;}
|
||||
.navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;}
|
||||
.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;}
|
||||
.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;}
|
||||
.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;}
|
||||
.navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;}
|
||||
.navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);}
|
||||
.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;}
|
||||
.navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;}
|
||||
.navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
|
||||
.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;}
|
||||
.navbar .nav.pull-right{float:right;}
|
||||
.navbar .nav>li{display:block;float:left;}
|
||||
.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}
|
||||
.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;}
|
||||
.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;background-color:rgba(0, 0, 0, 0.5);}
|
||||
.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;}
|
||||
.navbar .nav.pull-right{margin-left:10px;margin-right:0;}
|
||||
.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;}
|
||||
.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;}
|
||||
.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;}
|
||||
.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);}
|
||||
.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;}
|
||||
.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;}
|
||||
.navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;}
|
||||
.navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;}
|
||||
.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;}
|
||||
.breadcrumb .divider{padding:0 5px;color:#999999;}
|
||||
.breadcrumb .active a{color:#333333;}
|
||||
.pagination{height:36px;margin:18px 0;}
|
||||
.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}
|
||||
.pagination li{display:inline;}
|
||||
.pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;}
|
||||
.pagination a:hover,.pagination .active a{background-color:#f5f5f5;}
|
||||
.pagination .active a{color:#999999;cursor:default;}
|
||||
.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;}
|
||||
.pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
|
||||
.pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
|
||||
.pagination-centered{text-align:center;}
|
||||
.pagination-right{text-align:right;}
|
||||
.pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";}
|
||||
.pager:after{clear:both;}
|
||||
.pager li{display:inline;}
|
||||
.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
|
||||
.pager a:hover{text-decoration:none;background-color:#f5f5f5;}
|
||||
.pager .next a{float:right;}
|
||||
.pager .previous a{float:left;}
|
||||
.modal-open .dropdown-menu{z-index:2050;}
|
||||
.modal-open .dropdown.open{*z-index:2050;}
|
||||
.modal-open .popover{z-index:2060;}
|
||||
.modal-open .tooltip{z-index:2070;}
|
||||
.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;}
|
||||
.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);}
|
||||
.modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;}
|
||||
.modal.fade.in{top:50%;}
|
||||
.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;}
|
||||
.modal-body{padding:15px;}
|
||||
.modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";}
|
||||
.modal-footer:after{clear:both;}
|
||||
.modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;}
|
||||
.tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);}
|
||||
.tooltip.top{margin-top:-2px;}
|
||||
.tooltip.right{margin-left:2px;}
|
||||
.tooltip.bottom{margin-top:2px;}
|
||||
.tooltip.left{margin-left:-2px;}
|
||||
.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
|
||||
.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
|
||||
.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
|
||||
.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
|
||||
.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
|
||||
.tooltip-arrow{position:absolute;width:0;height:0;}
|
||||
.popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;}
|
||||
.popover.right{margin-left:5px;}
|
||||
.popover.bottom{margin-top:5px;}
|
||||
.popover.left{margin-left:-5px;}
|
||||
.popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
|
||||
.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
|
||||
.popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
|
||||
.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
|
||||
.popover .arrow{position:absolute;width:0;height:0;}
|
||||
.popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);}
|
||||
.popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;}
|
||||
.popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;}
|
||||
.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";}
|
||||
.thumbnails:after{clear:both;}
|
||||
.thumbnails>li{float:left;margin:0 0 18px 20px;}
|
||||
.thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);}
|
||||
a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}
|
||||
.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;}
|
||||
.thumbnail .caption{padding:9px;}
|
||||
.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
|
||||
.label-important{background-color:#b94a48;}
|
||||
.label-warning{background-color:#f89406;}
|
||||
.label-success{background-color:#468847;}
|
||||
.label-info{background-color:#3a87ad;}
|
||||
@-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
|
||||
.progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;}
|
||||
.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;}
|
||||
.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;}
|
||||
.progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);}
|
||||
.progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
|
||||
.progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);}
|
||||
.progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
|
||||
.progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);}
|
||||
.progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
|
||||
.accordion{margin-bottom:18px;}
|
||||
.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
|
||||
.accordion-heading{border-bottom:0;}
|
||||
.accordion-heading .accordion-toggle{display:block;padding:8px 15px;}
|
||||
.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;}
|
||||
.carousel{position:relative;margin-bottom:18px;line-height:1;}
|
||||
.carousel-inner{overflow:hidden;width:100%;position:relative;}
|
||||
.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;}
|
||||
.carousel .item>img{display:block;line-height:1;}
|
||||
.carousel .active,.carousel .next,.carousel .prev{display:block;}
|
||||
.carousel .active{left:0;}
|
||||
.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;}
|
||||
.carousel .next{left:100%;}
|
||||
.carousel .prev{left:-100%;}
|
||||
.carousel .next.left,.carousel .prev.right{left:0;}
|
||||
.carousel .active.left{left:-100%;}
|
||||
.carousel .active.right{left:100%;}
|
||||
.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;}
|
||||
.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);}
|
||||
.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);}
|
||||
.carousel-caption h4,.carousel-caption p{color:#ffffff;}
|
||||
.hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;}
|
||||
.hero-unit p{font-size:18px;font-weight:200;line-height:27px;}
|
||||
.pull-right{float:right;}
|
||||
.pull-left{float:left;}
|
||||
.hide{display:none;}
|
||||
.show{display:block;}
|
||||
.invisible{visibility:hidden;}
|
3
assembly/src/release/examples/mqtt/websocket/css/bootstrap.min.responsive.css
vendored
Normal file
3
assembly/src/release/examples/mqtt/websocket/css/bootstrap.min.responsive.css
vendored
Normal file
File diff suppressed because one or more lines are too long
Binary file not shown.
After Width: | Height: | Size: 4.3 KiB |
Binary file not shown.
After Width: | Height: | Size: 4.3 KiB |
|
@ -0,0 +1,198 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Chat Example Using MQTT Over WebSockets</title>
|
||||
<!--[if lt IE 9]>
|
||||
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
|
||||
<![endif]-->
|
||||
<link href="css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="css/bootstrap.min.responsive.css" rel="stylesheet">
|
||||
<style type="text/css">
|
||||
body { padding-top: 40px; }
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="navbar navbar-fixed-top">
|
||||
<div class="navbar-inner">
|
||||
<div class="container">
|
||||
<a class="brand" href="#">ActiveMQ MQTT WebSocket Chat Example</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="container-fluid">
|
||||
<div class="row-fluid">
|
||||
<div class="span6">
|
||||
<div id="connect">
|
||||
<div class="page-header">
|
||||
<h2>Server Login</h2>
|
||||
</div>
|
||||
<form class="form-horizontal" id='connect_form'>
|
||||
<fieldset>
|
||||
<div class="control-group">
|
||||
<label>Host</label>
|
||||
<div class="controls">
|
||||
<input name=host id='connect_host' value='localhost' type="text">
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label>Port</label>
|
||||
<div class="controls">
|
||||
<input name=url id='connect_port' value='61623' type="text">
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label>Client ID</label>
|
||||
<div class="controls">
|
||||
<input id='connect_clientId' placeholder="id" value="example" type="text">
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label>User ID</label>
|
||||
<div class="controls">
|
||||
<input id='connect_user' placeholder="User ID" value="admin" type="text">
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label>Password</label>
|
||||
<div class="controls">
|
||||
<input id='connect_password' placeholder="User Password" value="password" type="password">
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label>Destination</label>
|
||||
<div class="controls">
|
||||
<input id='destination' placeholder="Destination" value="chat/general" type="text">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-actions">
|
||||
<button id='connect_submit' type="submit" class="btn btn-large btn-primary">Connect</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
</form>
|
||||
</div>
|
||||
<div id="connected" style="display:none">
|
||||
<div class="page-header">
|
||||
<h2>Chat Room</h2>
|
||||
</div>
|
||||
<div id="messages">
|
||||
</div>
|
||||
<form class="well form-search" id='send_form'>
|
||||
<button class="btn" type="button" id='disconnect' style="float:right">Disconnect</button>
|
||||
<input class="input-medium" id='send_form_input' placeholder="Type your message here" class="span6"/>
|
||||
<button class="btn" type="submit">Send</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="span4">
|
||||
<div class="page-header">
|
||||
<h2>Debug Log</h2>
|
||||
</div>
|
||||
<pre id="debug"></pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Scripts placed at the end of the document so the pages load faster -->
|
||||
<script src='js/jquery-1.7.2.min.js'></script>
|
||||
<script src="js/mqttws31.js"></script>
|
||||
<script>//<![CDATA[
|
||||
$(document).ready(function(){
|
||||
if( !window.WebSocket) {
|
||||
$("#connect").html("\
|
||||
<h1>Get a new Web Browser!</h1>\
|
||||
<p>\
|
||||
Your browser does not support WebSockets. This example will not work properly.<br>\
|
||||
Please use a Web Browser with WebSockets support (WebKit or Google Chrome).\
|
||||
</p>\
|
||||
");
|
||||
} else {
|
||||
|
||||
var client, destination;
|
||||
|
||||
$('#connect_form').submit(function() {
|
||||
var host = $("#connect_host").val();
|
||||
var port = $("#connect_port").val();
|
||||
var clientId = $("#connect_clientId").val();
|
||||
var user = $("#connect_user").val();
|
||||
var password = $("#connect_password").val();
|
||||
|
||||
destination = $("#destination").val();
|
||||
|
||||
|
||||
client = new Messaging.Client(host, Number(port), clientId);
|
||||
|
||||
client.onConnect = onConnect;
|
||||
|
||||
client.onMessageArrived = onMessageArrived;
|
||||
client.onConnectionLost = onConnectionLost;
|
||||
|
||||
client.connect({
|
||||
userName:user,
|
||||
password:password,
|
||||
onSuccess:onConnect,
|
||||
onFailure:onFailure
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
// the client is notified when it is connected to the server.
|
||||
var onConnect = function(frame) {
|
||||
debug("connected to MQTT");
|
||||
$('#connect').fadeOut({ duration: 'fast' });
|
||||
$('#connected').fadeIn();
|
||||
client.subscribe(destination);
|
||||
};
|
||||
|
||||
// this allows to display debug logs directly on the web page
|
||||
var debug = function(str) {
|
||||
$("#debug").append(document.createTextNode(str + "\n"));
|
||||
};
|
||||
|
||||
$('#disconnect').click(function() {
|
||||
client.disconnect();
|
||||
$('#connected').fadeOut({ duration: 'fast' });
|
||||
$('#connect').fadeIn();
|
||||
$("#messages").html("")
|
||||
return false;
|
||||
});
|
||||
|
||||
$('#send_form').submit(function() {
|
||||
var text = $('#send_form_input').val();
|
||||
if (text) {
|
||||
message = new Messaging.Message(text);
|
||||
message.destinationName = destination;
|
||||
client.send(message);
|
||||
$('#send_form_input').val("");
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
function onFailure(failure) {
|
||||
debug("failure");
|
||||
debug(failure.errorMessage);
|
||||
}
|
||||
|
||||
function onMessageArrived(message) {
|
||||
var p = document.createElement("p");
|
||||
var t = document.createTextNode(message.payloadString);
|
||||
p.appendChild(t);
|
||||
$("#messages").append(p);
|
||||
}
|
||||
|
||||
function onConnectionLost(responseObject) {
|
||||
if (responseObject.errorCode !== 0) {
|
||||
debug(client.clientId + ": " + responseObject.errorCode + "\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
});
|
||||
//]]></script>
|
||||
|
||||
</body>
|
||||
</html>
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,18 @@
|
|||
## Overview
|
||||
|
||||
This is an example of how use the
|
||||
['stomp-websocket'](https://github.com/jmesnil/stomp-websocket)
|
||||
JavaScript APIs with the ActiveMQ message broker.
|
||||
|
||||
## Prereqs
|
||||
|
||||
- Use a modern browser with WebSocket support like Chrome or WebKit
|
||||
|
||||
## Running
|
||||
|
||||
Run the ActiveMQ sever locally and then open the `index.html`
|
||||
in the current directory using a web browser.
|
||||
|
||||
## Credits
|
||||
|
||||
This example is a modified version of Jeff Mesnil's chat example.
|
|
@ -0,0 +1,81 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
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.
|
||||
|
||||
-->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>advanced-openwire-example</artifactId>
|
||||
<groupId>example</groupId>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>jms-example-composite-destinations</artifactId>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>consumer</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.composite.dest.Consumer</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>producer</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.composite.dest.Producer</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
|
@ -0,0 +1,38 @@
|
|||
## Overview
|
||||
|
||||
This is an example of how to use the ActiveMQ 5.x / OpenWire protocol to communicate with ActiveMQ
|
||||
|
||||
This example demonstrates how to use composite destinations for both sending and receiving.
|
||||
|
||||
## Prereqs
|
||||
|
||||
- Install Java SDK
|
||||
- Install [Maven](http://maven.apache.org/download.html)
|
||||
|
||||
## Building
|
||||
|
||||
Run:
|
||||
|
||||
mvn install
|
||||
|
||||
## Running the Examples
|
||||
|
||||
In one terminal window run:
|
||||
|
||||
mvn -P consumer
|
||||
|
||||
In another terminal window run:
|
||||
|
||||
mvn -P producer
|
||||
|
||||
## What to look for
|
||||
In the console of the producer, you should see log messages indicating messages have been successfully sent
|
||||
to the broker.
|
||||
|
||||
In the console of the consumer, you should see log messages indicating messages have been received on each individual
|
||||
destination:
|
||||
|
||||
* test-queue
|
||||
* test-queue-foo
|
||||
* test-queue-bar
|
||||
* test-topic-foo
|
|
@ -0,0 +1,121 @@
|
|||
/**
|
||||
* 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 example.composite.dest;
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
|
||||
import javax.jms.*;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class Consumer {
|
||||
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
private static final long TIMEOUT = 20000;
|
||||
|
||||
public static void main(String[] args) {
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
System.out.println("\nWaiting to receive messages... will timeout after " + TIMEOUT / 1000 +"s");
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
|
||||
try {
|
||||
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.start();
|
||||
|
||||
Session session = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
Destination destination = session.createQueue("test-queue");
|
||||
Destination destinationFoo = session.createQueue("test-queue-foo");
|
||||
Destination destinationBar = session.createQueue("test-queue-bar");
|
||||
Destination destinationTopicFoo = session.createTopic("test-topic-foo");
|
||||
|
||||
MessageConsumer consumer = session.createConsumer(destination);
|
||||
MessageConsumer consumerFoo = session.createConsumer(destinationFoo);
|
||||
MessageConsumer consumerBar = session.createConsumer(destinationBar);
|
||||
MessageConsumer consumerTopicFoo = session.createConsumer(destinationTopicFoo);
|
||||
|
||||
int i = 0;
|
||||
while (true) {
|
||||
Message message = consumer.receive(TIMEOUT);
|
||||
|
||||
if (message != null) {
|
||||
if (message instanceof TextMessage) {
|
||||
String text = ((TextMessage) message).getText();
|
||||
System.out.println("Got " + i++ + ". message on test-queue: " + text);
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
||||
message = consumerFoo.receive(TIMEOUT);
|
||||
|
||||
if (message != null) {
|
||||
if (message instanceof TextMessage) {
|
||||
String text = ((TextMessage) message).getText();
|
||||
System.out.println("Got " + i++ + ". message on test-queue-foo: " + text);
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
||||
message = consumerBar.receive(TIMEOUT);
|
||||
|
||||
if (message != null) {
|
||||
if (message instanceof TextMessage) {
|
||||
String text = ((TextMessage) message).getText();
|
||||
System.out.println("Got " + i++ + ". message on test-queue-bar: " + text);
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
||||
message = consumerTopicFoo.receive(TIMEOUT);
|
||||
|
||||
if (message != null) {
|
||||
if (message instanceof TextMessage) {
|
||||
String text = ((TextMessage) message).getText();
|
||||
System.out.println("Got " + i++ + ". message on test-topic-bar: " + text);
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
consumer.close();
|
||||
session.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
}
|
||||
finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not close an open connection...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
/**
|
||||
* 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 example.composite.dest;
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
|
||||
import javax.jms.*;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class Producer {
|
||||
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
private static final int NUM_MESSAGES_TO_SEND = 100;
|
||||
private static final long DELAY = 100;
|
||||
|
||||
public static void main(String[] args) {
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
|
||||
try {
|
||||
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.start();
|
||||
|
||||
Session session = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
Destination destination = session.createQueue("test-queue,test-queue-foo,test-queue-bar,topic://test-topic-foo");
|
||||
MessageProducer producer = session.createProducer(destination);
|
||||
|
||||
for (int i = 0; i < NUM_MESSAGES_TO_SEND; i++) {
|
||||
TextMessage message = session.createTextMessage("Message #" + i);
|
||||
System.out.println("Sending message #" + i);
|
||||
producer.send(message);
|
||||
Thread.sleep(DELAY);
|
||||
}
|
||||
|
||||
producer.close();
|
||||
session.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
} finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not close an open connection...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
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.
|
||||
|
||||
-->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>advanced-openwire-example</artifactId>
|
||||
<groupId>example</groupId>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>jms-example-durable-sub</artifactId>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>subscriber</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.topic.durable.Subscriber</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>publisher</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.topic.durable.Publisher</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
</project>
|
|
@ -0,0 +1,29 @@
|
|||
## Overview
|
||||
|
||||
This is an example of how to use the ActiveMQ 5.x / OpenWire protocol to communicate with ActiveMQ
|
||||
|
||||
This example does basic publish-subscribe messaging using Topics
|
||||
|
||||
## Prereqs
|
||||
|
||||
- Install Java SDK
|
||||
- Install [Maven](http://maven.apache.org/download.html)
|
||||
|
||||
## Building
|
||||
|
||||
Run:
|
||||
|
||||
mvn install
|
||||
|
||||
## Running the Examples
|
||||
|
||||
In one terminal window run:
|
||||
|
||||
mvn -Psubscriber -DclientId=<client_id_goes_here>
|
||||
|
||||
In another terminal window run:
|
||||
|
||||
mvn -Ppublisher
|
||||
|
||||
You can kill the subscriber at any point and it will not miss messages because the subscription it creates
|
||||
is durable
|
|
@ -0,0 +1,76 @@
|
|||
/**
|
||||
* 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 example.topic.durable;
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
|
||||
import javax.jms.*;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class Publisher {
|
||||
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
private static final int NUM_MESSAGES_TO_SEND = 100;
|
||||
private static final long DELAY = 100;
|
||||
|
||||
public static void main(String[] args) {
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
|
||||
try {
|
||||
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.start();
|
||||
|
||||
Session session = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
Destination destination = session.createTopic("test-topic");
|
||||
MessageProducer producer = session.createProducer(destination);
|
||||
|
||||
for (int i = 0; i < NUM_MESSAGES_TO_SEND; i++) {
|
||||
TextMessage message = session.createTextMessage("Message #" + i);
|
||||
System.out.println("Sending message #" + i);
|
||||
producer.send(message);
|
||||
Thread.sleep(DELAY);
|
||||
}
|
||||
|
||||
// tell the subscribers we're done
|
||||
producer.send(session.createTextMessage("END"));
|
||||
|
||||
producer.close();
|
||||
session.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
}
|
||||
finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not close an open connection...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
/**
|
||||
* 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 example.topic.durable;
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
|
||||
import javax.jms.*;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class Subscriber implements MessageListener {
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
|
||||
|
||||
private final CountDownLatch countDownLatch;
|
||||
public Subscriber(CountDownLatch latch) {
|
||||
countDownLatch = latch;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
System.out.println("\nWaiting to receive messages... Either waiting for END message or press Ctrl+C to exit");
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
|
||||
try {
|
||||
|
||||
connection = connectionFactory.createConnection();
|
||||
String clientId = System.getProperty("clientId");
|
||||
connection.setClientID(clientId);
|
||||
|
||||
connection.start();
|
||||
|
||||
Session session = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
Topic destination = session.createTopic("test-topic");
|
||||
|
||||
MessageConsumer consumer = session.createDurableSubscriber(destination, clientId) ;
|
||||
consumer.setMessageListener(new Subscriber(latch));
|
||||
|
||||
latch.await();
|
||||
consumer.close();
|
||||
session.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
}
|
||||
finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not close an open connection...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessage(Message message) {
|
||||
try {
|
||||
if (message instanceof TextMessage) {
|
||||
String text = ((TextMessage) message).getText();
|
||||
if ("END".equalsIgnoreCase(text)) {
|
||||
System.out.println("Received END message!");
|
||||
countDownLatch.countDown();
|
||||
}
|
||||
else {
|
||||
System.out.println("Received message:" +text);
|
||||
}
|
||||
}
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Got a JMS Exception!");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
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.
|
||||
|
||||
-->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>advanced-openwire-example</artifactId>
|
||||
<groupId>example</groupId>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>jms-example-exclusive-consumer</artifactId>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>consumer</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.queue.exclusive.Consumer</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>producer</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.queue.exclusive.Producer</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
|
@ -0,0 +1,30 @@
|
|||
## Overview
|
||||
|
||||
This is an example of how to use the ActiveMQ 5.x / OpenWire protocol to communicate with ActiveMQ
|
||||
|
||||
This example demos using exclusive consumers (one single consumer)
|
||||
|
||||
## Prereqs
|
||||
|
||||
- Install Java SDK
|
||||
- Install [Maven](http://maven.apache.org/download.html)
|
||||
|
||||
## Building
|
||||
|
||||
Run:
|
||||
|
||||
mvn install
|
||||
|
||||
## Running the Examples
|
||||
|
||||
You will want to run **multiple** instances of a consumer. To run the consumer open a
|
||||
terminal and type
|
||||
|
||||
mvn -Pconsumer
|
||||
|
||||
In another terminal window run:
|
||||
|
||||
mvn -Pproducer
|
||||
|
||||
You'll notice that even though you have multiple consumers, only one consumer will be consuming messages. If you
|
||||
kill the consumer that's currently receiving messages, one of the other consumers will pick up the consumption.
|
|
@ -0,0 +1,80 @@
|
|||
/**
|
||||
* 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 example.queue.exclusive;
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
|
||||
import javax.jms.*;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class Consumer {
|
||||
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
private static final long TIMEOUT = 20000;
|
||||
|
||||
public static void main(String[] args) {
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
System.out.println("\nWaiting to receive messages... will timeout after " + TIMEOUT / 1000 +"s");
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
|
||||
try {
|
||||
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.start();
|
||||
|
||||
Session session = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
Queue destination = session.createQueue("test-queue?consumer.exclusive=true");
|
||||
MessageConsumer consumer = session.createConsumer(destination);
|
||||
|
||||
int i = 0;
|
||||
while (true) {
|
||||
Message message = consumer.receive(TIMEOUT);
|
||||
|
||||
if (message != null) {
|
||||
if (message instanceof TextMessage) {
|
||||
String text = ((TextMessage) message).getText();
|
||||
System.out.println("Got " + i++ + ". message: " + text);
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
consumer.close();
|
||||
session.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
}
|
||||
finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not close an open connection...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
/**
|
||||
* 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 example.queue.exclusive;
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
|
||||
import javax.jms.*;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class Producer {
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
private static final int NUM_MESSAGES_TO_SEND = 100;
|
||||
private static final long DELAY = 100;
|
||||
|
||||
public static void main(String[] args) {
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
|
||||
try {
|
||||
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.start();
|
||||
|
||||
Session session = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
Destination destination = session.createQueue("test-queue");
|
||||
MessageProducer producer = session.createProducer(destination);
|
||||
|
||||
for (int i = 0; i < NUM_MESSAGES_TO_SEND; i++) {
|
||||
TextMessage message = session.createTextMessage("Message #" + i);
|
||||
System.out.println("Sending message #" + i);
|
||||
producer.send(message);
|
||||
Thread.sleep(DELAY);
|
||||
}
|
||||
|
||||
producer.close();
|
||||
session.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
}
|
||||
finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not close an open connection...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
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.
|
||||
|
||||
-->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>advanced-openwire-example</artifactId>
|
||||
<groupId>example</groupId>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>jms-example-message-browser</artifactId>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>browser</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.browser.Browser</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>producer</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.browser.Producer</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
</project>
|
|
@ -0,0 +1,28 @@
|
|||
## Overview
|
||||
|
||||
This is an example of how to use the ActiveMQ 5.x / OpenWire protocol to communicate with ActiveMQ
|
||||
|
||||
This example demos how to browse a queue without consuming from it
|
||||
|
||||
## Prereqs
|
||||
|
||||
- Install Java SDK
|
||||
- Install [Maven](http://maven.apache.org/download.html)
|
||||
|
||||
## Building
|
||||
|
||||
Run:
|
||||
|
||||
mvn install
|
||||
|
||||
## Running the Examples
|
||||
|
||||
Run these steps in order:
|
||||
|
||||
1. In one terminal window run:
|
||||
|
||||
mvn -Pproducer
|
||||
|
||||
2. In another terminal window run:
|
||||
|
||||
mvn -Pbrowser
|
|
@ -0,0 +1,72 @@
|
|||
/**
|
||||
* 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 example.browser;
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
|
||||
import javax.jms.*;
|
||||
import java.util.Enumeration;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class Browser {
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
private static final long DELAY = 100;
|
||||
|
||||
public static void main(String[] args) {
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
|
||||
try {
|
||||
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.start();
|
||||
|
||||
Session session = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
Queue destination = session.createQueue("test-queue");
|
||||
QueueBrowser browser = session.createBrowser(destination);
|
||||
Enumeration enumeration = browser.getEnumeration();
|
||||
|
||||
while (enumeration.hasMoreElements()) {
|
||||
TextMessage message = (TextMessage) enumeration.nextElement();
|
||||
System.out.println("Browsing: " + message);
|
||||
TimeUnit.MILLISECONDS.sleep(DELAY);
|
||||
}
|
||||
|
||||
session.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
}
|
||||
finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not close an open connection...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
/**
|
||||
* 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 example.browser;
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
|
||||
import javax.jms.*;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class Producer {
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
private static final int NUM_MESSAGES_TO_SEND = 100;
|
||||
private static final long DELAY = 100;
|
||||
|
||||
public static void main(String[] args) {
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
|
||||
try {
|
||||
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.start();
|
||||
|
||||
Session session = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
Destination destination = session.createQueue("test-queue");
|
||||
MessageProducer producer = session.createProducer(destination);
|
||||
|
||||
for (int i = 0; i < NUM_MESSAGES_TO_SEND; i++) {
|
||||
TextMessage message = session.createTextMessage("Message #" + i);
|
||||
System.out.println("Sending message #" + i);
|
||||
producer.send(message);
|
||||
Thread.sleep(DELAY);
|
||||
}
|
||||
|
||||
producer.close();
|
||||
session.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
}
|
||||
finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not close an open connection...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
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.
|
||||
|
||||
-->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<artifactId>advanced-openwire-example</artifactId>
|
||||
<groupId>example</groupId>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>jms-example-queue-selector</artifactId>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>consumer</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.queue.selector.Consumer</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>producer</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.queue.selector.Producer</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
|
@ -0,0 +1,29 @@
|
|||
## Overview
|
||||
|
||||
This is an example of how to use the ActiveMQ 5.x / OpenWire protocol to communicate with ActiveMQ
|
||||
|
||||
This example shows how to use selectors to filter out messages based on criteria
|
||||
|
||||
## Prereqs
|
||||
|
||||
- Install Java SDK
|
||||
- Install [Maven](http://maven.apache.org/download.html)
|
||||
|
||||
## Building
|
||||
|
||||
Run:
|
||||
|
||||
mvn install
|
||||
|
||||
## Running the Examples
|
||||
|
||||
In one terminal window run:
|
||||
|
||||
mvn -Pconsumer
|
||||
|
||||
In another terminal window run:
|
||||
|
||||
mvn -Pproducer
|
||||
|
||||
In the consumer's terminal, you'll notice that not all of the messages that the producer sent were consumed.
|
||||
Only those that had the property "intended" equal to "me"
|
|
@ -0,0 +1,80 @@
|
|||
/**
|
||||
* 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 example.queue.selector;
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
|
||||
import javax.jms.*;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class Consumer {
|
||||
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
private static final long TIMEOUT = 20000;
|
||||
|
||||
public static void main(String[] args) {
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
System.out.println("\nWaiting to receive messages... will timeout after " + TIMEOUT / 1000 +"s");
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
|
||||
try {
|
||||
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.start();
|
||||
|
||||
Session session = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
Destination destination = session.createQueue("test-queue");
|
||||
MessageConsumer consumer = session.createConsumer(destination, "intended = 'me'");
|
||||
|
||||
int i = 0;
|
||||
while (true) {
|
||||
Message message = consumer.receive(TIMEOUT);
|
||||
|
||||
if (message != null) {
|
||||
if (message instanceof TextMessage) {
|
||||
String text = ((TextMessage) message).getText();
|
||||
System.out.println("Got " + i++ + ". message: " + text);
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
consumer.close();
|
||||
session.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
}
|
||||
finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not close an open connection...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
/**
|
||||
* 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 example.queue.selector;
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
|
||||
import javax.jms.*;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class Producer {
|
||||
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
private static final int NUM_MESSAGES_TO_SEND = 100;
|
||||
private static final long DELAY = 100;
|
||||
|
||||
public static void main(String[] args) {
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
|
||||
try {
|
||||
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.start();
|
||||
|
||||
Session session = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
Destination destination = session.createQueue("test-queue");
|
||||
MessageProducer producer = session.createProducer(destination);
|
||||
|
||||
for (int i = 0; i < NUM_MESSAGES_TO_SEND; i++) {
|
||||
TextMessage message = session.createTextMessage("Message #" + i);
|
||||
System.out.println("Sending message #" + i);
|
||||
if (i % 2 == 0) {
|
||||
System.out.println("Sending to me");
|
||||
message.setStringProperty("intended", "me");
|
||||
} else {
|
||||
System.out.println("Sending to you");
|
||||
message.setStringProperty("intended", "you");
|
||||
}
|
||||
producer.send(message);
|
||||
Thread.sleep(DELAY);
|
||||
}
|
||||
|
||||
producer.close();
|
||||
session.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
}
|
||||
finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not close an open connection...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
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.
|
||||
|
||||
-->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>advanced-openwire-example</artifactId>
|
||||
<groupId>example</groupId>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>jms-example-queue</artifactId>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>consumer</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.queue.Consumer</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>producer</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.queue.Producer</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
|
@ -0,0 +1,26 @@
|
|||
## Overview
|
||||
|
||||
This is an example of how to use the ActiveMQ 5.x / OpenWire protocol to communicate with ActiveMQ
|
||||
|
||||
This example does basic point-to-point messaging using Queues
|
||||
|
||||
## Prereqs
|
||||
|
||||
- Install Java SDK
|
||||
- Install [Maven](http://maven.apache.org/download.html)
|
||||
|
||||
## Building
|
||||
|
||||
Run:
|
||||
|
||||
mvn install
|
||||
|
||||
## Running the Examples
|
||||
|
||||
In one terminal window run:
|
||||
|
||||
mvn -Pconsumer
|
||||
|
||||
In another terminal window run:
|
||||
|
||||
mvn -Pproducer
|
|
@ -0,0 +1,80 @@
|
|||
/**
|
||||
* 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 example.queue;
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
|
||||
import javax.jms.*;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class Consumer {
|
||||
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
private static final long TIMEOUT = 20000;
|
||||
|
||||
public static void main(String[] args) {
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
System.out.println("\nWaiting to receive messages... will timeout after " + TIMEOUT / 1000 +"s");
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
|
||||
try {
|
||||
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.start();
|
||||
|
||||
Session session = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
Destination destination = session.createQueue("test-queue");
|
||||
MessageConsumer consumer = session.createConsumer(destination);
|
||||
|
||||
int i = 0;
|
||||
while (true) {
|
||||
Message message = consumer.receive(TIMEOUT);
|
||||
|
||||
if (message != null) {
|
||||
if (message instanceof TextMessage) {
|
||||
String text = ((TextMessage) message).getText();
|
||||
System.out.println("Got " + i++ + ". message: " + text);
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
consumer.close();
|
||||
session.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
}
|
||||
finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not close an open connection...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
/**
|
||||
* 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 example.queue;
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
|
||||
import javax.jms.*;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class Producer {
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
private static final int NUM_MESSAGES_TO_SEND = 100;
|
||||
private static final long DELAY = 100;
|
||||
|
||||
public static void main(String[] args) {
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
|
||||
try {
|
||||
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.start();
|
||||
|
||||
Session session = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
Destination destination = session.createQueue("test-queue");
|
||||
MessageProducer producer = session.createProducer(destination);
|
||||
|
||||
for (int i = 0; i < NUM_MESSAGES_TO_SEND; i++) {
|
||||
TextMessage message = session.createTextMessage("Message #" + i);
|
||||
System.out.println("Sending message #" + i);
|
||||
producer.send(message);
|
||||
Thread.sleep(DELAY);
|
||||
}
|
||||
|
||||
producer.close();
|
||||
session.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
}
|
||||
finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not close an open connection...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
## ---------------------------------------------------------------------------
|
||||
## 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.
|
||||
## ---------------------------------------------------------------------------
|
||||
|
||||
#
|
||||
# Setup the default logging levels
|
||||
#
|
||||
log4j.rootLogger=INFO, console
|
||||
|
||||
#
|
||||
# Uncomment one of the following to enable trace logging
|
||||
#
|
||||
#log4j.logger.org.apache.activemq=TRACE
|
||||
|
||||
# Console Settings
|
||||
log4j.appender.console=org.apache.log4j.ConsoleAppender
|
||||
log4j.appender.console.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.console.layout.ConversionPattern=%C %-5p | %m%n
|
||||
log4j.appender.console.threshold=TRACE
|
|
@ -0,0 +1,81 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
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.
|
||||
|
||||
-->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>advanced-openwire-example</artifactId>
|
||||
<groupId>example</groupId>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>jms-example-temp-destinations</artifactId>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>consumer</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.tempdest.Consumer</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>producer</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.tempdest.ProducerRequestReply</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
|
@ -0,0 +1,28 @@
|
|||
## Overview
|
||||
|
||||
This is an example of how to use the ActiveMQ 5.x / OpenWire protocol to communicate with ActiveMQ
|
||||
|
||||
This example shows how to do request response with temporary destinations
|
||||
|
||||
## Prereqs
|
||||
|
||||
- Install Java SDK
|
||||
- Install [Maven](http://maven.apache.org/download.html)
|
||||
|
||||
## Building
|
||||
|
||||
Run:
|
||||
|
||||
mvn install
|
||||
|
||||
## Running the Examples
|
||||
|
||||
In one terminal window run:
|
||||
|
||||
mvn -Pconsumer
|
||||
|
||||
In another terminal window run:
|
||||
|
||||
mvn -Pproducer
|
||||
|
||||
You'll notice that the producer received a reply for the request it sent.
|
|
@ -0,0 +1,83 @@
|
|||
package example.tempdest; /**
|
||||
* 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.
|
||||
*/
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
|
||||
import javax.jms.*;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class Consumer {
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
private static final long TIMEOUT = 20000;
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
System.out.println("\nWaiting to receive messages... will timeout after " + TIMEOUT / 1000 +"s");
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
|
||||
try {
|
||||
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.start();
|
||||
|
||||
final Session session = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
Destination destination = session.createQueue("test-queue");
|
||||
MessageConsumer consumer = session.createConsumer(destination);
|
||||
|
||||
int i = 0;
|
||||
while (true) {
|
||||
Message message = consumer.receive(TIMEOUT);
|
||||
|
||||
if (message != null) {
|
||||
if (message instanceof TextMessage) {
|
||||
String text = ((TextMessage) message).getText();
|
||||
System.out.println("Got " + i++ + ". message: " + text);
|
||||
Destination replyTo = message.getJMSReplyTo();
|
||||
MessageProducer producer = session.createProducer(replyTo);
|
||||
producer.send(session.createTextMessage("You made it to the consumer, here is your response"));
|
||||
producer.close();
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
consumer.close();
|
||||
session.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
}
|
||||
finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not close an open connection...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,85 @@
|
|||
package example.tempdest; /**
|
||||
* 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.
|
||||
*/
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
|
||||
import javax.jms.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class ProducerRequestReply{
|
||||
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
private static final int NUM_MESSAGES_TO_SEND = 100;
|
||||
private static final long DELAY = 100;
|
||||
|
||||
public static void main(String[] args) {
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
|
||||
try {
|
||||
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.start();
|
||||
|
||||
Session session = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
Destination destination = session.createQueue("test-queue");
|
||||
MessageProducer producer = session.createProducer(destination);
|
||||
Destination replyDest = session.createTemporaryQueue();
|
||||
|
||||
// set up the consumer to handle the reply
|
||||
MessageConsumer replyConsumer = session.createConsumer(replyDest);
|
||||
replyConsumer.setMessageListener(new MessageListener() {
|
||||
@Override
|
||||
public void onMessage(Message message) {
|
||||
System.out.println("*** REPLY *** ");
|
||||
System.out.println(message.toString());
|
||||
}
|
||||
});
|
||||
|
||||
TextMessage message = session.createTextMessage("I need a response for this, please");
|
||||
message.setJMSReplyTo(replyDest);
|
||||
|
||||
producer.send(message);
|
||||
|
||||
// wait for a response
|
||||
TimeUnit.SECONDS.sleep(2);
|
||||
producer.close();
|
||||
session.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
}
|
||||
finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not close an open connection...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
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.
|
||||
|
||||
-->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>advanced-openwire-example</artifactId>
|
||||
<groupId>example</groupId>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>jms-example-topic</artifactId>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>subscriber</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.topic.Subscriber</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>publisher</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.topic.Publisher</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
|
||||
</project>
|
|
@ -0,0 +1,26 @@
|
|||
## Overview
|
||||
|
||||
This is an example of how to use the ActiveMQ 5.x / OpenWire protocol to communicate with ActiveMQ
|
||||
|
||||
This example does basic publish-subscribe messaging using Topics
|
||||
|
||||
## Prereqs
|
||||
|
||||
- Install Java SDK
|
||||
- Install [Maven](http://maven.apache.org/download.html)
|
||||
|
||||
## Building
|
||||
|
||||
Run:
|
||||
|
||||
mvn install
|
||||
|
||||
## Running the Examples
|
||||
|
||||
In one terminal window run:
|
||||
|
||||
mvn -Psubscriber
|
||||
|
||||
In another terminal window run:
|
||||
|
||||
mvn -Ppublisher
|
|
@ -0,0 +1,75 @@
|
|||
/**
|
||||
* 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 example.topic;
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
|
||||
import javax.jms.*;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class Publisher {
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
private static final int NUM_MESSAGES_TO_SEND = 100;
|
||||
private static final long DELAY = 100;
|
||||
|
||||
public static void main(String[] args) {
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
|
||||
try {
|
||||
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.start();
|
||||
|
||||
Session session = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
Destination destination = session.createTopic("test-topic");
|
||||
MessageProducer producer = session.createProducer(destination);
|
||||
|
||||
for (int i = 0; i < NUM_MESSAGES_TO_SEND; i++) {
|
||||
TextMessage message = session.createTextMessage("Message #" + i);
|
||||
System.out.println("Sending message #" + i);
|
||||
producer.send(message);
|
||||
Thread.sleep(DELAY);
|
||||
}
|
||||
|
||||
// tell the subscribers we're done
|
||||
producer.send(session.createTextMessage("END"));
|
||||
|
||||
producer.close();
|
||||
session.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
}
|
||||
finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not close an open connection...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,94 @@
|
|||
/**
|
||||
* 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 example.topic;
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
|
||||
import javax.jms.*;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class Subscriber implements MessageListener {
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
|
||||
|
||||
private final CountDownLatch countDownLatch;
|
||||
public Subscriber(CountDownLatch latch) {
|
||||
countDownLatch = latch;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
System.out.println("\nWaiting to receive messages... Either waiting for END message or press Ctrl+C to exit");
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
|
||||
try {
|
||||
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.start();
|
||||
|
||||
Session session = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
Destination destination = session.createTopic("test-topic");
|
||||
|
||||
MessageConsumer consumer = session.createConsumer(destination);
|
||||
consumer.setMessageListener(new Subscriber(latch));
|
||||
|
||||
latch.await();
|
||||
consumer.close();
|
||||
session.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
}
|
||||
finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not close an open connection...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessage(Message message) {
|
||||
try {
|
||||
if (message instanceof TextMessage) {
|
||||
String text = ((TextMessage) message).getText();
|
||||
if ("END".equalsIgnoreCase(text)) {
|
||||
System.out.println("Received END message!");
|
||||
countDownLatch.countDown();
|
||||
}
|
||||
else {
|
||||
System.out.println("Received message:" +text);
|
||||
}
|
||||
}
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Got a JMS Exception!");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
## ---------------------------------------------------------------------------
|
||||
## 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.
|
||||
## ---------------------------------------------------------------------------
|
||||
|
||||
#
|
||||
# Setup the default logging levels
|
||||
#
|
||||
log4j.rootLogger=INFO, console
|
||||
|
||||
#
|
||||
# Uncomment one of the following to enable debug logging
|
||||
#
|
||||
#log4j.logger.org.apache.activemq=TRACE
|
||||
|
||||
# Console Settings
|
||||
log4j.appender.console=org.apache.log4j.ConsoleAppender
|
||||
log4j.appender.console.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.console.layout.ConversionPattern=%C %-5p | %m%n
|
||||
log4j.appender.console.threshold=TRACE
|
|
@ -0,0 +1,58 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
|
||||
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.
|
||||
|
||||
-->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>advanced-openwire-example</artifactId>
|
||||
<groupId>example</groupId>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>jms-example-transaction</artifactId>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>client</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.transaction.Client</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
|
@ -0,0 +1,25 @@
|
|||
## Overview
|
||||
|
||||
This is an example of how to use the ActiveMQ 5.x / OpenWire protocol to communicate with ActiveMQ
|
||||
|
||||
This example demos using JMS transactions
|
||||
|
||||
## Prereqs
|
||||
|
||||
- Install Java SDK
|
||||
- Install [Maven](http://maven.apache.org/download.html)
|
||||
|
||||
## Building
|
||||
|
||||
Run:
|
||||
|
||||
mvn install
|
||||
|
||||
## Running the Examples
|
||||
|
||||
mvn -Pclient
|
||||
|
||||
You will be greeted with a prompt. You can type a message and press enter. Nothing will actually be sent to
|
||||
a consumer until you type `COMMIT` and press enter. After doing so, you should see the built-in consumer
|
||||
consume the message and output it. If you type `ROLLBACK`, your message will be rolledback and the consumer
|
||||
will not have an opportunity to see it. Hit ^C to exit
|
|
@ -0,0 +1,114 @@
|
|||
/**
|
||||
* 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 example.transaction;
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
import org.apache.activemq.command.ActiveMQTopic;
|
||||
|
||||
import javax.jms.*;
|
||||
import java.util.Scanner;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class Client {
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
|
||||
// this is set to true
|
||||
private static final Boolean TRANSACTED = true;
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
|
||||
public static void main(String[] args) {
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
|
||||
try {
|
||||
connection = connectionFactory.createConnection();
|
||||
connection.start();
|
||||
Topic destination = new ActiveMQTopic("transacted.client.example");
|
||||
|
||||
Session senderSession = connection.createSession(TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
Session receiverSession = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
MessageConsumer receiver = receiverSession.createConsumer(destination);
|
||||
receiver.setMessageListener(new MessageListener() {
|
||||
@Override
|
||||
public void onMessage(Message message) {
|
||||
if (message instanceof TextMessage) {
|
||||
try {
|
||||
String value = ((TextMessage) message).getText();
|
||||
System.out.println("We received a new message: " + value);
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not read the receiver's topic because of a JMSException");
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
MessageProducer sender = senderSession.createProducer(destination);
|
||||
|
||||
|
||||
connection.start();
|
||||
acceptInputFromUser(senderSession, sender);
|
||||
senderSession.close();
|
||||
receiverSession.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
}
|
||||
finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not close an open connection...");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void acceptInputFromUser(Session senderSession, MessageProducer sender) throws JMSException {
|
||||
System.out.println("Type a message. Type COMMIT to send to receiver, type ROLLBACK to cancel");
|
||||
Scanner inputReader = new Scanner(System.in);
|
||||
|
||||
while (true) {
|
||||
String line = inputReader.nextLine();
|
||||
if (line == null) {
|
||||
System.out.println("Done!");
|
||||
break;
|
||||
} else if (line.length() > 0) {
|
||||
if (line.trim().equals("ROLLBACK")) {
|
||||
System.out.println("Rolling back...");
|
||||
senderSession.rollback();
|
||||
System.out.println("Messages have been rolledback");
|
||||
} else if (line.trim().equals("COMMIT")) {
|
||||
System.out.println("Committing... ");
|
||||
senderSession.commit();
|
||||
System.out.println("Messages should have been sent");
|
||||
} else {
|
||||
TextMessage message = senderSession.createTextMessage();
|
||||
message.setText(line);
|
||||
System.out.println("Batching up:'" + message.getText() + "'");
|
||||
sender.send(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>advanced-openwire-example</artifactId>
|
||||
<groupId>example</groupId>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>jms-example-wildcard-consumer</artifactId>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>consumer</id>
|
||||
<build>
|
||||
<defaultGoal>package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>example.wildcard.Client</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
</project>
|
|
@ -0,0 +1,31 @@
|
|||
## Overview
|
||||
|
||||
This is an example of how to use the ActiveMQ 5.x / OpenWire protocol to communicate with ActiveMQ
|
||||
|
||||
This example demos using wildcards for consuming messages from hierarchies of destinations
|
||||
|
||||
## Prereqs
|
||||
|
||||
- Install Java SDK
|
||||
- Install [Maven](http://maven.apache.org/download.html)
|
||||
|
||||
## Building
|
||||
|
||||
Run:
|
||||
|
||||
mvn install
|
||||
|
||||
## Running the Examples
|
||||
|
||||
Run one consumer specifying which topicName to produce to (topicName) and what sort of wildcard
|
||||
you'd like to use to listen to that same topic hierarchy (wildcard)
|
||||
|
||||
For example, to publish to "hello.world" topic and listen to "hello.world.*":
|
||||
|
||||
mvn -Pconsumer -DtopicName="hello.world" -Dwildcard=".*"
|
||||
|
||||
You start another consumer that listens to:
|
||||
|
||||
mvn -Pconsumer -DtopicName="hello.world.hungray" -Dwildcard=".*"
|
||||
|
||||
And when you type a message on this prompt, you should see it in the first consumer you started
|
|
@ -0,0 +1,109 @@
|
|||
/**
|
||||
* 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 example.wildcard;
|
||||
|
||||
import org.apache.activemq.ActiveMQConnectionFactory;
|
||||
import org.apache.activemq.command.ActiveMQTopic;
|
||||
|
||||
import javax.jms.*;
|
||||
import java.util.Scanner;
|
||||
|
||||
/**
|
||||
* @author <a href="http://www.christianposta.com/blog">Christian Posta</a>
|
||||
*/
|
||||
public class Client {
|
||||
private static final Boolean NON_TRANSACTED = false;
|
||||
private static final String BROKER_URL = "tcp://localhost:61616";
|
||||
|
||||
public static void main(String[] args) {
|
||||
String url = BROKER_URL;
|
||||
if (args.length > 0) {
|
||||
url = args[0].trim();
|
||||
}
|
||||
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "password", url);
|
||||
Connection connection = null;
|
||||
|
||||
try {
|
||||
Topic senderTopic = new ActiveMQTopic(System.getProperty("topicName"));
|
||||
|
||||
connection = connectionFactory.createConnection("admin", "password");
|
||||
|
||||
Session senderSession = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
MessageProducer sender = senderSession.createProducer(senderTopic);
|
||||
|
||||
Session receiverSession = connection.createSession(NON_TRANSACTED, Session.AUTO_ACKNOWLEDGE);
|
||||
|
||||
String policyType = System.getProperty("wildcard", ".*");
|
||||
String receiverTopicName = senderTopic.getTopicName() + policyType;
|
||||
Topic receiverTopic = receiverSession.createTopic(receiverTopicName);
|
||||
|
||||
MessageConsumer receiver = receiverSession.createConsumer(receiverTopic);
|
||||
receiver.setMessageListener(new MessageListener() {
|
||||
public void onMessage(Message message) {
|
||||
try {
|
||||
if (message instanceof TextMessage) {
|
||||
String text = ((TextMessage) message).getText();
|
||||
System.out.println("We received a new message: " + text);
|
||||
}
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Could not read the receiver's topic because of a JMSException");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
connection.start();
|
||||
System.out.println("Listening on '" + receiverTopicName + "'");
|
||||
System.out.println("Enter a message to send: ");
|
||||
|
||||
Scanner inputReader = new Scanner(System.in);
|
||||
|
||||
while (true) {
|
||||
String line = inputReader.nextLine();
|
||||
if (line == null) {
|
||||
System.out.println("Done!");
|
||||
break;
|
||||
} else if (line.length() > 0) {
|
||||
try {
|
||||
TextMessage message = senderSession.createTextMessage();
|
||||
message.setText(line);
|
||||
System.out.println("Sending a message: " + message.getText());
|
||||
sender.send(message);
|
||||
} catch (JMSException e) {
|
||||
System.out.println("Exception during publishing a message: ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
receiver.close();
|
||||
receiverSession.close();
|
||||
sender.close();
|
||||
senderSession.close();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.out.println("Caught exception!");
|
||||
} finally {
|
||||
if (connection != null) {
|
||||
try {
|
||||
connection.close();
|
||||
} catch (JMSException e) {
|
||||
System.out.println("When trying to close connection: ");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,84 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>example</groupId>
|
||||
<artifactId>advanced-openwire-example</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
<modules>
|
||||
<module>jms-example-queue</module>
|
||||
<module>jms-example-topic</module>
|
||||
<module>jms-example-exclusive-consumer</module>
|
||||
<module>jms-example-transaction</module>
|
||||
<module>jms-example-durable-sub</module>
|
||||
<module>jms-example-wildcard-consumer</module>
|
||||
<module>jms-example-temp-destinations</module>
|
||||
<module>jms-example-message-browser</module>
|
||||
<module>jms-example-queue-selector</module>
|
||||
<module>jms-example-composite-destinations</module>
|
||||
</modules>
|
||||
|
||||
<name>JMS / OpeWire Examples for ActiveMQ</name>
|
||||
<description>ActiveMQ OpenWire Java Examples</description>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>Fusesource Snapshots</id>
|
||||
<url>http://repo.fusesource.com/nexus/content/repositories/snapshots</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.geronimo.specs</groupId>
|
||||
<artifactId>geronimo-jms_1.1_spec</artifactId>
|
||||
<version>1.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.activemq</groupId>
|
||||
<artifactId>activemq-client</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-nop</artifactId>
|
||||
<version>${slf4j-version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>2.1</version>
|
||||
<configuration>
|
||||
<source>1.6</source>
|
||||
<target>1.6</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
## Overview
|
||||
|
||||
This directory contains more advanced examples of how to use AcitveMQ's OpenWire based JMS API.
|
|
@ -18,7 +18,7 @@
|
|||
<project name="transactions" default="help" basedir=".">
|
||||
|
||||
<property name="class.dir" value="target/classes" />
|
||||
<property name="activemq.home" value="../.." />
|
||||
<property name="activemq.home" value="../../.." />
|
||||
|
||||
<!-- example program defaults -->
|
||||
<property name="url" value="tcp://localhost:61616" />
|
|
@ -0,0 +1,352 @@
|
|||
/*
|
||||
* © 2001-2009, Progress Software Corporation and/or its subsidiaries or affiliates. All rights reserved.
|
||||
*
|
||||
* Licensed 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.
|
||||
|
||||
Sample Application
|
||||
|
||||
Writing a Basic JMS Application using:
|
||||
- QueueBrowser
|
||||
- JMS with a Graphical Interface
|
||||
- behavior based on message type
|
||||
|
||||
When you run this program, it will read all the parameters out
|
||||
of the QueueMonitor.properties file. In this file you can specify
|
||||
which queues you want to monitor. Then a Java window will open and
|
||||
every time you click the Browse button, The current contents of the queues
|
||||
will be displayed in the text window.
|
||||
|
||||
Usage:
|
||||
java QueueMonitor
|
||||
|
||||
Suggested demonstration:
|
||||
- Start one instance of this application:
|
||||
java QueueMonitor
|
||||
- Run on or more Talk applications (without the receiving queue).
|
||||
- Enter messages on various Talk windows.
|
||||
- Watch the QueueMonitor display the messages.
|
||||
|
||||
*/
|
||||
import org.apache.activemq.*;
|
||||
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JButton;
|
||||
|
||||
import javax.swing.text.Highlighter;
|
||||
import javax.swing.text.DefaultHighlighter;
|
||||
import javax.swing.text.BadLocationException;
|
||||
|
||||
import javax.swing.border.CompoundBorder;
|
||||
import javax.swing.border.EmptyBorder;
|
||||
import javax.swing.border.BevelBorder;
|
||||
import javax.swing.border.SoftBevelBorder;
|
||||
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Rectangle;
|
||||
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.ActionEvent;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
|
||||
import java.util.Vector;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Properties;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
public class QueueMonitor
|
||||
extends JFrame
|
||||
{
|
||||
private static final String DEFAULT_PROPERTIES_FILE = "QueueMonitor.properties";
|
||||
|
||||
String propertiesFile = DEFAULT_PROPERTIES_FILE;
|
||||
String broker = "tcp://localhost:61616";
|
||||
String connectID = "QueueMonitor";
|
||||
String username = "QueueMonitor";
|
||||
String password = "QueueMonitor";
|
||||
String browseQueues = "Q1,Q2,Q3";
|
||||
String textFontName = "Dialog";
|
||||
String textFontStyle = "PLAIN";
|
||||
String textFontSize = "12";
|
||||
String title = "QueueMonitor";
|
||||
|
||||
JTextArea textArea = new JTextArea();
|
||||
JScrollPane scrollPane = new JScrollPane(textArea);
|
||||
JButton browseButton = new JButton("Browse Queues");
|
||||
|
||||
Vector theQueues = new Vector();
|
||||
|
||||
private javax.jms.Connection connect = null;
|
||||
private javax.jms.Session session = null;
|
||||
|
||||
/** Constructor for MessageMonitor window. */
|
||||
public QueueMonitor()
|
||||
{
|
||||
loadProperties();
|
||||
|
||||
setTitle(title);
|
||||
|
||||
// Connect to Message Broker
|
||||
try
|
||||
{
|
||||
javax.jms.ConnectionFactory factory;
|
||||
factory = new ActiveMQConnectionFactory(username, password, broker);
|
||||
|
||||
connect = factory.createConnection (username, password);
|
||||
session = connect.createSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE);
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
System.err.println("Cannot connect to Broker");
|
||||
jmse.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Set up Queues:
|
||||
StringTokenizer queues = new StringTokenizer(browseQueues, ",");
|
||||
while (queues.hasMoreTokens())
|
||||
{
|
||||
try{
|
||||
String queueName = queues.nextToken();
|
||||
System.out.println ("Monitoring " + queueName);
|
||||
theQueues.addElement(session.createQueue(queueName));
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// After init it is time to start the connection
|
||||
try
|
||||
{
|
||||
connect.start();
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
System.err.println("Cannot start connection");
|
||||
jmse.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
//Elements visible on the screen
|
||||
textArea.setEditable(false);
|
||||
scrollPane.setBorder(new CompoundBorder(new EmptyBorder(6,6,6,6),
|
||||
new SoftBevelBorder(BevelBorder.LOWERED)));
|
||||
getContentPane().add(scrollPane,BorderLayout.CENTER);
|
||||
getContentPane().add(browseButton,BorderLayout.SOUTH);
|
||||
|
||||
browseButton.addActionListener(new OnBrowse());
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Main program entry point. */
|
||||
public static void main(String[] args)
|
||||
{
|
||||
// There should be no arguments to this program.
|
||||
if (args.length > 0) {
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
QueueMonitor queueMonitor = new QueueMonitor();
|
||||
|
||||
queueMonitor.addWindowListener(new WindowAdapter() {
|
||||
public void windowClosing(WindowEvent e)
|
||||
{
|
||||
System.exit(0);
|
||||
}
|
||||
});
|
||||
|
||||
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
|
||||
screenSize.height = screenSize.height / 2 ;
|
||||
screenSize.width = screenSize.width / 2 ;
|
||||
queueMonitor.setSize(screenSize);
|
||||
queueMonitor.setVisible(true);
|
||||
|
||||
}
|
||||
|
||||
/** Prints the usage. */
|
||||
private static void printUsage()
|
||||
{
|
||||
StringBuffer use = new StringBuffer();
|
||||
use.append("\nusage: QueueMonitor\n\n");
|
||||
use.append("Properties for this sample can be set in a properties file.\n");
|
||||
String dfltFile = System.getProperty("propertiesFile", DEFAULT_PROPERTIES_FILE);
|
||||
use.append("[Default file: " + dfltFile +"]\n\n");
|
||||
System.out.print(use);
|
||||
}
|
||||
|
||||
/** Load the window and JMS properties from a file. */
|
||||
private void loadProperties()
|
||||
{
|
||||
try
|
||||
{
|
||||
Properties properties = new Properties();
|
||||
|
||||
propertiesFile = System.getProperty("propertiesFile", propertiesFile);
|
||||
|
||||
properties.load(new FileInputStream(propertiesFile));
|
||||
|
||||
// Connection Properties
|
||||
broker = properties.getProperty("broker",broker).trim();
|
||||
connectID = properties.getProperty("connectID",connectID).trim();
|
||||
username = properties.getProperty("username",username).trim();
|
||||
password = properties.getProperty("password",password).trim();
|
||||
|
||||
// Queue Properties
|
||||
browseQueues = properties.getProperty("browseQueues", browseQueues).trim();
|
||||
|
||||
// Text Properties
|
||||
textFontName = properties.getProperty("textFontName", textFontName).trim();
|
||||
textFontStyle = properties.getProperty("textFontStyle", textFontStyle).trim();
|
||||
textFontSize = properties.getProperty("textFontSize", textFontSize).trim();
|
||||
|
||||
// Window Properties
|
||||
title = properties.getProperty("title", title).trim();
|
||||
|
||||
}
|
||||
catch (java.io.FileNotFoundException fnfe)
|
||||
{
|
||||
System.out.println (propertiesFile + " not found: using defaults"); // Use Defaults
|
||||
}
|
||||
catch (java.io.IOException ioe)
|
||||
{
|
||||
ioe.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/** Class to handle the "Browse" button action. */
|
||||
public class OnBrowse implements ActionListener
|
||||
{
|
||||
|
||||
public void actionPerformed(ActionEvent evt)
|
||||
{
|
||||
// Clear the textArea.
|
||||
textArea.setText("");
|
||||
textArea.paintImmediately(textArea.getBounds());
|
||||
|
||||
if(theQueues.size() == 0){
|
||||
textArea.setText("No Queues to be monitored");
|
||||
}
|
||||
else{
|
||||
for(int i = 0; i<theQueues.size();i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Create a browser on the queue and show the messages waiting in it.
|
||||
javax.jms.Queue q = (javax.jms.Queue) theQueues.elementAt(i);
|
||||
textArea.append("--------------------------------------------------\n");
|
||||
textArea.append("Messages on queue " + q.getQueueName() + ":\n");
|
||||
|
||||
// Create a queue browser
|
||||
System.out.print ("Browsing messages in queue " + q.getQueueName() + "\"...");
|
||||
javax.jms.QueueBrowser browser = session.createBrowser(q);
|
||||
System.out.println ("[done]");
|
||||
int cnt = 0;
|
||||
Enumeration e = browser.getEnumeration();
|
||||
if(!e.hasMoreElements())
|
||||
{
|
||||
textArea.append ("(This queue is empty.)");
|
||||
}
|
||||
else
|
||||
{
|
||||
while(e.hasMoreElements())
|
||||
{
|
||||
System.out.print(" --> getting message " + String.valueOf(++cnt) + "...");
|
||||
javax.jms.Message message = (javax.jms.Message) e.nextElement();
|
||||
System.out.println("[" + message + "]");
|
||||
if (message != null)
|
||||
{
|
||||
String msgText = getContents (message);
|
||||
textArea.append(msgText + "\n");
|
||||
try
|
||||
{
|
||||
// Scroll the text area to show the message
|
||||
Rectangle area = textArea.modelToView(textArea.getText().length());
|
||||
textArea.scrollRectToVisible(area);
|
||||
textArea.paintImmediately(textArea.getBounds());
|
||||
}
|
||||
catch(Exception jle) { jle.printStackTrace();}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Free any resources in the browser.
|
||||
browser.close();
|
||||
textArea.append ("\n");
|
||||
}
|
||||
catch (javax.jms.JMSException jmse){
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
}
|
||||
try
|
||||
{
|
||||
// Scroll the text area to show the message
|
||||
Rectangle area = textArea.modelToView(textArea.getText().length());
|
||||
textArea.scrollRectToVisible(area);
|
||||
textArea.paintImmediately(textArea.getBounds());
|
||||
}
|
||||
catch(Exception jle) { jle.printStackTrace();}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public String getContents (javax.jms.Message message){
|
||||
|
||||
|
||||
String msgBody = null;
|
||||
String msgClass = message.getClass().getName();
|
||||
|
||||
if (message instanceof javax.jms.TextMessage)
|
||||
{
|
||||
msgClass = "javax.jms.TextMessage";
|
||||
try
|
||||
{
|
||||
msgBody = ((javax.jms.TextMessage)message).getText();
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
msgBody = "";
|
||||
}
|
||||
}
|
||||
|
||||
else if (message instanceof org.apache.activemq.command.ActiveMQMapMessage)
|
||||
{
|
||||
System.out.println ("(Name value pairs in the MapMessage are not displayed.)");
|
||||
}
|
||||
else if (message instanceof javax.jms.BytesMessage)
|
||||
{
|
||||
System.out.println ("Warning: A bytes message was discarded because it could not be processed as a javax.jms.TextMessage.");
|
||||
}
|
||||
else if (message instanceof javax.jms.ObjectMessage)
|
||||
{
|
||||
System.out.println ("Warning: An object message was discarded because it could not be processed as a javax.jms.TextMessage.");
|
||||
}
|
||||
|
||||
else if (message instanceof javax.jms.StreamMessage)
|
||||
{
|
||||
System.out.println ("Warning: A stream message was discarded because it could not be processed as a javax.jms.TextMessage.");
|
||||
}
|
||||
return "- " + msgClass + " from " + msgBody ;
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
#
|
||||
# This is the properties file for the QueueMonitor Class.
|
||||
#
|
||||
# A QueueMonitor object will load this file when constructed.
|
||||
# By default, a QueueMonitor object searches for and load a
|
||||
# file named "QueueMonitor.properties" in the JVM's "current" directory.
|
||||
#
|
||||
# This behavior may be overriden by assigning an alternate property file
|
||||
# name and location to the System property "propertiesFile".
|
||||
#
|
||||
# Property: broker
|
||||
# Default Value: localhost
|
||||
# Description: Specifies the host and port of the Messaging Broker to connect to.
|
||||
broker tcp://localhost:61616
|
||||
#
|
||||
# Property: connectID
|
||||
# Default Value: QueueMonitor
|
||||
# Description: Specifies the program identifier used to connect to the Messaging Broker.
|
||||
connectID QueueMonitor
|
||||
#
|
||||
# Property: userID
|
||||
# Default Value: Administrator
|
||||
# Description: Specifies the user identifier used to connect to the Messaging Broker.
|
||||
username Administrator
|
||||
#
|
||||
# Property: password
|
||||
# Default Value: Administrator
|
||||
# Description: Specifies the password used to connect to the Messaging Broker.
|
||||
password Administrator
|
||||
#
|
||||
# Property: browseQueues
|
||||
# Default Value:
|
||||
# Description: A comma-separated list of queue names that QueueMonitor browses.
|
||||
# NOTE: An empty list will subscribe to no queues.
|
||||
browseQueues Q1,Q2,Q3,Q4
|
||||
##
|
||||
# Property: textFontName
|
||||
# Default Value: Dialog
|
||||
# Description: The name of the font used to display recieved messages.
|
||||
textFontName Dialog
|
||||
#
|
||||
# Property: textFontStyle
|
||||
# Default Value: PLAIN
|
||||
# Description: The style of the font used to display received messages.
|
||||
textFontStyle PLAIN
|
||||
#
|
||||
# Property: textFontSize
|
||||
# Default Value: 12
|
||||
# Description: The size of the font used to display recieved messages.
|
||||
textFontSize 12
|
||||
#
|
||||
# Property: title
|
||||
# Default Value: QueueMonitor
|
||||
# Description: The title of the QueueMonitor Window.
|
||||
title QueueMonitor
|
||||
..
|
|
@ -0,0 +1,242 @@
|
|||
/*
|
||||
* © 2001-2009, Progress Software Corporation and/or its subsidiaries or affiliates. All rights reserved.
|
||||
*
|
||||
* Licensed 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.
|
||||
|
||||
Sample Application
|
||||
|
||||
Queue/PTP
|
||||
Send and receive using multiple sessions and a temporary queue
|
||||
|
||||
This sample shows the round trip time for a message being sent to the broker
|
||||
and received. A temporary queue is used to guarantee that each instance of this
|
||||
sample receives its own messages only.
|
||||
|
||||
Usage:
|
||||
|
||||
java QueueRoundTrip -b <broker:port> -u <username> -p <password> -n <numTests> -h
|
||||
Optional Parameters:
|
||||
-b broker:port Broker name and port of your message server
|
||||
Default: tcp://localhost:61616
|
||||
-u username Default: user (username required)
|
||||
-p password Default: password (not checked)
|
||||
-n numTests The number of messages to be sent/received
|
||||
Default: 100
|
||||
-h Prints help screen.
|
||||
*/
|
||||
import org.apache.activemq.*;
|
||||
|
||||
|
||||
public class QueueRoundTrip
|
||||
{
|
||||
private static final String DEFAULT_BROKER_NAME = "tcp://localhost:61616";
|
||||
private static final String DEFAULT_PASSWORD = "password";
|
||||
private static final String DEFAULT_USER_NAME = "user";
|
||||
private static final int DEFAULT_NUM_TESTS = 100;
|
||||
|
||||
private static final int msgSize = 1400;
|
||||
private static byte[] msgBody = new byte[msgSize];
|
||||
|
||||
private javax.jms.ConnectionFactory factory = null;
|
||||
private javax.jms.Connection connection = null;
|
||||
private javax.jms.Session sendSession = null;
|
||||
private javax.jms.Session receiveSession = null;
|
||||
private javax.jms.MessageProducer sender = null;
|
||||
private javax.jms.MessageConsumer receiver = null;
|
||||
|
||||
private void QueueRoundTripper(String broker, String username, String password, int numTests){
|
||||
|
||||
try
|
||||
{
|
||||
//Set up two sessions, one for sending and the other for receiving
|
||||
factory = new ActiveMQConnectionFactory(username, password, broker);
|
||||
connection = factory.createConnection(username, password);
|
||||
sendSession = connection.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
|
||||
receiveSession = connection.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
System.err.println ("error: Cannot connect to broker- " + broker + ".\n");
|
||||
jmse.printStackTrace ();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
//Set up a temporary Queue:
|
||||
javax.jms.TemporaryQueue tempQueue = sendSession.createTemporaryQueue();
|
||||
receiver = receiveSession.createConsumer(tempQueue);
|
||||
sender = sendSession.createProducer(tempQueue);
|
||||
connection.start();
|
||||
}
|
||||
catch (javax.jms.JMSException jmse){
|
||||
System.err.println("error: Connection couldn't be started.\n");
|
||||
jmse.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
//Send messages using Temporary Queue:
|
||||
try {
|
||||
System.out.println("QueueRoundTrip application:");
|
||||
System.out.println("===========================");
|
||||
System.out.println("Sending Messages to Temporary Queue...");
|
||||
|
||||
//create a message to send
|
||||
javax.jms.BytesMessage msg = sendSession.createBytesMessage();
|
||||
msg.writeBytes(msgBody);
|
||||
|
||||
//send and receive the message the specified number of times:
|
||||
long time = System.currentTimeMillis();
|
||||
for (int i = 0; i < numTests; i++){
|
||||
sender.send(msg);
|
||||
msg = (javax.jms.BytesMessage)receiver.receive();
|
||||
}
|
||||
time = System.currentTimeMillis()-time;
|
||||
|
||||
System.out.println("\nTime for " + numTests + " sends and receives:\t\t" +
|
||||
time + "ms\n" +
|
||||
"Average Time per message:\t\t\t" + (float)time/(float)numTests + "ms\n");
|
||||
System.out.println("\n\nPress Enter to close this window.");
|
||||
java.io.BufferedReader stdin =
|
||||
new java.io.BufferedReader( new java.io.InputStreamReader( System.in ) );
|
||||
stdin.readLine();
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
catch (javax.jms.JMSException jmse) {
|
||||
System.err.println("error: message not sent/received.\n");
|
||||
jmse.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
catch (java.io.IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/** Cleanup resources and then exit. */
|
||||
private void exit()
|
||||
{
|
||||
try
|
||||
{
|
||||
connection.close();
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
public static void main (String argv[])
|
||||
{
|
||||
// Values to be read from parameters
|
||||
String broker = DEFAULT_BROKER_NAME;
|
||||
String username = DEFAULT_USER_NAME;
|
||||
String password = DEFAULT_PASSWORD;
|
||||
int numTests = DEFAULT_NUM_TESTS;
|
||||
|
||||
// Check parameters
|
||||
if(argv.length > 0){
|
||||
for (int i = 0; i < argv.length; i++) {
|
||||
String arg = argv[i];
|
||||
|
||||
// Options
|
||||
if (!arg.startsWith("-")) {
|
||||
System.err.println ("error: unexpected argument - "+arg);
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
else {
|
||||
if (arg.equals("-b")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing broker name:port");
|
||||
System.exit(1);
|
||||
}
|
||||
broker = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-u")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing user name");
|
||||
System.exit(1);
|
||||
}
|
||||
username = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-p")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing password");
|
||||
System.exit(1);
|
||||
}
|
||||
password = argv[++i];
|
||||
continue;
|
||||
}
|
||||
if (arg.equals("-n")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing number of test to run.");
|
||||
System.exit(1);
|
||||
}
|
||||
numTests = (new Integer(argv[++i])).intValue();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-h")) {
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// create the payload
|
||||
byte charToWrite = (0x30);
|
||||
for (int i = 0; i < msgSize; i++)
|
||||
{
|
||||
msgBody[i] = charToWrite;
|
||||
charToWrite = (byte) ((int) charToWrite + (int) 0x01);
|
||||
if (charToWrite == (0x39))
|
||||
{
|
||||
charToWrite = (0x30);
|
||||
}
|
||||
}
|
||||
|
||||
// Start the JMS client for the test.
|
||||
QueueRoundTrip queueRoundTripper = new QueueRoundTrip();
|
||||
queueRoundTripper.QueueRoundTripper(broker, username, password, numTests);
|
||||
|
||||
}
|
||||
|
||||
private static void printUsage()
|
||||
{
|
||||
StringBuffer use = new StringBuffer();
|
||||
|
||||
use.append("Usage:\n");
|
||||
use.append("java QueueRoundTrip (options)...\n\n");
|
||||
use.append("options:\n");
|
||||
use.append("-b broker:port Broker name and port of your message server\n");
|
||||
use.append(" Default: tcp://localhost:61616\n");
|
||||
use.append("-u username Default: user (username required)\n");
|
||||
use.append("-p password Default: password (not checked)\n");
|
||||
use.append("-n numTests The number of messages to be sent/received\n");
|
||||
use.append(" Default: 100\n");
|
||||
use.append("-h This help screen");
|
||||
System.err.println (use);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,338 @@
|
|||
/*
|
||||
* © 2001-2009, Progress Software Corporation and/or its subsidiaries or affiliates. All rights reserved.
|
||||
*
|
||||
* Licensed 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.
|
||||
|
||||
Sample Application
|
||||
|
||||
Writing a Basic JMS Application with Point-to-Point Queues,
|
||||
using:
|
||||
- Synchronous Request/Reply
|
||||
- javax.jms.QueueRequestor class
|
||||
- JMSReplyTo Header
|
||||
|
||||
When this program runs, it waits for messages on the queue,
|
||||
"SampleQ1" (by default).
|
||||
When that message arrives, a response based on the request
|
||||
is sent back to the "Requestor" specified in the JMSReplyTo header.
|
||||
|
||||
This sample replies with a simple text manipulation of the request;
|
||||
the text is either folded to all UPPERCASE or all lowercase.
|
||||
|
||||
Usage:
|
||||
java Replier -b <broker:port> -u <username> -p <password> -qr <queue> -m <code>
|
||||
-b broker:port points to your message broker
|
||||
Default: tcp://localhost:61616
|
||||
-u username must be unique (but is not checked)
|
||||
Default: SampleReplier
|
||||
-p password password for user (not checked)
|
||||
Default: password
|
||||
-qr queue name of queue for receiving requests
|
||||
Default: Q1
|
||||
-m mode replier mode (uppercase, or lowercase)
|
||||
Default: uppercase
|
||||
|
||||
Suggested demonstration:
|
||||
- In a console window with the environment set,
|
||||
start a copy of the Replier. For example:
|
||||
java Replier -u SampleQReplier
|
||||
- In another console window, start a Requestor.
|
||||
For example:
|
||||
java Requestor -u SampleQRequestor
|
||||
- Enter text in the Requestor window then press Enter.
|
||||
The Replier responds with the message in all uppercase characters.
|
||||
- Start other Requestors with different user names to see that
|
||||
replies are not broadcast to all users. For example:
|
||||
java Requestor -u SampleRequestorFoo
|
||||
|
||||
- Start other Repliers.
|
||||
- See that only one replier is receiving messages,(as it should).
|
||||
- See the Requestor only receives one response.
|
||||
java Replier -u toLower -m lowercase
|
||||
|
||||
*/
|
||||
import org.apache.activemq.*;
|
||||
|
||||
|
||||
public class Replier
|
||||
implements javax.jms.MessageListener
|
||||
{
|
||||
private static final String DEFAULT_BROKER_NAME = "tcp://localhost:61616";
|
||||
private static final String DEFAULT_USER_NAME = "SampleReplier";
|
||||
private static final String DEFAULT_PASSWORD = "password";
|
||||
private static final String DEFAULT_QUEUE = "Q1";
|
||||
private static final String DEFAULT_MODE = "uppercase";
|
||||
private static final int UPPERCASE = 0;
|
||||
private static final int LOWERCASE = 1;
|
||||
|
||||
private javax.jms.Connection connect = null;
|
||||
private javax.jms.Session session = null;
|
||||
private javax.jms.MessageProducer replier = null;
|
||||
|
||||
private int imode = UPPERCASE;
|
||||
|
||||
/** Create JMS client for sending and receiving messages. */
|
||||
private void start ( String broker, String username, String password, String rQueue, String mode)
|
||||
{
|
||||
// Set the operation mode
|
||||
imode = (mode.equals("uppercase")) ? UPPERCASE : LOWERCASE;
|
||||
|
||||
// Create a connection.
|
||||
try
|
||||
{
|
||||
javax.jms.ConnectionFactory factory;
|
||||
factory = new ActiveMQConnectionFactory(username, password, broker);
|
||||
connect = factory.createConnection (username, password);
|
||||
session = connect.createSession(true, javax.jms.Session.AUTO_ACKNOWLEDGE);
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
System.err.println("error: Cannot connect to Broker - " + broker);
|
||||
jmse.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Create Receivers to application queues as well as a Sender
|
||||
// to use for JMS replies.
|
||||
try
|
||||
{
|
||||
javax.jms.Queue queue = session.createQueue (rQueue);
|
||||
javax.jms.MessageConsumer receiver = session.createConsumer(queue);
|
||||
receiver.setMessageListener(this);
|
||||
replier = session.createProducer(null); // Queue will be set for each reply
|
||||
// Now that all setup is complete, start the Connection
|
||||
connect.start();
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
exit();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// Read standard input waiting for "EXIT" command.
|
||||
java.io.BufferedReader stdin =
|
||||
new java.io.BufferedReader( new java.io.InputStreamReader( System.in ) );
|
||||
while ( true )
|
||||
{
|
||||
System.out.println ("\nReplier application:\n"
|
||||
+ "============================\n"
|
||||
+ "The application user " + username + " connects to the broker at " + DEFAULT_BROKER_NAME + ".\n"
|
||||
+ "The application gets requests with JMSReplyTo set on the " + DEFAULT_QUEUE + " queue."
|
||||
+ "The message is transformed to all uppercase or all lowercase, and then returned to the requestor."
|
||||
+ "The Requestor application displays the result.\n\n"
|
||||
+ "Enter EXIT or press Ctrl+C to close the Replier.\n");
|
||||
String s = stdin.readLine();
|
||||
if ( s == null || s.equalsIgnoreCase("EXIT"))
|
||||
{
|
||||
System.out.println ("\nStopping Replier. Please wait..\n>");
|
||||
exit();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch ( java.io.IOException ioe )
|
||||
{
|
||||
ioe.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the message.
|
||||
* (as specified in the javax.jms.MessageListener interface).
|
||||
*
|
||||
* IMPORTANT NOTES:
|
||||
* (1)We must follow the design paradigm for JMS
|
||||
* synchronous requests. That is, we must:
|
||||
* - get the message
|
||||
* - look for the header specifying JMSReplyTo
|
||||
* - send a reply to the queue specified there.
|
||||
* Failing to follow these steps might leave the originator
|
||||
* of the request waiting forever.
|
||||
* (2)Unlike the 'Talk' sample and others using an asynchronous
|
||||
* message listener, it is possible here to use ONLY
|
||||
* ONE SESSION because the messages being sent are sent from
|
||||
* the same thread of control handling message delivery. For
|
||||
* more information see the JMS spec v1.0.2 section 4.4.6.
|
||||
*
|
||||
* OPTIONAL BEHAVIOR: The following actions taken by the
|
||||
* message handler represent good programming style, but are
|
||||
* not required by the design paradigm for JMS requests.
|
||||
* - set the JMSCorrelationID (tying the response back to
|
||||
* the original request.
|
||||
* - use transacted session "commit" so receipt of request
|
||||
* won't happen without the reply being sent.
|
||||
*
|
||||
*/
|
||||
public void onMessage( javax.jms.Message aMessage)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Cast the message as a text message.
|
||||
javax.jms.TextMessage textMessage = (javax.jms.TextMessage) aMessage;
|
||||
|
||||
// This handler reads a single String from the
|
||||
// message and prints it to the standard output.
|
||||
try
|
||||
{
|
||||
String string = textMessage.getText();
|
||||
System.out.println( "[Request] " + string );
|
||||
|
||||
// Check for a ReplyTo Queue
|
||||
javax.jms.Queue replyQueue = (javax.jms.Queue) aMessage.getJMSReplyTo();
|
||||
if (replyQueue != null)
|
||||
{
|
||||
// Send the modified message back.
|
||||
javax.jms.TextMessage reply = session.createTextMessage();
|
||||
if (imode == UPPERCASE)
|
||||
reply.setText("Uppercasing-" + string.toUpperCase());
|
||||
else
|
||||
reply.setText("Lowercasing-" + string.toLowerCase());
|
||||
reply.setJMSCorrelationID(aMessage.getJMSMessageID());
|
||||
replier.send (replyQueue, reply);
|
||||
session.commit();
|
||||
}
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
}
|
||||
catch (java.lang.RuntimeException rte)
|
||||
{
|
||||
rte.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/** Cleanup resources cleanly and exit. */
|
||||
private void exit()
|
||||
{
|
||||
try
|
||||
{
|
||||
connect.close();
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
//
|
||||
// NOTE: the remainder of this sample deals with reading arguments
|
||||
// and does not utilize any JMS classes or code.
|
||||
//
|
||||
|
||||
/** Main program entry point. */
|
||||
public static void main(String argv[]) {
|
||||
|
||||
// Values to be read from parameters
|
||||
String broker = DEFAULT_BROKER_NAME;
|
||||
String username = DEFAULT_USER_NAME;
|
||||
String password = DEFAULT_PASSWORD;
|
||||
String queue = DEFAULT_QUEUE;
|
||||
String mode = DEFAULT_MODE;
|
||||
|
||||
// Check parameters
|
||||
for (int i = 0; i < argv.length; i++) {
|
||||
String arg = argv[i];
|
||||
|
||||
|
||||
if (arg.equals("-b")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing broker name:port");
|
||||
System.exit(1);
|
||||
}
|
||||
broker = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-u")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing user name");
|
||||
System.exit(1);
|
||||
}
|
||||
username = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-p")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing password");
|
||||
System.exit(1);
|
||||
}
|
||||
password = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-qr")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing queue");
|
||||
System.exit(1);
|
||||
}
|
||||
queue = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-m")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing mode");
|
||||
System.exit(1);
|
||||
}
|
||||
mode = argv[++i];
|
||||
if (!(mode.equals("uppercase") || mode.equals("lowercase"))) {
|
||||
System.err.println("error: mode must be 'uppercase' or 'lowercase'");
|
||||
System.exit(1);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-h")) {
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Invalid argument
|
||||
System.err.println ("error: unexpected argument: "+arg);
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Start the JMS client.
|
||||
Replier replier = new Replier ();
|
||||
replier.start (broker, username, password, queue, mode);
|
||||
}
|
||||
|
||||
/** Prints the usage. */
|
||||
private static void printUsage() {
|
||||
|
||||
StringBuffer use = new StringBuffer();
|
||||
use.append("usage: java Replier (options) ...\n\n");
|
||||
use.append("options:\n");
|
||||
use.append(" -b name:port Specify name:port of broker.\n");
|
||||
use.append(" Default broker: "+DEFAULT_BROKER_NAME+"\n");
|
||||
use.append(" -u name Specify unique user name.\n");
|
||||
use.append(" Default broker: "+DEFAULT_USER_NAME+"\n");
|
||||
use.append(" -p password Specify password for user.\n");
|
||||
use.append(" Default password: "+DEFAULT_PASSWORD+"\n");
|
||||
use.append(" -m mode Replier operating mode - uppercase or lowercase.\n");
|
||||
use.append(" Default mode: "+DEFAULT_MODE+"\n");
|
||||
use.append(" -qr queue Specify name of queue for receiving.\n");
|
||||
use.append(" Default queue: "+DEFAULT_QUEUE+"\n");
|
||||
use.append(" -h This help screen.\n");
|
||||
System.err.println (use);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,247 @@
|
|||
/*
|
||||
Copyright 2001-2008, Progress Software Corporation - All Rights Reserved
|
||||
|
||||
Sample Application
|
||||
|
||||
Writing a Basic JMS Application with Point-to-Point Queues,
|
||||
using:
|
||||
- Synchronous Request/Reply
|
||||
- javax.jms.QueueRequestor class
|
||||
- JMSReplyTo Header
|
||||
|
||||
When this program runs, it reads input from System.in
|
||||
and then sends the text as a message to the queue, "Q1"
|
||||
(by default).
|
||||
|
||||
A "Replier" class should be waiting for the request.
|
||||
It will reply with a message.
|
||||
|
||||
NOTE: Unlike the Publish-Subscribe example, you need
|
||||
not run the Replier first. However, this Requestor
|
||||
will block until the Replier is started to service the queue.
|
||||
|
||||
Usage:
|
||||
java Requestor -b <broker:port> -u <username> -p <password> -qs <queue>
|
||||
-b broker:port points to your message broker
|
||||
Default: tcp://localhost:61616
|
||||
-u username must be unique (but is not checked)
|
||||
Default: SampleRequestor
|
||||
-p password password for user (not checked)
|
||||
Default: password
|
||||
-qs queue name of queue for sending requests
|
||||
Default: SampleQ1
|
||||
|
||||
Suggested demonstration:
|
||||
- In a console window with the environment set,
|
||||
start a copy of the Replier. For example:
|
||||
java Replier -u SampleQReplier
|
||||
- In another console window, start a Requestor.
|
||||
For example:
|
||||
java Requestor -u SampleQRequestor
|
||||
- Enter text in the Requestor window then press Enter.
|
||||
The Replier responds with the message in all uppercase characters.
|
||||
- Start other Requestors with different user names to see that
|
||||
replies are not broadcast to all users. For example:
|
||||
java Requestor -u SampleRequestorFoo
|
||||
- Start other Repliers.
|
||||
- See that only one replier is receiving messages,(as it should).
|
||||
- See the Requestor only receives one response.
|
||||
java Replier -u toLower -m lowercase
|
||||
|
||||
*/
|
||||
import org.apache.activemq.*;
|
||||
|
||||
|
||||
public class Requestor
|
||||
{
|
||||
private static final String DEFAULT_BROKER_NAME = "tcp://localhost:61616";
|
||||
private static final String DEFAULT_USER_NAME = "SampleRequestor";
|
||||
private static final String DEFAULT_PASSWORD = "password";
|
||||
private static final String DEFAULT_QUEUE = "Q1";
|
||||
|
||||
private javax.jms.QueueConnection connect = null;
|
||||
private javax.jms.QueueSession session = null;
|
||||
private javax.jms.QueueRequestor requestor = null;
|
||||
|
||||
/** Create JMS client for sending messages. */
|
||||
private void start ( String broker, String username, String password, String sQueue)
|
||||
{
|
||||
// Create a connection.
|
||||
try
|
||||
{
|
||||
javax.jms.QueueConnectionFactory factory;
|
||||
factory = new ActiveMQConnectionFactory(username, password, broker);
|
||||
connect = factory.createQueueConnection (username, password);
|
||||
session = connect.createQueueSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE);
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
System.err.println("error: Cannot connect to Broker - " + broker);
|
||||
jmse.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Create the Queue and QueueRequestor for sending requests.
|
||||
javax.jms.Queue queue = null;
|
||||
try
|
||||
{
|
||||
queue = session.createQueue (sQueue);
|
||||
requestor = new javax.jms.QueueRequestor(session, queue);
|
||||
|
||||
// Now that all setup is complete, start the Connection.
|
||||
connect.start();
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
exit();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// Read all standard input and send it as a message.
|
||||
java.io.BufferedReader stdin =
|
||||
new java.io.BufferedReader( new java.io.InputStreamReader( System.in ) );
|
||||
System.out.println ("\nRequestor application:\n"
|
||||
+ "============================\n"
|
||||
+ "The application user " + username + " connects to the broker at " + DEFAULT_BROKER_NAME + ".\n"
|
||||
+ "The application uses a QueueRequestor to on the " + DEFAULT_QUEUE + " queue."
|
||||
+ "The Replier application gets the message, and transforms it."
|
||||
+ "The Requestor application displays the result.\n\n"
|
||||
+ "Type some mixed case text, and then press Enter to make a request.\n");
|
||||
while ( true )
|
||||
{
|
||||
String s = stdin.readLine();
|
||||
|
||||
if ( s == null )
|
||||
exit();
|
||||
else if ( s.length() > 0 )
|
||||
{
|
||||
javax.jms.TextMessage msg = session.createTextMessage();
|
||||
msg.setText( username + ": " + s );
|
||||
// Instead of sending, we will use the QueueRequestor.
|
||||
javax.jms.Message response = requestor.request(msg);
|
||||
// The message should be a TextMessage. Just report it.
|
||||
javax.jms.TextMessage textMessage = (javax.jms.TextMessage) response;
|
||||
System.out.println( "[Reply] " + textMessage.getText() );
|
||||
}
|
||||
}
|
||||
}
|
||||
catch ( java.io.IOException ioe )
|
||||
{
|
||||
ioe.printStackTrace();
|
||||
}
|
||||
catch ( javax.jms.JMSException jmse )
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/** Cleanup resources cleanly and exit. */
|
||||
private void exit()
|
||||
{
|
||||
try
|
||||
{
|
||||
requestor.close();
|
||||
connect.close();
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
//
|
||||
// NOTE: the remainder of this sample deals with reading arguments
|
||||
// and does not utilize any JMS classes or code.
|
||||
//
|
||||
|
||||
/** Main program entry point. */
|
||||
public static void main(String argv[]) {
|
||||
|
||||
// Values to be read from parameters
|
||||
String broker = DEFAULT_BROKER_NAME;
|
||||
String username = DEFAULT_USER_NAME;
|
||||
String password = DEFAULT_PASSWORD;
|
||||
String queue = DEFAULT_QUEUE;
|
||||
|
||||
// Check parameters
|
||||
for (int i = 0; i < argv.length; i++) {
|
||||
String arg = argv[i];
|
||||
|
||||
|
||||
if (arg.equals("-b")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing broker name:port");
|
||||
System.exit(1);
|
||||
}
|
||||
broker = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-u")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing user name");
|
||||
System.exit(1);
|
||||
}
|
||||
username = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-p")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing password");
|
||||
System.exit(1);
|
||||
}
|
||||
password = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-qs")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing queue");
|
||||
System.exit(1);
|
||||
}
|
||||
queue = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-h")) {
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Invalid argument
|
||||
System.err.println ("error: unexpected argument: "+arg);
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Start the JMS client for sending requests.
|
||||
Requestor requestor = new Requestor();
|
||||
requestor.start (broker, username, password, queue);
|
||||
|
||||
}
|
||||
|
||||
/** Prints the usage. */
|
||||
private static void printUsage() {
|
||||
|
||||
StringBuffer use = new StringBuffer();
|
||||
use.append("usage: java Requestor (options) ...\n\n");
|
||||
use.append("options:\n");
|
||||
use.append(" -b name:port Specify name:port of broker.\n");
|
||||
use.append(" Default broker: "+DEFAULT_BROKER_NAME+"\n");
|
||||
use.append(" -u name Specify unique user name.\n");
|
||||
use.append(" Default broker: "+DEFAULT_USER_NAME+"\n");
|
||||
use.append(" -p password Specify password for user.\n");
|
||||
use.append(" Default password: "+DEFAULT_PASSWORD+"\n");
|
||||
use.append(" -qs queue Specify name of queue for sending.\n");
|
||||
use.append(" Default queue: "+DEFAULT_QUEUE+"\n");
|
||||
use.append(" -h This help screen.\n");
|
||||
System.err.println (use);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,351 @@
|
|||
/*
|
||||
* © 2001-2009, Progress Software Corporation and/or its subsidiaries or affiliates. All rights reserved.
|
||||
*
|
||||
* Licensed 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.
|
||||
|
||||
Sample Application
|
||||
|
||||
Writing a Basic JMS Application using Point-to-Point (Queues) with
|
||||
a Message Selector
|
||||
|
||||
This sample starts up with a username, and the queues you are
|
||||
sending on, and receiving on.
|
||||
|
||||
When messages are sent to a queue a property is set in the message header to
|
||||
a property value supplied on the command line. A separate command line
|
||||
value is used as a message selector for messages in the receive queue. In this
|
||||
sample we choose to create a property named "Department"
|
||||
|
||||
Writing a line and pressing enter will send the message only to the
|
||||
indicated 'Talk' partner (or QueueReceiver).
|
||||
|
||||
Usage:
|
||||
java SelectorTalk -b <broker:port> -u <username> -p <password> -qs <queue> -qr <queue>
|
||||
-s <selection>
|
||||
-b broker:port points to your message broker
|
||||
Default: tcp://localhost:61616
|
||||
-u username must be unique (but is not checked)
|
||||
-p password password for user (not checked)
|
||||
-qr queue name of queue to receive
|
||||
-qs queue name of queue to send
|
||||
-s selector the message selection value
|
||||
|
||||
You must specify either a queue for sending or receiving (or both) as well as
|
||||
a value with which to select received messages.
|
||||
|
||||
|
||||
Suggested demonstration:
|
||||
- In separate console windows with the environment set,
|
||||
start instances of the application under unique user names.
|
||||
For example:
|
||||
java SelectorTalk -u BOB -s SALES -qr Q1 -qs Q2
|
||||
java SelectorTalk -u SALLY -s SALES -qr Q2 -qs Q1
|
||||
- Enter text and then press Enter to send the message.
|
||||
- See messages appear under the user's indicated name.
|
||||
- Try changing the message selector on one console and note that it will
|
||||
no longer receive messages.
|
||||
- Stop a session by pressing CTRL+C in its console window.
|
||||
|
||||
*/
|
||||
import org.apache.activemq.*;
|
||||
|
||||
public class SelectorTalk
|
||||
implements javax.jms.MessageListener
|
||||
{
|
||||
private static final String DEFAULT_BROKER_NAME = "tcp://localhost:61616";
|
||||
private static final String PROPERTY_NAME = "Department";
|
||||
private static final String DEFAULT_PASSWORD = "password";
|
||||
private static final int MESSAGE_LIFESPAN = 1800000; // milliseconds (30 minutes)
|
||||
|
||||
private javax.jms.Connection connect = null;
|
||||
private javax.jms.Session sendSession = null;
|
||||
private javax.jms.Session receiveSession = null;
|
||||
private javax.jms.MessageProducer sender = null;
|
||||
|
||||
/** Create JMS client for sending and receiving messages. */
|
||||
private void talker( String broker, String username, String password, String rQueue, String sQueue, String selection)
|
||||
{
|
||||
// Create a connection.
|
||||
try
|
||||
{
|
||||
javax.jms.ConnectionFactory factory;
|
||||
factory = new ActiveMQConnectionFactory(username, password, broker);
|
||||
connect = factory.createConnection (username, password);
|
||||
sendSession = connect.createSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE);
|
||||
receiveSession = connect.createSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE);
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
System.err.println("error: Cannot connect to Broker - " + broker);
|
||||
jmse.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Create Sender and Receiver 'Talk' queues
|
||||
try
|
||||
{
|
||||
if (sQueue != null)
|
||||
{
|
||||
javax.jms.Queue sendQueue = sendSession.createQueue (sQueue);
|
||||
sender = sendSession.createProducer(sendQueue);
|
||||
}
|
||||
if (rQueue != null)
|
||||
{
|
||||
//NOTE: the Queue Receiver is set up with the Message Selector:
|
||||
javax.jms.Queue receiveQueue = receiveSession.createQueue (rQueue);
|
||||
javax.jms.MessageConsumer qReceiver = receiveSession.createConsumer(receiveQueue, PROPERTY_NAME + " = \'" + selection + "\'");
|
||||
qReceiver.setMessageListener(this);
|
||||
connect.start();
|
||||
}
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
exit();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (rQueue != null)
|
||||
System.out.println ("");
|
||||
else
|
||||
System.out.println ("\nNo receiving queue specified.\n");
|
||||
|
||||
// Read all standard input and send it as a message.
|
||||
java.io.BufferedReader stdin =
|
||||
new java.io.BufferedReader( new java.io.InputStreamReader( System.in ) );
|
||||
if (sQueue != null)
|
||||
System.out.println ("SelectorTalk application:\n"
|
||||
+ "=========================\n"
|
||||
+ "The application user " + username + " connects to the broker at " + DEFAULT_BROKER_NAME + ".\n"
|
||||
+ "The application will send messages with " + PROPERTY_NAME + " set to " + selection + " to the " + sQueue + " queue.\n"
|
||||
+ "The application creates a receiver on the " + rQueue + " queue selecting only messages where " + PROPERTY_NAME + " is " + selection + ".\n\n"
|
||||
|
||||
+ "Type some text, and then press Enter to publish it as a TextMesssage from " + username + ".\n");
|
||||
else
|
||||
System.out.println ("\nPress CTRL-C to exit.\n");
|
||||
|
||||
while ( true )
|
||||
{
|
||||
String s = stdin.readLine();
|
||||
|
||||
if ( s == null )
|
||||
exit();
|
||||
else if ( s.length() > 0 && sQueue != null)
|
||||
{
|
||||
javax.jms.TextMessage msg = sendSession.createTextMessage();
|
||||
msg.setText( username + ": " + s );
|
||||
// NOTE: here we set the property for each sent message.
|
||||
msg.setStringProperty(PROPERTY_NAME, selection);
|
||||
sender.send( msg,
|
||||
javax.jms.DeliveryMode.PERSISTENT,
|
||||
javax.jms.Message.DEFAULT_PRIORITY,
|
||||
MESSAGE_LIFESPAN);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch ( java.io.IOException ioe )
|
||||
{
|
||||
ioe.printStackTrace();
|
||||
}
|
||||
catch ( javax.jms.JMSException jmse )
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
// Close the connection.
|
||||
exit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the message
|
||||
* (as specified in the javax.jms.MessageListener interface).
|
||||
*/
|
||||
public void onMessage( javax.jms.Message aMessage)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Cast the message as a text message.
|
||||
javax.jms.TextMessage textMessage = (javax.jms.TextMessage) aMessage;
|
||||
|
||||
// This handler reads a single String from the
|
||||
// message and prints it to the standard output.
|
||||
try
|
||||
{
|
||||
String string = textMessage.getText();
|
||||
System.out.println( string );
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
}
|
||||
catch (java.lang.RuntimeException rte)
|
||||
{
|
||||
rte.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/** Cleanup resources and then exit. */
|
||||
private void exit()
|
||||
{
|
||||
try
|
||||
{
|
||||
connect.close();
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
//
|
||||
// NOTE: the remainder of this sample deals with reading arguments
|
||||
// and does not utilize any JMS classes or code.
|
||||
//
|
||||
|
||||
/** Main program entry point. */
|
||||
public static void main(String argv[]) {
|
||||
|
||||
// Is there anything to do?
|
||||
if (argv.length == 0) {
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Values to be read from parameters
|
||||
String broker = DEFAULT_BROKER_NAME;
|
||||
String username = null;
|
||||
String password = DEFAULT_PASSWORD;
|
||||
String qSender = null;
|
||||
String qReceiver = null;
|
||||
String selection = null;
|
||||
|
||||
// Check parameters
|
||||
for (int i = 0; i < argv.length; i++) {
|
||||
String arg = argv[i];
|
||||
|
||||
// Options
|
||||
if (!arg.startsWith("-")) {
|
||||
System.err.println ("error: unexpected argument - "+arg);
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
else {
|
||||
if (arg.equals("-b")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing broker name:port");
|
||||
System.exit(1);
|
||||
}
|
||||
broker = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-u")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing user name");
|
||||
System.exit(1);
|
||||
}
|
||||
username = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-p")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing password");
|
||||
System.exit(1);
|
||||
}
|
||||
password = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-qr")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing receive queue parameter");
|
||||
System.exit(1);
|
||||
}
|
||||
qReceiver = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-qs")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing send queue parameter");
|
||||
System.exit(1);
|
||||
}
|
||||
qSender = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-s")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing selectiion");
|
||||
System.exit(1);
|
||||
}
|
||||
selection = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-h")) {
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check values read in.
|
||||
if (username == null) {
|
||||
System.err.println ("error: user name must be supplied");
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
if (qReceiver == null && qSender == null) {
|
||||
System.err.println ("error: receive queue, or send queue, must be supplied");
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
if (selection == null) {
|
||||
System.err.println ("error: selection must be supplied (e.g. -s SALES)\n");
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
|
||||
// Start the JMS client for the "Talk".
|
||||
SelectorTalk talk = new SelectorTalk();
|
||||
talk.talker (broker, username, password, qReceiver, qSender, selection);
|
||||
|
||||
}
|
||||
|
||||
/** Prints the usage. */
|
||||
private static void printUsage() {
|
||||
|
||||
StringBuffer use = new StringBuffer();
|
||||
use.append("usage: java SelectorTalk (options) ...\n\n");
|
||||
use.append("options:\n");
|
||||
use.append(" -b name:port Specify name:port of broker.\n");
|
||||
use.append(" Default broker: "+DEFAULT_BROKER_NAME+"\n");
|
||||
use.append(" -u name Specify unique user name. (Required)\n");
|
||||
use.append(" -p password Specify password for user.\n");
|
||||
use.append(" Default password: "+DEFAULT_PASSWORD+"\n");
|
||||
use.append(" -qr queue Specify queue for receiving messages.\n");
|
||||
use.append(" -qs queue Specify queue for sending messages.\n");
|
||||
use.append(" -s selection required, selection used to receive messages.\n");
|
||||
use.append(" -h This help screen.\n");
|
||||
System.err.println (use);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,332 @@
|
|||
/*
|
||||
* © 2001-2009, Progress Software Corporation and/or its subsidiaries or affiliates. All rights reserved.
|
||||
*
|
||||
* Licensed 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.
|
||||
|
||||
Sample Application
|
||||
|
||||
Writing a Basic JMS Application using Point-to-Point (Queues).
|
||||
This sample starts up with a username, and the queues you are
|
||||
sending on, and receiving on.
|
||||
|
||||
Writing a line and pressing enter will send the message only to the
|
||||
indicated 'Talk' partner (or QueueReceiver).
|
||||
|
||||
Usage:
|
||||
java Talk -b <broker:port> -u <username> -p <password> -qs <queue> -qr <queue>
|
||||
-b broker:port points to your message broker
|
||||
Default: tcp://localhost:61616
|
||||
-u username must be unique (but is not checked)
|
||||
-p password password for user (not checked)
|
||||
-qr queue name of queue to receive
|
||||
-qs queue name of queue to send
|
||||
|
||||
You must specify either a queue for sending or receiving (or both).
|
||||
|
||||
|
||||
Suggested demonstration:
|
||||
- In separate console windows with the environment set,
|
||||
start instances of the application under unique user names.
|
||||
For example:
|
||||
java Talk -b localhost:2506 -u SALES -qr Q1 -qs Q2
|
||||
java Talk -b localhost:2506 -u MARKETTING -qr Q2 -qs Q1
|
||||
- Enter text and then press Enter to send the message.
|
||||
- A message is consumed by only one of the receivers on a queue.
|
||||
- Stop a session by pressing CTRL+C in its console window.
|
||||
|
||||
*/
|
||||
import org.apache.activemq.*;
|
||||
|
||||
|
||||
public class Talk
|
||||
implements javax.jms.MessageListener
|
||||
{
|
||||
private static final String DEFAULT_BROKER_NAME = "tcp://localhost:61616";
|
||||
private static final String DEFAULT_PASSWORD = "password";
|
||||
private static final int MESSAGE_LIFESPAN = 1800000; // milliseconds (30 minutes)
|
||||
|
||||
private javax.jms.Connection connect = null;
|
||||
private javax.jms.Session sendSession = null;
|
||||
private javax.jms.Session receiveSession = null;
|
||||
private javax.jms.MessageProducer sender = null;
|
||||
|
||||
/** Create JMS client for sending and receiving messages. */
|
||||
private void talker( String broker, String username, String password, String rQueue, String sQueue)
|
||||
{
|
||||
// Create a connection.
|
||||
try
|
||||
{
|
||||
javax.jms.ConnectionFactory factory;
|
||||
factory = new ActiveMQConnectionFactory(username, password, broker);
|
||||
connect = factory.createConnection (username, password);
|
||||
sendSession = connect.createSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE);
|
||||
receiveSession = connect.createSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE);
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
System.err.println("error: Cannot connect to Broker - " + broker);
|
||||
jmse.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Create Sender and Receiver 'Talk' queues
|
||||
try
|
||||
{
|
||||
if (sQueue != null)
|
||||
{
|
||||
javax.jms.Queue sendQueue = sendSession.createQueue (sQueue);
|
||||
sender = sendSession.createProducer(sendQueue);
|
||||
}
|
||||
if (rQueue != null)
|
||||
{
|
||||
javax.jms.Queue receiveQueue = receiveSession.createQueue (rQueue);
|
||||
javax.jms.MessageConsumer qReceiver = receiveSession.createConsumer(receiveQueue);
|
||||
qReceiver.setMessageListener(this);
|
||||
// Now that 'receive' setup is complete, start the Connection
|
||||
connect.start();
|
||||
}
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
exit();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (rQueue != null)
|
||||
System.out.println ("");
|
||||
else
|
||||
System.out.println ("\nNo receiving queue specified.\n");
|
||||
|
||||
// Read all standard input and send it as a message.
|
||||
java.io.BufferedReader stdin =
|
||||
new java.io.BufferedReader( new java.io.InputStreamReader( System.in ) );
|
||||
if (sQueue != null)
|
||||
System.out.println ("\nTalk application:\n"
|
||||
+ "=================\n"
|
||||
+ "The application user " + username + " connects to the broker at " + DEFAULT_BROKER_NAME + ".\n"
|
||||
+ "The application will send messages to the " + sQueue + " queue.\n"
|
||||
+ "The application creates a receiver on the " + rQueue + " queue to consume any messages allocated to it.\n\n"
|
||||
+ "Type some text, and then press Enter to send it as a TextMesssage from " + username + ".\n");
|
||||
|
||||
else
|
||||
System.out.println ("\nPress CTRL-C to exit.\n");
|
||||
|
||||
while ( true )
|
||||
{
|
||||
String s = stdin.readLine();
|
||||
|
||||
if ( s == null )
|
||||
exit();
|
||||
else if ( s.length() > 0 && sQueue != null)
|
||||
{
|
||||
javax.jms.TextMessage msg = sendSession.createTextMessage();
|
||||
msg.setText( username + ": " + s );
|
||||
// Queues usually are used for PERSISTENT messages.
|
||||
// Hold messages for 30 minutes (1,800,000 millisecs).
|
||||
sender.send( msg,
|
||||
javax.jms.DeliveryMode.PERSISTENT,
|
||||
javax.jms.Message.DEFAULT_PRIORITY,
|
||||
MESSAGE_LIFESPAN);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch ( java.io.IOException ioe )
|
||||
{
|
||||
ioe.printStackTrace();
|
||||
}
|
||||
catch ( javax.jms.JMSException jmse )
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
// Close the connection.
|
||||
exit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the message
|
||||
* (as specified in the javax.jms.MessageListener interface).
|
||||
*/
|
||||
public void onMessage( javax.jms.Message aMessage)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Cast the message as a text message.
|
||||
// Otherwise report that invalid message arrived.
|
||||
if (aMessage instanceof javax.jms.TextMessage)
|
||||
{
|
||||
javax.jms.TextMessage textMessage = (javax.jms.TextMessage) aMessage;
|
||||
|
||||
// This handler reads a single String from the
|
||||
// message and prints it to the standard output.
|
||||
try
|
||||
{
|
||||
String string = textMessage.getText();
|
||||
System.out.println( string );
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
System.out.println ("Warning: A message was discarded because it could not be processed " +
|
||||
"as a javax.jms.TextMessage.");
|
||||
}
|
||||
|
||||
}
|
||||
catch (java.lang.RuntimeException rte)
|
||||
{
|
||||
rte.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/** Cleanup resources and then exit. */
|
||||
private void exit()
|
||||
{
|
||||
try
|
||||
{
|
||||
connect.close();
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
//
|
||||
// NOTE: the remainder of this sample deals with reading arguments
|
||||
// and does not utilize any JMS classes or code.
|
||||
//
|
||||
|
||||
/** Main program entry point. */
|
||||
public static void main(String argv[]) {
|
||||
|
||||
// Is there anything to do?
|
||||
if (argv.length == 0) {
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Values to be read from parameters
|
||||
String broker = DEFAULT_BROKER_NAME;
|
||||
String username = null;
|
||||
String password = DEFAULT_PASSWORD;
|
||||
String qSender = null;
|
||||
String qReceiver = null;
|
||||
|
||||
// Check parameters
|
||||
for (int i = 0; i < argv.length; i++) {
|
||||
String arg = argv[i];
|
||||
|
||||
// Options
|
||||
if (!arg.startsWith("-")) {
|
||||
System.err.println ("error: unexpected argument - "+arg);
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
else {
|
||||
if (arg.equals("-b")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing broker name:port");
|
||||
System.exit(1);
|
||||
}
|
||||
broker = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-u")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing user name");
|
||||
System.exit(1);
|
||||
}
|
||||
username = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-p")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing password");
|
||||
System.exit(1);
|
||||
}
|
||||
password = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-qr")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing receive queue parameter");
|
||||
System.exit(1);
|
||||
}
|
||||
qReceiver = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-qs")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing send queue parameter");
|
||||
System.exit(1);
|
||||
}
|
||||
qSender = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (arg.equals("-h")) {
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check values read in.
|
||||
if (username == null) {
|
||||
System.err.println ("error: user name must be supplied");
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
if (qReceiver == null && qSender == null) {
|
||||
System.err.println ("error: receive queue, or send queue, must be supplied");
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Start the JMS client for the "Talk".
|
||||
Talk talk = new Talk();
|
||||
talk.talker (broker, username, password, qReceiver, qSender);
|
||||
|
||||
}
|
||||
|
||||
/** Prints the usage. */
|
||||
private static void printUsage() {
|
||||
|
||||
StringBuffer use = new StringBuffer();
|
||||
use.append("usage: java Talk (options) ...\n\n");
|
||||
use.append("options:\n");
|
||||
use.append(" -b name:port Specify name:port of broker.\n");
|
||||
use.append(" Default broker: "+DEFAULT_BROKER_NAME+"\n");
|
||||
use.append(" -u name Specify unique user name. (Required)\n");
|
||||
use.append(" -p password Specify password for user.\n");
|
||||
use.append(" Default password: "+DEFAULT_PASSWORD+"\n");
|
||||
use.append(" -qr queue Specify queue for receiving messages.\n");
|
||||
use.append(" -qs queue Specify queue for sending messages.\n");
|
||||
use.append(" -h This help screen.\n");
|
||||
System.err.println (use);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,360 @@
|
|||
/*
|
||||
* © 2001-2009, Progress Software Corporation and/or its subsidiaries or affiliates. All rights reserved.
|
||||
*
|
||||
* Licensed 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.
|
||||
|
||||
Sample Application
|
||||
|
||||
Writing a Basic JMS Application with Point-to-Point Queues,
|
||||
using:
|
||||
- Send and Receive
|
||||
- Transacted Sessions
|
||||
- Multiple Sessions
|
||||
|
||||
This sample starts up with a username, and the queues you are
|
||||
sending on, and receiving on.
|
||||
|
||||
Continue writing lines and pressing enter to buffer messages until a
|
||||
specific key word is used to confirm the messages or to completely
|
||||
forget them.
|
||||
|
||||
Messages are buffered and sent when a specific string is seen ("COMMIT").
|
||||
Messages buffered can be discarded by entering a specified string ("CANCEL").
|
||||
|
||||
Usage:
|
||||
java TransactedTalk -b <broker:port> -u <username> -p <password> -qs <queue> -qr <queue>
|
||||
-b broker:port points to your message broker
|
||||
Default: tcp://localhost:61616
|
||||
-u username must be unique (but is not checked)
|
||||
-p password password for user (not checked)
|
||||
-qr queue name of queue to receive
|
||||
-qs queue name of queue to send
|
||||
|
||||
You must specify either a queue for sending or receiving (or both).
|
||||
|
||||
Suggested demonstration:
|
||||
- In separate console windows with the environment set,
|
||||
start instances of the application under unique user names.
|
||||
For example:
|
||||
java TransactedTalk -u OPERATIONS -qr Q1 -qs Q2
|
||||
java TransactedTalk -u FACILITIES -qr Q2 -qs Q1
|
||||
- Type some text and then press Enter.
|
||||
- Repeat to create a batch of messages.
|
||||
- Send the batched messages by entering the text "COMMIT"
|
||||
- Discard the batched messages by entering the text "CANCEL"
|
||||
- Stop a session by pressing CTRL+C in its console window.
|
||||
|
||||
*/
|
||||
|
||||
import org.apache.activemq.*;
|
||||
|
||||
public class TransactedTalk
|
||||
implements javax.jms.MessageListener
|
||||
{
|
||||
private static final String DEFAULT_BROKER_NAME = "tcp://localhost:61616";
|
||||
private static final String DEFAULT_PASSWORD = "password";
|
||||
private static final int MESSAGE_LIFESPAN = 1800000; // milliseconds (30 minutes)
|
||||
|
||||
private javax.jms.Connection connect = null;
|
||||
private javax.jms.Session sendSession = null;
|
||||
private javax.jms.Session receiveSession = null;
|
||||
private javax.jms.MessageProducer sender = null;
|
||||
|
||||
|
||||
|
||||
|
||||
/** Create JMS client for sending and receiving messages. */
|
||||
private void talker( String broker, String username, String password, String rQueue, String sQueue)
|
||||
{
|
||||
// Create a connection.
|
||||
try
|
||||
{
|
||||
javax.jms.ConnectionFactory factory;
|
||||
factory = new ActiveMQConnectionFactory(username, password, broker);
|
||||
connect = factory.createConnection (username, password);
|
||||
// We want to be able up commit/rollback messages sent,
|
||||
// but not affect messages received. Therefore, we need two sessions.
|
||||
sendSession = connect.createSession(true,javax.jms.Session.AUTO_ACKNOWLEDGE);
|
||||
receiveSession = connect.createSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE);
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
System.err.println("error: Cannot connect to Broker - " + broker);
|
||||
jmse.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Create Sender and Receiver 'Talk' queues
|
||||
try
|
||||
{
|
||||
if (sQueue != null)
|
||||
{
|
||||
javax.jms.Queue sendQueue = sendSession.createQueue (sQueue);
|
||||
sender = sendSession.createProducer(sendQueue);
|
||||
}
|
||||
if (rQueue != null)
|
||||
{
|
||||
javax.jms.Queue receiveQueue = receiveSession.createQueue (rQueue);
|
||||
javax.jms.MessageConsumer qReceiver = receiveSession.createConsumer(receiveQueue);
|
||||
qReceiver.setMessageListener(this);
|
||||
// Now that 'receive' setup is complete, start the Connection
|
||||
connect.start();
|
||||
}
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
exit();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (rQueue != null)
|
||||
System.out.println ("");
|
||||
else
|
||||
System.out.println ("\nNo receiving queue specified.\n");
|
||||
|
||||
// Read all standard input and send it as a message.
|
||||
java.io.BufferedReader stdin =
|
||||
new java.io.BufferedReader( new java.io.InputStreamReader( System.in ) );
|
||||
|
||||
if (sQueue != null){
|
||||
System.out.println ("TransactedTalk application:");
|
||||
System.out.println ("===========================" );
|
||||
System.out.println ("The application user " + username + " connects to the broker at " + DEFAULT_BROKER_NAME + ".");
|
||||
System.out.println ("The application will stage messages to " + sQueue + " until you either commit them or roll them back.");
|
||||
System.out.println ("The application receives messages on " + rQueue + " to consume any committed messages sent there.\n");
|
||||
System.out.println ("1. Enter text to send and then press Enter to stage the message.");
|
||||
System.out.println ("2. Add a few messages to the transaction batch.");
|
||||
System.out.println ("3. Then, either:");
|
||||
System.out.println (" o Enter the text 'COMMIT', and press Enter to send all the staged messages.");
|
||||
System.out.println (" o Enter the text 'CANCEL', and press Enter to drop the staged messages waiting to be sent.");
|
||||
}
|
||||
else
|
||||
System.out.println ("\nPress CTRL-C to exit.\n");
|
||||
|
||||
while ( true )
|
||||
{
|
||||
String s = stdin.readLine();
|
||||
|
||||
if ( s == null )
|
||||
exit();
|
||||
else if (s.trim().equals("CANCEL"))
|
||||
{
|
||||
// Rollback the messages. A new transaction is implicitly
|
||||
// started for following messages.
|
||||
System.out.print ("Cancelling messages...");
|
||||
sendSession.rollback();
|
||||
System.out.println ("Staged messages have been cleared.");
|
||||
}
|
||||
else if ( s.length() > 0 && sQueue != null)
|
||||
{
|
||||
javax.jms.TextMessage msg = sendSession.createTextMessage();
|
||||
msg.setText( username + ": " + s );
|
||||
// Queues usually are used for PERSISTENT messages.
|
||||
// Hold messages for 30 minutes (1,800,000 millisecs).
|
||||
sender.send( msg,
|
||||
javax.jms.DeliveryMode.PERSISTENT,
|
||||
javax.jms.Message.DEFAULT_PRIORITY,
|
||||
MESSAGE_LIFESPAN);
|
||||
// See if we should send the messages
|
||||
if (s.trim().equals("COMMIT"))
|
||||
{
|
||||
// Commit (send) the messages. A new transaction is
|
||||
// implicitly started for following messages.
|
||||
System.out.print ("Committing messages...");
|
||||
sendSession.commit();
|
||||
System.out.println ("Staged messages have all been sent.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch ( java.io.IOException ioe )
|
||||
{
|
||||
ioe.printStackTrace();
|
||||
}
|
||||
catch ( javax.jms.JMSException jmse )
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
// Close the connection.
|
||||
exit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the message
|
||||
* (as specified in the javax.jms.MessageListener interface).
|
||||
*/
|
||||
public void onMessage( javax.jms.Message aMessage)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Cast the message as a text message.
|
||||
javax.jms.TextMessage textMessage = (javax.jms.TextMessage) aMessage;
|
||||
|
||||
// This handler reads a single String from the
|
||||
// message and prints it to the standard output.
|
||||
try
|
||||
{
|
||||
String string = textMessage.getText();
|
||||
System.out.println( string );
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
}
|
||||
catch (java.lang.RuntimeException rte)
|
||||
{
|
||||
rte.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/** Cleanup resources and then exit. */
|
||||
private void exit()
|
||||
{
|
||||
try
|
||||
{
|
||||
sendSession.rollback(); // Rollback any uncommitted messages.
|
||||
connect.close();
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
//
|
||||
// NOTE: the remainder of this sample deals with reading arguments
|
||||
// and does not utilize any JMS classes or code.
|
||||
//
|
||||
|
||||
/** Main program entry point. */
|
||||
public static void main(String argv[]) {
|
||||
|
||||
// Is there anything to do?
|
||||
if (argv.length == 0) {
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Values to be read from parameters
|
||||
String broker = DEFAULT_BROKER_NAME;
|
||||
String username = null;
|
||||
String password = DEFAULT_PASSWORD;
|
||||
String qSender = null;
|
||||
String qReceiver = null;
|
||||
|
||||
// Check parameters
|
||||
for (int i = 0; i < argv.length; i++) {
|
||||
String arg = argv[i];
|
||||
|
||||
// Options
|
||||
if (!arg.startsWith("-")) {
|
||||
System.err.println ("error: unexpected argument - "+arg);
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
else {
|
||||
if (arg.equals("-b")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing broker name:port");
|
||||
System.exit(1);
|
||||
}
|
||||
broker = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-u")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing user name");
|
||||
System.exit(1);
|
||||
}
|
||||
username = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-p")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing password");
|
||||
System.exit(1);
|
||||
}
|
||||
password = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-qr")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing receive queue parameter");
|
||||
System.exit(1);
|
||||
}
|
||||
qReceiver = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-qs")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing send queue parameter");
|
||||
System.exit(1);
|
||||
}
|
||||
qSender = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (arg.equals("-h")) {
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check values read in.
|
||||
if (username == null) {
|
||||
System.err.println ("error: user name must be supplied");
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
if (qReceiver == null && qSender == null) {
|
||||
System.err.println ("error: receive queue, or send queue, must be supplied");
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Start the JMS client for the "Talk".
|
||||
TransactedTalk tranTalk = new TransactedTalk();
|
||||
tranTalk.talker (broker, username, password, qReceiver, qSender);
|
||||
|
||||
}
|
||||
|
||||
/** Prints the usage. */
|
||||
private static void printUsage() {
|
||||
|
||||
StringBuffer use = new StringBuffer();
|
||||
use.append("usage: java TransactedTalk (options) ...\n\n");
|
||||
use.append("options:\n");
|
||||
use.append(" -b name:port Specify name:port of broker.\n");
|
||||
use.append(" Default broker: "+DEFAULT_BROKER_NAME+"\n");
|
||||
use.append(" -u name Specify unique user name. (Required)\n");
|
||||
use.append(" -p password Specify password for user.\n");
|
||||
use.append(" Default password: "+DEFAULT_PASSWORD+"\n");
|
||||
use.append(" -qr queue Specify queue for receiving messages.\n");
|
||||
use.append(" -qs queue Specify queue for sending messages.\n");
|
||||
use.append(" -h This help screen.\n");
|
||||
System.err.println (use);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,262 @@
|
|||
/*
|
||||
* © 2001-2009, Progress Software Corporation and/or its subsidiaries or affiliates. All rights reserved.
|
||||
*
|
||||
* Licensed 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.
|
||||
|
||||
Sample Application
|
||||
|
||||
Writing a Basic JMS Application using Publish and Subscribe
|
||||
|
||||
This sample publishes and subscribes to a specified topic.
|
||||
Text you enter is published and then received by all subscribers.
|
||||
|
||||
Usage:
|
||||
java Chat -b <broker:port> -u <username> -p <password>
|
||||
-b broker:port points to your message broker
|
||||
Default: tcp://localhost:61616
|
||||
-u username must be unique (but is not checked)
|
||||
-p password password for user (not checked)
|
||||
|
||||
Suggested demonstration:
|
||||
- In separate console windows with the environment set,
|
||||
start instances of the application
|
||||
under unique user names.
|
||||
For example:
|
||||
java Chat -b tcp://localhost:61616 -u SALES
|
||||
java Chat -b tcp://localhost:61616 -u MARKETING
|
||||
- Enter text and then press Enter to publish the message.
|
||||
- See messages appear under the various user names as you
|
||||
enter messages in each console window.
|
||||
- Stop a session by pressing CTRL+C in its console window.
|
||||
|
||||
*/
|
||||
import org.apache.activemq.*;
|
||||
|
||||
public class Chat
|
||||
implements javax.jms.MessageListener
|
||||
{
|
||||
private static final String APP_TOPIC = "jms.samples.chat";
|
||||
private static final String DEFAULT_USER = "Chatter";
|
||||
private static final String DEFAULT_BROKER_NAME = "tcp://localhost:61616";
|
||||
private static final String DEFAULT_PASSWORD = "password";
|
||||
|
||||
private javax.jms.Connection connect = null;
|
||||
private javax.jms.Session pubSession = null;
|
||||
private javax.jms.Session subSession = null;
|
||||
private javax.jms.MessageProducer publisher = null;
|
||||
|
||||
/** Create JMS client for publishing and subscribing to messages. */
|
||||
private void chatter( String broker, String username, String password)
|
||||
{
|
||||
// Create a connection.
|
||||
try
|
||||
{
|
||||
javax.jms.ConnectionFactory factory;
|
||||
factory = new ActiveMQConnectionFactory(username, password, broker);
|
||||
connect = factory.createConnection (username, password);
|
||||
pubSession = connect.createSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE);
|
||||
subSession = connect.createSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE);
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
System.err.println("error: Cannot connect to Broker - " + broker);
|
||||
jmse.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Create Publisher and Subscriber to 'chat' topics
|
||||
try
|
||||
{
|
||||
javax.jms.Topic topic = pubSession.createTopic (APP_TOPIC);
|
||||
javax.jms.MessageConsumer subscriber = subSession.createConsumer(topic);
|
||||
subscriber.setMessageListener(this);
|
||||
publisher = pubSession.createProducer(topic);
|
||||
// Now that setup is complete, start the Connection
|
||||
connect.start();
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// Read all standard input and send it as a message.
|
||||
java.io.BufferedReader stdin =
|
||||
new java.io.BufferedReader( new java.io.InputStreamReader( System.in ) );
|
||||
System.out.println ("\nChat application:\n"
|
||||
+ "=================\n"
|
||||
+ "The application user " + username + " connects to the broker at " + DEFAULT_BROKER_NAME + ".\n"
|
||||
+ "The application will publish messages to the " + APP_TOPIC + " topic.\n"
|
||||
+ "The application also subscribes to that topic to consume any messages published there.\n\n"
|
||||
+ "Type some text, and then press Enter to publish it as a TextMesssage from " + username + ".\n");
|
||||
while ( true )
|
||||
{
|
||||
String s = stdin.readLine();
|
||||
|
||||
if ( s == null )
|
||||
exit();
|
||||
else if ( s.length() > 0 )
|
||||
{
|
||||
javax.jms.TextMessage msg = pubSession.createTextMessage();
|
||||
msg.setText( username + ": " + s );
|
||||
publisher.send( msg );
|
||||
}
|
||||
}
|
||||
}
|
||||
catch ( java.io.IOException ioe )
|
||||
{
|
||||
ioe.printStackTrace();
|
||||
}
|
||||
catch ( javax.jms.JMSException jmse )
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the message
|
||||
* (as specified in the javax.jms.MessageListener interface).
|
||||
*/
|
||||
public void onMessage( javax.jms.Message aMessage)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Cast the message as a text message.
|
||||
javax.jms.TextMessage textMessage = (javax.jms.TextMessage) aMessage;
|
||||
|
||||
// This handler reads a single String from the
|
||||
// message and prints it to the standard output.
|
||||
try
|
||||
{
|
||||
String string = textMessage.getText();
|
||||
System.out.println( string );
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
}
|
||||
catch (java.lang.RuntimeException rte)
|
||||
{
|
||||
rte.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/** Cleanup resources and then exit. */
|
||||
private void exit()
|
||||
{
|
||||
try
|
||||
{
|
||||
connect.close();
|
||||
}
|
||||
catch (javax.jms.JMSException jmse)
|
||||
{
|
||||
jmse.printStackTrace();
|
||||
}
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
//
|
||||
// NOTE: the remainder of this sample deals with reading arguments
|
||||
// and does not utilize any JMS classes or code.
|
||||
//
|
||||
|
||||
/** Main program entry point. */
|
||||
public static void main(String argv[]) {
|
||||
|
||||
// Is there anything to do?
|
||||
if (argv.length == 0) {
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Values to be read from parameters
|
||||
String broker = DEFAULT_BROKER_NAME;
|
||||
String username = null;
|
||||
String password = DEFAULT_PASSWORD;
|
||||
|
||||
// Check parameters
|
||||
for (int i = 0; i < argv.length; i++) {
|
||||
String arg = argv[i];
|
||||
|
||||
|
||||
if (arg.equals("-b")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing broker name:port");
|
||||
System.exit(1);
|
||||
}
|
||||
broker = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-u")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing user name");
|
||||
System.exit(1);
|
||||
}
|
||||
username = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-p")) {
|
||||
if (i == argv.length - 1 || argv[i+1].startsWith("-")) {
|
||||
System.err.println("error: missing password");
|
||||
System.exit(1);
|
||||
}
|
||||
password = argv[++i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (arg.equals("-h")) {
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Invalid argument
|
||||
System.err.println ("error: unexpected argument: "+arg);
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Check values read in.
|
||||
if (username == null) {
|
||||
System.err.println ("error: user name must be supplied");
|
||||
printUsage();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
// Start the JMS client for the "chat".
|
||||
Chat chat = new Chat();
|
||||
chat.chatter (broker, username, password);
|
||||
|
||||
}
|
||||
|
||||
/** Prints the usage. */
|
||||
private static void printUsage() {
|
||||
|
||||
StringBuffer use = new StringBuffer();
|
||||
use.append("usage: java Chat (options) ...\n\n");
|
||||
use.append("options:\n");
|
||||
use.append(" -b name:port Specify name:port of broker.\n");
|
||||
use.append(" Default broker: "+DEFAULT_BROKER_NAME+"\n");
|
||||
use.append(" -u name Specify unique user name. (Required)\n");
|
||||
use.append(" -p password Specify password for user.\n");
|
||||
use.append(" Default password: "+DEFAULT_PASSWORD+"\n");
|
||||
use.append(" -h This help screen.\n");
|
||||
System.err.println (use);
|
||||
}
|
||||
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue