最近需要写一个消息交换平台,需要在weblogic10上面配置JMS。google了半天,发现很多都是引用下面这篇文章的。文章里面有些地方写的有问题,按照它写的根本配不成功,暂时先写下备忘:
在同一个JMS Module中创建不同的subdeployment,然后ConnectionFactory和Queue要配给不同的subdeployment,ConnectionFactory target到你的server,Queue target到JMS Server。
文章后面跟有我测试的代码,根据各人情况修改一下配置就可以直接使用了。
1.启动数据库
2.启动weblogic
3.启动浏览器,在地址栏输入http://localhost:7001/console。在登录 界面输入用户名和密码进入管理界面,weblogic需要锁配置库。点击“Lock & Edit”
4. 配置JMS服务的步骤为:
4.1 配置连接工厂(Connection Factories)
4.2 配置消息存储(Message Stores)
4.3 配置JMS服务器(JMS Servers)
4.4 配置消息目的地(Destinations)
4.1 配置连接工厂(Connection Factories)
JMS中连接工厂分QueueConnectionFactory和TopicConnectionFactory两种,Weblogic不区分这两种类型。但我们最好还是配置两种工厂类型。
a.配置QueueConnectionFactry在浏览器的左边树状菜单中选择:
Services->Messaging->JMS Modules点击创建一个新的Jms Module,并输入一下信息
Name:SystemModule
next->Target: AdminServer
可以以后加入资源
finish
展开上述模块,创建一个新的Resource
Type: Connection Factory
next->
点击create new subDeployment
SubDeployment Name: JMS Subdeployment
点击:ok
Target:AdminServer
finish完成
Name: JMS QueueConnection Factory
JNDI Name: jms/QueueConnectionFactory
点击底部按钮Create,选择:
Targets: myserver
点击Next进入下一步finish结束工厂配置
b.配置TopicConnectionFactry在浏览器的左边树状菜单中选择:
Services->JMS Modules
点击创建一个新的Jms Module,并输入一下信息
Name:SystemModule
next->
Target: AdminServer 可以以后加入资源
finish
展开上述模块,创建一个新的Resource
Type: Connection Factory
next->
点击create new subDeployment
SubDeploymenet Name: JMS Subdeploymenet
点击:ok
Target:AdminServer
finish完成
Name: JMS TopicConnection Factory
JNDI Name: jms/TopicConnectionFactory
点击底部按钮Create,选择:
Targets: myserver
点击Next进入下一步finish结束工厂配置
4.2 配置消息存储(Message Stores)
weblogic中消息存储方式可分两种方式,一是把消息保存到文件系统中,二是把消息保存到数据库中。以下介绍两种存储方式的配置。
a.配置文件存储方式:
在浏览器的左边树状菜单中选择:
Services->Persistent Stores
在浏览器右边点击链接New->Create FileStore,
输入以下信息:
Name: JMS File Store
Target: AdminServer
Directory: c:jmsstore (确保你对此目录有读写权限)
点击底部按钮finish完成操作
b.配置数据库存储方式:
前提:你已经配置过JDBC的连接池(Connection pool),且此连接池处于
运行状态。
在浏览器的左边树状菜单中选择:
Services->Persistent Stores
在浏览器右边点击链接New->Create JDBCStore
输入以下信息:
Name: JMS JDBC Store
Target: AdminServer
Data Source: <选择配置好的数据源>
Prefix Name: jms(防止表名冲突,你可输入不同的前缀)
点击底部按钮finish完成操作
4.3 配置JMS服务器(JMS Servers)
每个JMS Server只能管理一个消息存储介质,针对以上配置,我们配置两个JMS Server分别管理文件方式和数据库方式的存储方式。
a.配置文件存储JMS Server在浏览器的左边树状菜单中选择:
Services->Messaging->JMS Servers
在浏览器右边点击New,输入以下信息:
Name: JMS File Server
Persistent Store: JMS File Store
点击底部按钮Next进入下一个页面,选择:Target: myserver
点击finish完成操作。
b.配置数据库存储JMS Server在浏览器的左边树状菜单中选择:
Services->Messaging->JMS Servers
在浏览器右边点击New,
输入以下信息:
Name: JMS JDBC Server
Persistent Store: JMS JDBC Store
点击底部按钮next进入下一个页面,选择:
Target: myserver
点击finish完成操作。
4.4 配置消息目的地(Destinations)
消息目的地是被JMS Server管理的,消息如何存储对配置消息目的地是透明的。因此仅以配置JMS File Server管理的目的地为例。目的地分Queue和Topic两种,以下分别配置。
a.配置Queue
在浏览器的左边树状菜单中选择:
Services->Messaging->JMS Modules
在浏览器右边选择需要配置队列的JMS模块
点击底部new按钮
Type:Queue
点击底部Next按钮
Name: JMS File Queue
JNDI Name;jms/fileQueue
点击底部按钮Next
Subdeploymenet: JMS Subdeploymenet
Target: AdminServer
finish完成配置
b.配置Topic
在浏览器的左边树状菜单中选择:
Services->Messaging->JMS Modules
在浏览器右边选择需要配置队列的JMS模块
点击底部new按钮
Type:Topic
点击底部Next按钮
Name: JMS File Topic
JNDI Name: jms/fileTopic
点击底部按钮Next
Subdeploymenet: JMS Subdeploymenet
Target: AdminServer
点击底部按钮Next->finish完成配置
另附PTP方式的测试代码:
发送方代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Hashtable;
import javax.jms.BytesMessage;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
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:7521";
// Defines the JMS connection factory for the queue.
public final static String JMS_FACTORY = "ConnectionFactory";
// Defines the queue 用的是对应 QUEUE的JNDI名子
public final static String QUEUE = "testqueue";
private QueueConnectionFactory qconFactory;
private QueueConnection qcon;
private QueueSession qsession;
private QueueSender qsender;
private Queue queue;
private TextMessage msg;
private StreamMessage sm;
private BytesMessage bm;
private MapMessage mm;
private ObjectMessage om;
/**
* 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();
sm = qsession.createStreamMessage();
bm = qsession.createBytesMessage();
mm = qsession.createMapMessage();
om = qsession.createObjectMessage();
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 {
// set TextMessage
msg.setText(message);
// set StreamMessage
sm.writeString("xmddl369");
sm.writeDouble(23.33);
// set BytesMessage
String name = "xmddl369";
byte[] block = name.getBytes();
bm.writeBytes(block);
// set MapMessage
mm.setString("name", "xmddl369");
// set ObjectMessage
UserInfo ui = new UserInfo();
ui.setName("xmddl369");
ui.setAddress("厦门");
ui.setAge(100);
om.setObject(ui);
qsender.send(msg);
// qsender.send(sm);
// qsender.send(bm);
// qsender.send(mm);
// qsender.send(om);
}
/**
* 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();
}
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);
}
}
消费方代码:
import java.util.Hashtable;
import javax.jms.BytesMessage;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
/**
*
* @author Administrator
* <pre>
* 修改版本: 修改人: 修改日期: 修改内容:
* </pre>
*/
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:7521";
// Defines the JMS connection factory for the queue.
public final static String JMS_FACTORY = "ConnectionFactory";
// Defines the queue 用的是对应 QUEUE的JNDI名子
public final static String QUEUE = "testqueue";
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 = "";
double d = 0;
if (msg instanceof TextMessage) {
msgText = ((TextMessage) msg).getText();
} else if (msg instanceof StreamMessage) {
msgText = ((StreamMessage) msg).readString();
d = ((StreamMessage) msg).readDouble();
} else if (msg instanceof BytesMessage) {
byte[] block = new byte[1024];
((BytesMessage) msg).readBytes(block);
msgText = String.valueOf(block);
} else if (msg instanceof MapMessage) {
msgText = ((MapMessage) msg).getString("name");
} else if (msg instanceof ObjectMessage) {
UserInfo ui = (UserInfo) ((ObjectMessage) msg).getObject();
msgText = ui.getName();
d = ui.getAge();
}
System.out.println("Message Received: " + msgText + "/t" + d);
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) {
ie.printStackTrace();
}
}
}
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);
}
public String getEncoding() throws Exception {
return "Hello World!";
}
}
涉及的user类:
import java.io.Serializable;
public class UserInfo implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
private String address;
private double age;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public double getAge() {
return age;
}
public void setAge(double age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}