经历JMS编程

转载 2012年03月29日 21:54:12

http://life-trace.blog.sohu.com/66841260.html


本文是我借鉴网友的资料,通过自己的摸索、实践而得到,文中应用了网友的部分内容,因为打字实在太累了,呵呵。

<!--[if !supportEmptyParas]--> <!--[endif]-->

一、实践的环境

XP SP2

weblogicserver811_win32.exe

java_ee_sdk-5_02-windows-nojdk.exe

jdk-1_5_0_06-windows-i586-p.exe

<!--[if !supportEmptyParas]--> <!--[endif]-->

二、软件的安装

1)XP的安装相信大家都会了,这里就不说了;

2)Weblogic: 首先去www.bea.com下载相应的版本,双击可执行文件进行安装,只要根据向导安装基本就问题不大,默认控制台端口号是7001,那么当我们安装完后,首先配置server domain,可以从QuickStart或者configration wizard中进行配置,配置的时候要记录下你自己设置的一下配置信息,如用户名,密码等,到时进入WEBLOGIC 控制台时要用到,配置完之后从开始->所有程序->bea weblogic platform8.1->user projects->domain_name->start server启动服务器,运行浏览器,在地址栏中输入:http://127.0.0.1:7001/console进入weblogic 控制台,能开到控制台信息,说明安装配置成功。

3)j2eesdk:

首先去www.sun.com下载j2eesdk相应版本,双击可执行程序进行安装,按照向导即可完成,这里省略。

4)jdk

这个学习了JAVA的应该熟悉吧,省略

<!--[if !supportEmptyParas]--> <!--[endif]-->

【注意:要在安装J2EESDK之前安装jdk】

<!--[if !supportEmptyParas]--> <!--[endif]-->

三、环境变量

这里假如读者已经配置好Java的环境变量,在J2EE环境变量配置之前,我们要讲讲几个相应的包,第一个是jms.jar,这个包可以在你J2EESDK安装目录下的imq\lib下),将这个包COPY到JDK的lib文件夹下(当然你可以不拷贝过去,可以直接在CLASSPATH中加入这个包的路径也可以,这里假如拷贝过去),第二个weblogic.jar,这个包可以在%weblogic_root%/weblogic81/server/lib/中找到,这里我们直接在CLASSPATH中假如这个包路径,而不拷贝到JDK的lib文件夹下,我的环境变量为:

<!--[if !supportEmptyParas]--> <!--[endif]-->

在原有CLASSPATH中添加F:\jdk1.5\lib\jms.jar;.;F:\bea\weblogic81\server\lib\weblogic.jar进去,同时PATH中添加F:\J2EE\bin; ,新建一个J2EE_HOME,值为F:\J2EE,

<!--[if !supportEmptyParas]--> <!--[endif]-->

【注意:如果你的安装目录与我的不同,请相应修改】

<!--[if !supportEmptyParas]--> <!--[endif]-->

四、配置JMS
1. 创建连接工厂
(1) 启动WebLogic Server8.1,登录控制台,选中JMS Connection Factories节点,点击右边的" Configure a new JMS Connection Factory...";

(2) 填写连接工厂的名称SendJMSFactory和JNDI名称SendJMSFactory,点击"Create";

(3) 勾上"myserver",将SendJMSFactory应用到myserver;

2. 定义后备存储
(1) 选中JMS Stores节点,点击右边的" Configure a new JMS Connection Factory...";

(2) 填写文件后备存储的名称SendFileStore和目录Directionary E:\BEA\user_projects\domains\mydomain\sendfilestore,点击"Create".

3. 创建JMS服务器
(1) 选中JMS Servers节点,点击右边的" Configure a new JMSServer...";

(2) 填写JMS服务器的名称SendJMSServer和Paging Store设为" SendFileStore",点击"Create";

(3) Target选中"myserver",将SendJMSServer应用到myserver.

4. 创建消息队列
(1) 展开"SendJMSServer"节点,点击" Configure a new JMS Queue...";

(2) 填写消息队列的名称SendJMSQueue和JNDI名称SendJMSQueue,点击"Create";

<!--[endif]-->

. JMS应用程序
一个 JMS 应用程序由下列元素组成:
· JMS 客户机。 用 JMS API 发送和接收消息的 Java 程序。
· 非 JMS(Non-JMS)客户机。 认识到这一点很重要 - 旧的程序经常成为整个 JMS 应用程序的一部分,而且它们的包含应该在设计时预先考虑。
· 消息。 在 JMS 和非 JMS 客户机之间交换的消息的格式和内容是 JMS 应用程序设计所必须考虑的部分。
· JMS 供应商。供应商必须提供特定于其 MOM 产品的具体的实现。
· 受管对象。 消息传递系统供应商的管理员创建了一个对象,它独立于供应商专有的技术。
包括连接工厂ConnectionFactory和目的Destination。
一种典型的 JMS 程序需要经过下列步骤才能开始消息产生和使用:
· 通过 JNDI 查找 ConnectionFactory。
· 通过 JNDI 查找一个或多个 Destination。
· 用 ConnectionFactory 创建一个 Connection。
· 用 Connection 创建一个或多个 Session。
· 用 Session 和 Destination 创建所需的 MessageProducer 和 MessageConsumer。
· 启动 Connection。
下面利用上面配置的JMS资源演示点对点消息发送和接收的过程。

五. 设计消息发送端
1. 使用的JMS资源
服务器URL: t3://localhost:7001

 //注意:weblogic使用t3协议,weblogic我本人使用默认端口7001,如果你使用的是其他端口,那么修改成你使用的端口号,如果你的WEBLOGIC没有安装在本机,那么将localhost改成相应的IP地址即可
连接工厂: SendJMSFactory
队列: SendJMSQueue
2. 设计步骤
· 初始化JNDI Tree
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, PROVIDER_URL);
return new InitialContext(env);
· lookup ConnectionFactory
qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
· lookup Destination
queue = (Queue) ctx.lookup(queueName);
· 用 ConnectionFactory 创建Connection
qcon = qconFactory.createQueueConnection();
· 用 Connection 创建一个Session
qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
· 用 Session 和 Destination 创建MessageProducer
qsender = qsession.createSender(queue);
· 启动 Connection。
qcon.start();
· 发送消息
msg = qsession.createTextMessage();
msg.setText(message);
qsender.send(msg);
3. 源代码
package jmssample;

import java.util.Hashtable;
import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/** This example shows how to establish a connection
* and send messages to the JMS queue. The classes in this
* package operate on the same JMS queue. Run the classes together to
* witness messages being sent and received, and to browse the queue
* for messages. The class is used to send messages to the queue.
*
* @author Copyright (c) 1999-2003 by BEA Systems, Inc. All Rights Reserved.
*/
public class QueueSend
{
// Defines the JNDI context factory.
public final static String JNDI_FACTORY="weblogic.jndi.WLInitialContextFactory";

// Defines the JNDI provider url.
public final static String PROVIDER_URL=" t3://localhost:80";

// Defines the JMS connection factory for the queue.
public final static String JMS_FACTORY="SendJMSFactory";

// Defines the queue.
public final static String QUEUE="SendJMSQueue";


private QueueConnectionFactory qconFactory;
private QueueConnection qcon;
private QueueSession qsession;
private QueueSender qsender;
private Queue queue;
private TextMessage msg;

/**
* Creates all the necessary objects for sending
* messages to a JMS queue.
*
* @param ctx JNDI initial context
* @param queueName name of queue
* @exception NamingException if operation cannot be performed
* @exception JMSException if JMS fails to initialize due to internal error
*/
public void init(Context ctx, String queueName)
throws NamingException, JMSException
{
qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
qcon = qconFactory.createQueueConnection();
qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
queue = (Queue) ctx.lookup(queueName);
qsender = qsession.createSender(queue);
msg = qsession.createTextMessage();
qcon.start();
}

/**
* Sends a message to a JMS queue.
*
* @param message message to be sent
* @exception JMSException if JMS fails to send message due to internal error
*/
public void send(String message) throws JMSException {
msg.setText(message);
qsender.send(msg);
}

/**
* Closes JMS objects.
* @exception JMSException if JMS fails to close objects due to internal error
*/
public void close() throws JMSException {
qsender.close();
qsession.close();
qcon.close();
}
/** main() method.
*
* @param args WebLogic Server URL
* @exception Exception if operation fails
*/
public static void main(String[] args) throws Exception {
InitialContext ic = getInitialContext();
QueueSend qs = new QueueSend();
qs.init(ic, QUEUE);
readAndSend(qs);
qs.close();
}

private static void readAndSend(QueueSend qs)
throws IOException, JMSException
{
BufferedReader msgStream = new BufferedReader(new InputStreamReader(System.in));
String line=null;
boolean quitNow = false;
do {
System.out.print("Enter message (\"quit\" to quit): ");
line = msgStream.readLine();
if (line != null && line.trim().length() != 0) {
qs.send(line);
System.out.println("JMS Message Sent: "+line+"\n");
quitNow = line.equalsIgnoreCase("quit");
}
} while (! quitNow);

}

private static InitialContext getInitialContext()
throws NamingException
{
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, PROVIDER_URL);
return new InitialContext(env);
}

}

六. 设计消息接收端
1. 使用的JMS资源
服务器URL: t3://localhost:7001
连接工厂: SendJMSFactory
队列: SendJMSQueue
2. 设计步骤
· 初始化JNDI Tree
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, PROVIDER_URL);
return new InitialContext(env);
· lookup ConnectionFactory
qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
· lookup Destination
queue = (Queue) ctx.lookup(queueName);
· 用 ConnectionFactory 创建Connection
qcon = qconFactory.createQueueConnection();
· 用 Connection 创建一个Session
qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
· 用 Session 和 Destination 创建MessageConsumer
qreceiver = qsession.createReceiver(queue);
· 设置监听
qreceiver.setMessageListener(this);
· 启动 Connection
qcon.start();
3. 源代码
package jmssample;

import java.util.Hashtable;
import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Hashtable;
import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
* This example shows how to establish a connection to
* and receive messages from a JMS queue. The classes in this
* package operate on the same JMS queue. Run the classes together to
* witness messages being sent and received, and to browse the queue
* for messages. This class is used to receive and remove messages
* from the queue.
*
* @author Copyright (c) 1999-2003 by BEA Systems, Inc. All Rights Reserved.
*/
public class QueueReceive implements MessageListener
{
// Defines the JNDI context factory.
public final static String JNDI_FACTORY="weblogic.jndi.WLInitialContextFactory";

// Defines the JNDI provider url.
public final static String PROVIDER_URL=" t3://localhost:80";

// Defines the JMS connection factory for the queue.
public final static String JMS_FACTORY="SendJMSFactory";

// Defines the queue.
public final static String QUEUE="SendJMSQueue";

private QueueConnectionFactory qconFactory;
private QueueConnection qcon;
private QueueSession qsession;
private QueueReceiver qreceiver;
private Queue queue;
private boolean quit = false;

/**
* Message listener interface.
* @param msg message
*/
public void onMessage(Message msg)
{
try {
String msgText;
if (msg instanceof TextMessage) {
msgText = ((TextMessage)msg).getText();
} else {
msgText = msg.toString();
}

System.out.println("Message Received: "+ msgText );

if (msgText.equalsIgnoreCase("quit")) {
synchronized(this) {
quit = true;
this.notifyAll(); // Notify main thread to quit
}
}
} catch (JMSException jmse) {
jmse.printStackTrace();
}
}

/**
* Creates all the necessary objects for receiving
* messages from a JMS queue.
*
* @param ctx JNDI initial context
* @param queueName name of queue
* @exception NamingException if operation cannot be performed
* @exception JMSException if JMS fails to initialize due to internal error
*/
public void init(Context ctx, String queueName)
throws NamingException, JMSException
{
qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
qcon = qconFactory.createQueueConnection();
qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
queue = (Queue) ctx.lookup(queueName);
qreceiver = qsession.createReceiver(queue);
qreceiver.setMessageListener(this);
qcon.start();
}

/**
* Closes JMS objects.
* @exception JMSException if JMS fails to close objects due to internal error
*/
public void close()throws JMSException
{
qreceiver.close();
qsession.close();
qcon.close();
}
/**
* main() method.
*
* @param args WebLogic Server URL
* @exception Exception if execution fails
*/

public static void main(String[] args) throws Exception {

InitialContext ic = getInitialContext();
QueueReceive qr = new QueueReceive();
qr.init(ic, QUEUE);

System.out.println("JMS Ready To Receive Messages (To quit, send a \"quit\" message).");

// Wait until a "quit" message has been received.
synchronized(qr) {
while (! qr.quit) {
try {
qr.wait();
} catch (InterruptedException ie) {}
}
}
qr.close();
}

private static InitialContext getInitialContext()
throws NamingException
{
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, PROVIDER_URL);
return new InitialContext(env);
}
}
.
测试消息发送和接收


1)打开DOS界面. 转到发送接收程序目录编译文件

2) 执行接受程序;



3). 打开另一窗口,执行发送程序;

4).从发送端输入要发送的字符,按ENTER发送,试试,接受端能接收到吗,如果不行,给我留言吧,我会尽快答复你的,呵呵(中文也可以哦)

5). 输入发送消息"quit",接收程序结束.

<!--[if !vml]--><!--[endif]-->

如果对于上面的内容,你有什么疑惑,请留言给我吧,我会尽快答复你的。。。

祝好运!

<!--[if !supportEmptyParas]--> <!--[endif]-->



相关文章推荐

JMS可靠事务编程

About JMS JMS (Java Message Service) is an interfacing technology to access message servers from ...

JMS之ActiveMQ视频教程

  • 2017年11月09日 13:58
  • 48B
  • 下载

jms中not bound问题解决方法

jms中将服务器端部署在jboss服务器中启动时会遇到这样一个问题,就是提示myqueue notbound,这也是我们部署类似jms的实例过程中很常见的一个问题。          实例代码如...

spring jms 3.2

  • 2017年05月18日 22:18
  • 196KB
  • 下载

springboot集成weblogic的jms源码.zip

  • 2017年10月25日 16:17
  • 2KB
  • 下载

Spring整合JMS——三种消息监听器

转:http://haohaoxuexi.iteye.com/blog/1893676 Spring一共为我们提供了两种类型的MessageListenerContainer,SimpleMes...

mq、jms消息处理jar包

  • 2016年01月04日 22:06
  • 15.38MB
  • 下载

JMS 学习资源

  • 2013年12月23日 15:54
  • 76KB
  • 下载

JMS学习三(ActiveMQ消息的可靠性)

这篇我们学习一下,ActiveMQ事务会话,应答模式(事务会话和应答模式是有关联的),发送持久化消息,下面我们从两个方面来学习一下即消息接受确认和发送持久化消息。 一、消息接收确认 1、jms消息只有...
  • QH_JAVA
  • QH_JAVA
  • 2017年03月08日 10:40
  • 1041
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:经历JMS编程
举报原因:
原因补充:

(最多只允许输入30个字)