to:znjq1001(追风) 
能说详细点吗?具体应该怎么做呢?

解决方案 »

  1.   

    肯定是可以的。
    你到dev2dev.bea.com上找找吧。
      

  2.   

    当然可以的啊前提是:两个机器能够connection
            这样的话,再使用JMS当然就能找到
      

  3.   

    weblogic上可以,在其中一个应用服务器上设置JMS服务,
    程序中用MessageDriverBean实现JMS。Tomcat因为只包含Web容器,因此不能支持JMS.
      

  4.   

    两台服务器设成publish和subscriber并存就OK了
    A发消息给B
    对于A来说B是远程接收器,因此B要设成监听A
    反之亦然
      

  5.   

    lifetragedy(生活是场悲剧)  
    你好,能不能说的详细点?或者指点一些文档给我参考一下,我急需。
    谢谢。
      

  6.   

    OK
    提得不错
    请看
    package csm.jms;
    import javax.swing.*;
    import javax.naming.*;
    import javax.jms.*;
    import java.util.*;
    import csm.jms.exception.*;
    import csmcore.jms.entitybean.*;
    import csmcore.jms.entityview.*;
    import csmcore.jms.exception.*;
    import javax.ejb.*;
    import java.rmi.*;
    import csmcore.jms.sessionbean.*;
    public class CsmPublisher {
      private String hostName="";
      private String topicName="";
      private CsmSubPubConnMgr mgr=null;
      private JmsClientDetail bean=null;
      private TopicConnectionFactory topicFactory=null;
      private TopicSession topicSession=null;
      private TopicPublisher publisher=null;
      private Topic topic=null;
      public CsmPublisher(String host,String topic)
      {
          this.hostName = host;
          this.topicName = topic;
          mgr = CsmSubPubConnMgr.getInstance(host, topic);
          bean = mgr.getJmsClientDetail();
          topicFactory = mgr.getFactory();
          //topic = mgr.getTopic();
        }
      public void sendMsg(String msg)throws JmsPublisherException{
        try
        {
          String uid=bean.assignUser("p");
          if(!uid.equals("none"))
          {
            TopicConnection conn = topicFactory.createTopicConnection(uid, uid);
            topicSession = conn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
            publisher = topicSession.createPublisher(mgr.getTopic());
            conn.start();
            TextMessage txtMsg = topicSession.createTextMessage();
            txtMsg.setText(msg);
            publisher.publish(txtMsg);
            conn.close();
            bean.unassignUser(uid);
          }else
          {
              JOptionPane.showMessageDialog(null,"用于发送的客户连接数已经用尽");
          }
        }catch(Exception ex){
          throw new JmsPublisherException("连接JMS服务器出错:"+ex);
        }
      }
    }package csm.jms;
    import javax.naming.*;
    import javax.jms.*;
    import java.util.*;
    import csm.jms.exception.*;
    import csmcore.jms.entitybean.*;
    import csmcore.jms.entityview.*;
    import csmcore.jms.exception.*;
    import javax.ejb.*;
    import java.rmi.*;
    import csmcore.jms.sessionbean.*;public class CsmSubPubConnMgr {
      private static Context ctx=null;
      private static TopicConnectionFactory topicFactory=null;
      private static TopicConnection conn=null;
      private static TopicSession topicSession=null;
      private static Topic topic=null;
      private static TopicSubscriber sub=null;
      private static CsmSubPubConnMgr m_instance=null;
      private static JmsClientDetail bean=null;
      private CsmSubPubConnMgr() {
      }
      public JmsClientDetail getJmsClientDetail(){
        return bean;
      }
      public Topic getTopic(){
        return topic;
      }
      public TopicConnectionFactory getFactory(){
        return topicFactory;
      }
      synchronized public static CsmSubPubConnMgr getInstance(String hostName,String topicName)
      {
        if(m_instance==null)
        {
        try
        {
          Properties p = new Properties();
          System.setProperty("java.security.policy","policy");
          System.setProperty("javax.net.ssl.trustStore", "csmkey");
          System.setProperty("javax.net.debug","ssl");
          Properties sessionp = System.getProperties();
          p.put(Context.INITIAL_CONTEXT_FACTORY,
                       "org.jnp.interfaces.NamingContextFactory");
          p.put(Context.URL_PKG_PREFIXES, "org.jboss.naming");
          p.put(Context.PROVIDER_URL, hostName);
          //JOptionPane.showMessageDialog(null,hostName+":343");
          p.setProperty("jnp.timeout", "0");
          p.setProperty("jnp.sotimeout", "0");
          p.put(Context.INITIAL_CONTEXT_FACTORY,
                   "org.jnp.interfaces.NamingContextFactory");
          p.put(Context.PROVIDER_URL, hostName);
          ctx = new InitialContext(p);
          Object obj = ctx.lookup("JmsClientDetail");
          JmsClientDetailHome home = (JmsClientDetailHome) javax.rmi.PortableRemoteObject.narrow(
                obj, JmsClientDetailHome.class);
          bean = home.create();
          topic = (Topic) ctx.lookup(topicName);
          topicFactory = (TopicConnectionFactory) ctx.lookup("ConnectionFactory");
        }catch(Exception ex){
          System.out.println("jms error:"+ex);
          return null;
        }
          m_instance=new CsmSubPubConnMgr();
        }
        return m_instance;
      }
    }import csmcore.jms.entitybean.*;
    import csmcore.jms.entityview.*;
    import csmcore.jms.exception.*;
    import javax.ejb.*;
    import java.rmi.*;
    import csmcore.jms.sessionbean.*;public class CsmSubscriber extends Thread implements MessageListener{
      private static TopicSubscriber sub=null;
      private static String csmMsg="";
      private static TopicConnection conn=null;
      private static TopicConnectionFactory factory=null;
      private static TopicSession topicSession=null;
      private static CsmSubPubConnMgr mgr=null;
      private static JmsClientDetail bean=null;
      private static Topic topic=null;
      private static String uid="";
      private static CsmSubscriber m_instance=null;
      public String returnUid(){
        return this.uid;
      }
      public void closeProcess(){
        try
        {
          conn.close();
          //JOptionPane.showMessageDialog(null,""+uid);
          bean.unassignUser(uid);
        }catch(Exception ex){
          JOptionPane.showMessageDialog(null,"error:"+ex);
        }
      }
      public void closeProcess(String userName){
        try
        {
          conn.close();
          //JOptionPane.showMessageDialog(null,""+uid);
          bean.unassignUser(userName);
        }catch(Exception ex){
          JOptionPane.showMessageDialog(null,"error:"+ex);
        }
      }
      synchronized public static CsmSubscriber getInstance(String hostName,String topicName){
        if(m_instance==null)
        {
          try {
            System.out.println("begin");
            mgr = CsmSubPubConnMgr.getInstance(hostName, topicName);
            System.out.println("done1");
            factory = mgr.getFactory();
            System.out.println("done2");
            bean = mgr.getJmsClientDetail();
            System.out.println("done3");
            uid = bean.assignUser("s");
            //JOptionPane.showMessageDialog(null,"assign user:"+uid);
            if (!uid.equals("none")) {
              conn = factory.createTopicConnection(uid, uid);
              System.out.println("done3");
              topic = mgr.getTopic();
              System.out.println("done4");
              //conn.setClientID("csmsubid");
              topicSession = conn.createTopicSession(false,
                                                     Session.AUTO_ACKNOWLEDGE);
              System.out.println("done5");
              sub = topicSession.createDurableSubscriber(topic, "csmjms");
              System.out.println("done6");
            }
            else {
              JOptionPane.showMessageDialog(null, "用于接收的客户连接数已经用尽");
            }
            //JOptionPane.showMessageDialog(null,""+sub.getTopic().toString());
          }
          catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "init error:" + ex);
            return null;
          }
          m_instance=new CsmSubscriber();
        }
        return m_instance;
      }
      private CsmSubscriber() {  }
      public void run()
      {
        try
        {      sub.setMessageListener(this);
          conn.start();
        }catch(Exception ex)
        {
          JOptionPane.showMessageDialog(null,"set listener error:"+ex);
        }  }
      public String getMessage()
      {
        try
        {
          return this.csmMsg;
        }catch(Exception ex){
          JOptionPane.showMessageDialog(null,"error:"+ex);
          return "";
        }
      }
      public void onMessage(Message msg)
      {
        try
        {      TextMessage tm=(TextMessage)msg;
          //JOptionPane.showMessageDialog(null,"tm:"+tm.getText());
          this.csmMsg=tm.getText();
          //return;
        }catch(Exception ex){
          JOptionPane.showMessageDialog(null,"error:"+ex);
        }
      }
    }
      

  7.   

    关键在于
    发送方:
    TopicConnection conn = topicFactory.createTopicConnection(uid, uid);
            topicSession = conn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
            publisher = topicSession.createPublisher(mgr.getTopic());
            conn.start();
            TextMessage txtMsg = topicSession.createTextMessage();
            txtMsg.setText(msg);
            publisher.publish(txtMsg);
            conn.close();
    接收方:
    public void onMessage(Message msg)
      {
        try
        {      TextMessage tm=(TextMessage)msg;
          //JOptionPane.showMessageDialog(null,"tm:"+tm.getText());
          this.csmMsg=tm.getText();
          //return;
        }catch(Exception ex){
          JOptionPane.showMessageDialog(null,"error:"+ex);
        }
    记住,我上面的是全部的源码,你会看到一个bean = mgr.getJmsClientDetail();
    这是一个EJB方法,作用在于动态的在运行时给JMS分配一个CLIENTID和PWD,为什么要这样,因为JBOSS不能N个客户端共用一个CLIENTID,而WEBLOGIC可以,因此一个CLIENT端要连,就要分配一个(动态的改JBOSS内的XML和数据库)中的一个CLIENTID
    下面给出JMS BEAN的源码
    package csmmdb;import javax.ejb.MessageDrivenBean;
    import javax.jms.MessageListener;
    import javax.ejb.MessageDrivenContext;
    import javax.ejb.CreateException;
    import javax.jms.Message;
    import javax.jms.*;
    public class csmjmsBean
        implements MessageDrivenBean, MessageListener {
      MessageDrivenContext messageDrivenContext;
      public void ejbCreate(){
      }  public void ejbRemove() {
      }
      public String getAss(){
        return "asshole";
      }
      public void onMessage(Message msg) {
        try
        {
          TextMessage tm=(TextMessage)msg;
          System.out.println(tm.getText());    }catch(Exception ex){
          System.out.println("jms server error:"+ex);
        }
      }  public void setMessageDrivenContext(MessageDrivenContext messageDrivenContext) {
        this.messageDrivenContext = messageDrivenContext;
      }
    }
    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>
      <display-name>csmjms</display-name>
      <enterprise-beans>
        <message-driven>
          <display-name>csmjms</display-name>
          <ejb-name>csmjms</ejb-name>
          <ejb-class>csmmdb.csmjmsBean</ejb-class>
          <transaction-type>Container</transaction-type>
          <message-driven-destination>
            <destination-type>javax.jms.Topic</destination-type>
            <subscription-durability>Durable</subscription-durability>
          </message-driven-destination>
        </message-driven>
      </enterprise-beans>
      <assembly-descriptor>
        <container-transaction>
          <method>
            <ejb-name>csmjms</ejb-name>
            <method-name>*</method-name>
          </method>
          <trans-attribute>Required</trans-attribute>
        </container-transaction>
      </assembly-descriptor>
    </ejb-jar>
    jboss.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.2//EN" "http://www.jboss.org/j2ee/dtd/jboss_3_2.dtd">
    <jboss>
      <enterprise-beans>
        <message-driven>
          <ejb-name>csmjms</ejb-name>
          <destination-jndi-name>topic/csmjms</destination-jndi-name>
          <mdb-user>csm</mdb-user>
          <mdb-passwd>isdnymk</mdb-passwd>
          <mdb-subscription-id>csmjms</mdb-subscription-id>
        </message-driven>
      </enterprise-beans>
    </jboss>
      

  8.   

    这样就会有一个很好玩的效果,你发一条消息,所有连在服务器上的CLIENT就会同时得到,这时如果有一个CLIENT把网线刚连上这台SERVER,这台新连上的CLIENT端也会得到消息,这就是durable/publisher的好处,至于有人说什么用SOCKET,OMG,在J2EE的中间件内用SOCKET通信,你去试试看
      

  9.   

    首先非常感谢 lifetragedy(生活是场悲剧) 的热心帮助。看得我不是全都明白,
    远程连接有没有简单的方法:比如不用 ejb 来?Jboss 4.0 启动后 jms 的 1099 端口开启,等待连接,
    Properties properties = new Properties();
    properties.put(Context.INITIAL_CONTEXT_FACTORY,
    "org.jnp.interfaces.NamingContextFactory");
    properties.put(Context.URL_PKG_PREFIXES, "org.jnp.interfaces");
    properties.put(Context.PROVIDER_URL, "wangxl:1099");
    //properties.put(Context.PROVIDER_URL, "jnp://wangxl:1099");
    //properties.put(Context.PROVIDER_URL, "jnp://10.4.0.54:1099");都可以的,但这样尽限于本机的连接方式,我配置了一台 JBoss ,现在想从另一台客户端上来
    连接 这个 Jms 队列什么的,来完成收发信息。
    IBM 的MQ 完全能够完成这样的功能,我想Jboss 一定也能行,
    JBoss 服务器上的配置方法,我还一头雾水,lifetragedy 你有这方面的配置经验或者有什么方向么?
      

  10.   

    TO pumawang(想什么都学会!)
    你先把WEBLOGIC7。0配CONNECTION搞搞懂,然后再看一下JAVA的白皮书,就知道我上面的语句干吗这样写了
      

  11.   

    其实我的问题就是配置。
    哎,现在搞定了。其实就是在服务器中的Hosts(Linux存在这个问题。)加个自己的 Ip 地址的映射就行了。大概是太简单了,各位会大都不在点子上。失望。