weblogic中使用jms发送和接受消息

发布时间:2017-09-12 14:29:21
weblogic中使用jms发送和接受消息

一. 开篇语

今天很坑爹啊, 为了搞一下JMS这个玩意, 整了一天了, 光是weblogic的环境就换了两, 最后总算是搞定了, 写下这篇日志, 记录下学习的心得.


二. JMS

所谓的JMS其实就是异步通讯, 我们可以打个简单的比方:

现在的手机基本上普及了, 手机它有两个基本功能, 一个是打电话, 一个是发短信. 打电话是同步的, 必须要保证双方都开机才能进行通话;

而发短信则是异步的, 接收方不需要保持开机状态; 这就类似JMS了, 异步通讯实现了程序之间的松耦合的关系.


三. 几个概念

1. 为了实现JMS独立于不同供应商MS的专有技术, weblogic JMS采用了受管对象(administratored object)的机制

2. 受管对象就是由消息服务器通过管理界面创建, 程序通过JNDI接口取得这些对象

3. weblogic 中有两种受管对象:

①. connection factory: 用于创建消息服务器的connection对象
②. distination: 用于创建消息目标和消息源


四. 环境准备

1. myeclipse环境

① jre1.4

② j2ee 1.4 libraries

③ 导入weblogic.jar

\


2. weblogic环境vcD4KPHA+otkgsLLXsHdlYmxvZ2ljOC4xsqK8r7PJtb1teWVjbGlwc2U8L3A+CjxwPiAgICAgaHR0cDovL2Jsb2cuY3Nkbi5uZXQvemRwMDcyL2FydGljbGUvZGV0YWlscy8yNjgzMTczOTwvcD4KPHA+otogxeTWw3dlYmxvZ2ljt/7O8cb3PGJyPgo8L3A+CjxwPjEpoaLQwr2oam1zway907mks6ejrLmks6fD+7PGzqqhsG15Sk1TQ29ubmVjdGlvbkZhY3RvcnmhsSwKIEpOREkgbmFtZc6q"myJMSConnectionFactoryJNDIName" .

2)、定义后备存储, 并填写存储目录.

3)、新建jms服务器,服务器名称为:“myJMSServer”.

4)、在“myJMSServer”服务下新建目标为“myJMSQueue”队列, JNDI name为"myJMSQueueJNDIName".

5)、在“myJMSServer”服务下新建目标为“myJMSTopic”主题, JNDI name为"myJMSTopicJNDIName".


五. 代码测试

1. 测试P2P(point to point) - 点对点模式.

生产者发送一条消息到消息服务器, 消息服务器发送给一个消费者, 这条消息不能再发送给其他消费者, 相当于队列, 先到先得.

①. 实体类User

/** * 实体类 * @author zhangjim */ public class User implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }


②. 生产者QueueMsgSender

public class QueueMsgSender { // 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:7001/"; // Defines the JMS connection factory for the queue. public final static String CONNECTION_FACTORY_JNDI_NAME = "myJMSConnectionFactoryJNDIName"; // Defines the queue, use the queue JNDI name public final static String QUEUE_JNDI_NAME = "myJMSQueueJNDIName"; private QueueConnectionFactory qconFactory; private QueueConnection queueConnection; private QueueSession queueSession; private QueueSender queueSender; private Queue queue; private TextMessage textMessage; private StreamMessage streamMessage; private BytesMessage bytesMessage; private MapMessage mapMessage; private ObjectMessage objectMessage; /** * get the context object. * * @return context object * @throws NamingException if operation cannot be performed */ private static InitialContext getInitialContext() throws NamingException { Hashtable table = new Hashtable(); table.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY); table.put(Context.PROVIDER_URL, PROVIDER_URL); InitialContext context = new InitialContext(table); return context; } /** * 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(CONNECTION_FACTORY_JNDI_NAME); queueConnection = qconFactory.createQueueConnection(); queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); queue = (Queue) ctx.lookup(queueName); queueSender = queueSession.createSender(queue); textMessage = queueSession.createTextMessage(); streamMessage = queueSession.createStreamMessage(); bytesMessage = queueSession.createBytesMessage(); mapMessage = queueSession.createMapMessage(); objectMessage = queueSession.createObjectMessage(); queueConnection.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 { // type1: set TextMessage textMessage.setText(message); // type2: set StreamMessage streamMessage.writeString(message); streamMessage.writeInt(20); // type3: set BytesMessage byte[] block = message.getBytes(); bytesMessage.writeBytes(block); // type4: set MapMessage mapMessage.setString("name", message); // type5: set ObjectMessage User user = new User(); user.setName(message); user.setAge(30); objectMessage.setObject(user); queueSender.send(objectMessage); } /** * read the msg from the console, then send it. * * @param msgSender * @throws IOException if IO fails to send message due to internal error * @throws JMSException if JMS fails to send message due to internal error */ private static void readAndSend(QueueMsgSender msgSender) throws IOException, JMSException { BufferedReader msgStream = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter message(input quit to quit):"); String line = null; boolean quit = false; do { line = msgStream.readLine(); if (line != null && line.trim().length() != 0) { msgSender.send(line); System.out.println("JMS Message Sent: " + line + "\n"); quit = line.equalsIgnoreCase("quit"); } } while (!quit); } /** * release resources. * * @exception JMSException if JMS fails to close objects due to internal error */ public void close() throws JMSException { queueSender.close(); queueSession.close(); queueConnection.close(); } /** * test client. * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { InitialContext ctx = getInitialContext(); QueueMsgSender sender = new QueueMsgSender(); sender.init(ctx, QUEUE_JNDI_NAME); readAndSend(sender); sender.close(); } }


企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:上海网站制作 http://www.flpsz.com