weblogic10配置JMS

      最近需要写一个消息交换平台,需要在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;
 }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值