环境:OPENJMS0.7.7 mysql5.1
一,首先下载openjms的server包:
下载地址:http://prdownloads.sourceforge.net/openjms/openjms-0.7.7-beta-1.zip
二,下载mysql5.1
下载地址:http://dev.mysql.com/downloads/mysql/5.1.html
三,配置openjms的env。具体可参看官网:
http://openjms.sourceforge.net/adminguide/install.html
1,首先配置openjms的home变量:
set OPENJMS_HOME = openjms-0.7.7-beta-1.zip的解压目录
2,安装mysql5.1
3,命令行登录mysql,创建数据库opejms
create database openjms;
初始化数据库表:
use openjms;
source %OPENJMS_HOME%/db/sql/create_mysql.sql
4,下载mysql的jdbc驱动mysql-connector-java-5.1.*-bin.jar
http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.10.zip/from/pick
5,将mysql驱动放入openjms的lib目录或是修改%OPENJMS_HOME%/bin/setenv.bat
rem Configure the JDBC driver rem set CLASSPATH=F:/classpath/mysql/mysql-connector-java-5.1.8-bin.jar
配置openjms的数据库配置:config/openjms.xml
修改如下:
<DatabaseConfiguration> <RdbmsDatabaseConfiguration driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/jms" user="username" password="password"/> </DatabaseConfiguration>
到此openjms就可以正常运行了
四,启动openjm
启动OPENJMS使用bin目录下的admin.bat
启动出图形界面后点击Action--Start OpenJMS
如果启动异常的话 bin/openjms.log查看详细信息。
启动完成后看到
启动图形化监控界面Action - Connection - Online
默认的用户名密码为:admin/openjms (config/openjms.xml中配置)
好现在示例程序已经创建了3个消息队列(点对点消息)一个广播(topic)
执行examples/basic/build.bat编译示例程序
运行examples/basic/Sender.java
参数一代表queuename 参数二代表发送的消息条数 我们先给queue1发送20条信息
执行run.bat Sender
执行成功后在看图形监控界面如下:
当前queue1 队列中的消息条数已经是20条了
运行Receiver类 来接收5条信息
运行成功后发现监控界面中queue1中的消息已经只有15条了。留着下次登录在取吧:)
这样就完成了我们点对点通信的测试了 很简单吧 在看示例代码同样的很简单
我看了代码没有看到广播发送消息的类 只有接收消息的类 于是乎还是自己写一个吧
import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
/*
*author:a276202460
*Create Date:2009-11-26
*
*/
public class TopicPublish {
public static void main(String[] s){
Context context = null;
TopicConnectionFactory factory = null;
TopicConnection conn = null;
String factoryname = "ConnectionFactory";
String topicname = "topic1";
Topic topic = null;
TopicPublisher topicpublisher = null;
int count = 10;
String message = "publishmessage";
TopicSession session = null;
try{
context = new InitialContext();
factory = (TopicConnectionFactory)context.lookup(factoryname);
topic = (Topic)context.lookup(topicname);
conn = factory.createTopicConnection();
session = conn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
topicpublisher = session.createPublisher(topic);
for(int i = 0 ;i < count;i++){
TextMessage tmessage = session.createTextMessage();
tmessage.setText(message+i);
topicpublisher.publish(tmessage);
System.out.println(tmessage.getText());
}
} catch (NamingException e) {
e.printStackTrace();
} catch (JMSException e) {
e.printStackTrace();
}finally{
try {
session.close();
} catch (JMSException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (JMSException e) {
e.printStackTrace();
}
try {
context.close();
} catch (NamingException e) {
e.printStackTrace();
}
}
}
}
完成后运行TopicPublish类 发送10条广播信息,当前广播接收节点中只有sub1和sub2两个成员,两个成员均可接收发送的这10条广播信息
运行DurableSubscriber类 看看效果吧:
注意此类源代码中的节点定义:
String subscriptionName = "rubADubSub";
这里应该改为sub1或是sub2 或是直接在图形界面添加一个节点名字命名为rubADubSub 当然一定要在topic1下。
我在源代码中改成了sub1,重新执行build.bat编译class 运行结果如下:
当然发送和接收的类运行关系可以反过来,以你为示例代码中接收消息用的是reveive如果当前队列中没有消息会一直等待。
可以改成receiveNoWait试试。