在weblogic的控制台上
1、先设置jms的connection factory,
2、然后设置stores,存储成directory还是jdbc你自己选
3、设置jms的server,在desitantions中设置Topic和Queuequeue就是你说的点对点

解决方案 »

  1.   

    grey_whp 说的这些我都已经设置好了,我还在jb8中new了一个jms,代码如下:public class JmsUpdateDictionary implements MessageListener {
      private static Context context = null;
      private boolean transacted = true;
      private int acknowledgementMode = Session.AUTO_ACKNOWLEDGE;
      private Hashtable environment = null;
      private QueueConnectionFactory queueConnectionFactory = null;
      private QueueConnection queueConnection = null;
      private QueueSession queueSession = null;
      private QueueSender queueSender = null;
      private QueueReceiver queueReceiver = null;
      private Queue queue = null;
      private String queueConnectionFactoryName = "nameofjndi";  //这个值是在console设置过的
      private String queueName = "MyJMSQueue_jndi";//这个值是在console设置过的
      。
      。
      。
      public void sendText(String message) throws Exception {
        System.out.println("method sendtext");
        TextMessage textMessage = getQueueSession().createTextMessage();
        textMessage.clearBody();
        textMessage.setText(message);
        getQueueSender().send(textMessage);
        if (isTransacted()) {
          getQueueSession().commit();
        }
           System.out.println("method sendtext end");
      }
      public void onMessage(Message message) {
        if (message instanceof BytesMessage) {
          BytesMessage bytesMessage = (BytesMessage) message;
          //Process bytesMessage here
        }
        else {
          if (message instanceof MapMessage) {
            MapMessage mapMessage = (MapMessage) message;
            //Process mapMessage here
          }
          else {
            if (message instanceof ObjectMessage) {
              ObjectMessage objectMessage = (ObjectMessage) message;
              //Process objectMessage here
            }
            else {
              if (message instanceof StreamMessage) {
                StreamMessage streamMessage = (StreamMessage) message;
                //Process streamMessage here
              }
              else {
                if (message instanceof TextMessage) {
                  TextMessage textMessage = (TextMessage) message;
                  //Process textMessage here
                }
              }
            }
          }
        }
        try {
          if (isTransacted()) {
            getQueueSession().commit();
          }
        }
        catch(Exception ex) {
          ex.printStackTrace();
        }
      }有一个问题是为什么上面这个文件中会出现onmessage,这个方法应该出现在mdb中才对呀?  
    我想直接用上面这个文件可以了吧,我调用了sendtext,发送了一个字符串,运行时不出错,并且“method sendtext”和“method sendtext end”都能打印出来,好象已经发送成功,但我有一个mdb,xml文件中已经定义jndi名:<message-driven-descriptor>
                <destination-jndi-name>MyJMSQueue_jndi</destination-jndi-name>
                <connection-factory-jndi-name>nameofjndi</connection-factory-jndi-name>
            </message-driven-descriptor>它的onmessage中的语句没反应,也就是说,没有收到信息,怎么回事?
    另外发送完信息后怎么样知道信息已经被mdb接收了呢?
      

  2.   

    mdb收到消息后打印在控制台不是jb里 消息发出后到收到有个延迟 几秒吧 如果你的收发在同一个程序里 就让他多运行一会 比如让他死循环 如果同时有mdb 好象是mdb收到消息
      

  3.   

    可以参考下面教程
    http://www-900.ibm.com/developerWorks/cn/java/j-jms11/index.shtml
    http://www-900.ibm.com/developerWorks/cn/education/java/j-jms/tutorial/
      

  4.   

    有问题,可以发送,并且设为store的目录中有文件,是乱码,不过从里面的数字中可以看到消息的内容,应该怎么看呢?我建的mdb还是接收不到消息
      

  5.   

    mdb接收不到信息,怎么解决?
      

  6.   

    http://expert.csdn.net/Expert/topic/1616/1616907.xml?temp=.1850702里面说到
    “呵呵,很弱的错误,没有启动j2ee的jms服务器,所以看不到消息收到。”是什么意思?要先启动JMS吗?怎么启动?
      

  7.   

    你在mdb里onmessage里向一个空文件写点东西看是不是真的收不到
      

  8.   

    public void onMessage(Message msg) {
        System.out.println("received");
        TextMessage textMsg = (TextMessage) msg;
        try {
          String text = textMsg.getText();
          System.out.println("Received new message: " + text);
        } catch (JMSException e) {
          e.printStackTrace();
        }
      }
    执行没有任何反应啊?不打印任何文本是不是mdb要先启动让它处于监听状态啊?怎么启动?
      

  9.   

    现在又发现在mdb中的配置文件中:
    把<destination-jndi-name>和<connection-factory-jndi-name>都设置成不存在的jndi名字,竟然也可以deploy,不出错。
      

  10.   

    mdb部署后就处于监听状态
    你去掉发送程序的onmessage 还有不要实现messagelistener试试看mdb能不能收到
      

  11.   

    发送消息的程序如下:public class JmsUpdateDictionary {
      private static Context context = null;
      //private boolean transacted = true;
      private int acknowledgementMode = Session.AUTO_ACKNOWLEDGE;
      private Hashtable environment = null;
      private QueueConnectionFactory queueConnectionFactory = null;
      private QueueConnection queueConnection = null;
      private QueueSession queueSession = null;
      private QueueSender queueSender = null;
      private QueueReceiver queueReceiver = null;
      private Queue queue = null;
      private String queueConnectionFactoryName = "nameofjndi";
      private String queueName = "MyJMSQueue_jndi";  public void sendText(String messageText) throws Exception {
          InitialContext initContext = new InitialContext();
          QueueConnectionFactory factory =
                        (QueueConnectionFactory) initContext.lookup(queueConnectionFactoryName);
          Queue queue = (Queue) initContext.lookup(queueName);
          initContext.close();
          QueueConnection connection = factory.createQueueConnection();
          connection.start();
          QueueSession session =connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
          QueueSender sender = session.createSender(queue);
          TextMessage message = session.createTextMessage(messageText);
          sender.send(message);  }public void close() throws Exception {
        if (queueSender != null) {
          queueSender.close();
        }
        if (queueReceiver != null) {
          queueReceiver.close();
        }
        if (queueSession != null) {
          queueSession.close();
        }
        if (queueConnection != null) {
          queueConnection.close();
        }
      }
    }
    没有onmessage,也没有实现messagelistener
      

  12.   

    楼上讲的对,你的客户端程序怎么会有onmessage()方法?她实现了MessageListener接口,是用来消费消息的。不是用来发送消息的。你的mdb已经实现了这个接口和MessageDriverBean。
    你的客户端只需要象上面的那样就行了。
      

  13.   

    有onmessage的那个程序已经不用了,一开始用的是那个,后来就用的是没有onmessage,也没有实现messagelistener的那个发送消息的程序呀。
      

  14.   

    InitialContext initContext = new InitialContext();
    不正确
    改为如下
    import java.util.*;
    import javax.naming.*;
    import javax.jms.*;public class JmsUpdateDictionary {
      private static Context context = null;
      //private boolean transacted = true;
      private int acknowledgementMode = Session.AUTO_ACKNOWLEDGE;
      private Hashtable environment = null;
      private QueueConnectionFactory queueConnectionFactory = null;
      private QueueConnection queueConnection = null;
      private QueueSession queueSession = null;
      private QueueSender queueSender = null;
      private QueueReceiver queueReceiver = null;
      private Queue queue = null;
      public Context ctx = null;
      private String queueConnectionFactoryName = "nameofjndi";
      private String queueName = "MyJMSQueue_jndi";
      public final static String JNDI_FACTORY =
          "weblogic.jndi.WLInitialContextFactory";  private Context getInitialContext() throws NamingException {
        if (ctx == null) {
          try {
            Properties p = new Properties();
            p.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
            ctx = new InitialContext(p);
          }
          catch (NamingException ne) {
            System.err.println("** Unable to connect to the server");
            ne.printStackTrace();
            throw ne;
          }
        }
        return ctx;
      }  public void sendText(String messageText) throws Exception {
        Context initContext = getInitialContext(); ;
        QueueConnectionFactory factory =
            (QueueConnectionFactory) initContext.lookup(queueConnectionFactoryName);
        Queue queue = (Queue) initContext.lookup(queueName);
        initContext.close();
        QueueConnection connection = factory.createQueueConnection();
        connection.start();
        QueueSession session = connection.createQueueSession(false,
            Session.AUTO_ACKNOWLEDGE);
        QueueSender sender = session.createSender(queue);
        TextMessage message = session.createTextMessage(messageText);
        sender.send(message);  }  public void close() throws Exception {
        if (queueSender != null) {
          queueSender.close();
        }
        if (queueReceiver != null) {
          queueReceiver.close();
        }
        if (queueSession != null) {
          queueSession.close();
        }
        if (queueConnection != null) {
          queueConnection.close();
        }
      }  public static void main(String[] args) {
        JmsUpdateDictionary mdb = new JmsUpdateDictionary();
        try {
          mdb.sendText("hello");
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
    然后做个接收程序 经测试可以收到消息 我用的weblogic7 + jb8
      

  15.   

    mdb也收到 在控制台中打出  就是那个dos窗口
    <2003-8-13 上午01时54分45秒> <Notice> <WebLogicServer> <000360> <Server started
    in RUNNING mode>
    TextMessage[ID:P<97920.1060741372750.0>, hello]
      

  16.   

    : teafang(学习) 我把发送的程序改成你那种,store设置的文件也和以前一样,有发送消息记录(以前也有记录,是否说明与发送的程序无关呢?),但mdb还是接收不到帮我看看下面两个文件,是否有东东没有设置
    ejb-jar.xml<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
    <ejb-jar>
        <enterprise-beans>
            <message-driven>
                <display-name>Updatedictionary</display-name>
                <ejb-name>Updatedictionary</ejb-name>
                <ejb-class>com.ejb.mdb.UpdatedictionaryBean</ejb-class>
                <transaction-type>Container</transaction-type>
                <message-driven-destination>
                    <destination-type>javax.jms.Queue</destination-type>
                </message-driven-destination>
            </message-driven>
        </enterprise-beans>
        <assembly-descriptor>
            <container-transaction>
                <method>
                    <ejb-name>Updatedictionary</ejb-name>
                    <method-name>*</method-name>
                </method>
                <trans-attribute>Required</trans-attribute>
            </container-transaction>
        </assembly-descriptor>
    </ejb-jar>weblogic-ejb-jar.xml<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE weblogic-ejb-jar PUBLIC '-//BEA Systems, Inc.//DTD WebLogic 7.0.0 EJB//EN' 'http://www.bea.com/servers/wls700/dtd/weblogic-ejb-jar.dtd'>
    <weblogic-ejb-jar>
        <weblogic-enterprise-bean>
            <ejb-name>Updatedictionary</ejb-name>
            <message-driven-descriptor>
                <destination-jndi-name>MyJMSQueue_jndi1</destination-jndi-name>
                <connection-factory-jndi-name>nameofjndi1</connection-factory-jndi-name>
            </message-driven-descriptor>
        </weblogic-enterprise-bean>
    </weblogic-ejb-jar>
      

  17.   

    那你看看配置有没问题 比如mdb的连接工厂 队列是否正确
      

  18.   

    teafang(学习) 你说的配置是console那里的配置还是mdb的配置呢,在console中我配置了Connection Factory、stores、新建了一个server,下面的Destinations建了一个Queue,发送消息后store有记录。至于mdb,只设置了<destination-jndi-name>和<connection-factory-jndi-name>,按照上面那样来设置的,够不够?有一点奇怪的是不管上面设置的jndi名称是否在console中已经存大,mdb都能正常deploy,这正常吗?
      

  19.   

    两个都要看 在weblogic里 最好参照网上的一些例子来做  在weblogic里查看jms是否有消息记录 jms--servers---你建立的server  点击Configure Destinations... 点击你建的队列,选Monitoring选项卡,点击Monitor all Active JMS Destinations...
      

  20.   

    : teafang(学习) 在weblogic里查看到jms有消息记录 Name       Consumers   Consumers High          Consumers Total           Messages 
    MyJMSQueue   0              0                   0                          1553 Messages Pending      Messages High      Messages Received          Messages Threshold Time 
    0                          1553                 10                          0 Bytes        Bytes Pending          Bytes Received Bytes               Threshold Time 
    13977              0                         90                             0 
    但显示消费掉的数目为0按照你这种思路,监控了mdb,结果如下:EJBName 
    Updatedictionary
    Pool Idle Beans Count 
     0
    Pool Beans In Use Count 
     0 
    Pool Waiter Total Count 

    Pool Timeout Total Count 

    JMSConnection Alive 
    false 显示mdb不是活动的
      

  21.   

    那估计mdb的连接工厂或者队列没设对 发送程序是正确的
      

  22.   

    我今天也出现这个问题,甚为苦恼,最后发现是:
    JMSConnection Alive 为 false 显示mdb没有被激活,希望大家帮忙!
      

  23.   

    在你创建的ejbmodoule里看你的mdb的配置是否正确
      

  24.   

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE weblogic-ejb-jar PUBLIC '-//BEA Systems, Inc.//DTD WebLogic 7.0.0 EJB//EN' 'http://www.bea.com/servers/wls700/dtd/weblogic-ejb-jar.dtd'>
    <weblogic-ejb-jar>
        <weblogic-enterprise-bean>
            <ejb-name>Updatedictionary</ejb-name>
            <message-driven-descriptor>
                <destination-jndi-name>MyJMSQueue_jndi</destination-jndi-name>
                <connection-factory-jndi-name>nameofjndi</connection-factory-jndi-name>
            </message-driven-descriptor>
        </weblogic-enterprise-bean>
    </weblogic-ejb-jar>
      

  25.   

    我核对过上面的destination-jndi-name 和connection-factory-jndi-name都是对的
      

  26.   

    我已经找到答案了:选中ConnectionFactory,点击Configuration-->Transactions,前两个选项都要选中,尤其是第二个,XAConnection Factory Enabled。因为我们建立的MDB一般都是containor管理的,所以必须支持事务。
      

  27.   

    谢谢。
    我又发现一个解决的方法,就是把MDB设置成Bean管理而非Containor管理。
      

  28.   

    可以啦,我把MDB设置成Bean管理就行了,太感谢了