<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    rednight

    0x2B|~0x2B,That's not a question,Just do it.
    posts - 32, comments - 14, trackbacks - 0, articles - 0

    The logic to change state is only inside one method (initVesselView(…)) inside GrVessel.java.?

    if (viewType == VIEW_STOWAGE) {
    ??????????? vslView_ = new VesselStowageView(leftPoint, bow2Left, leftCenter,
    ???????????????????????????????????????????? rightCenter, shipWidth_);
    ??????? }
    ??????? else if (viewType == VIEW_SIDE) {
    ??????????? vslView_ = new VesselSideView(leftPoint, bow2Left, leftCenter,
    ????????????????????????????????????????? rightCenter, shipWidth_);
    ??????? }
    ??????? else if (viewType == VIEW_PLAN) {
    ??????????? vslView_ = new VesselPlanView(leftPoint, bow2Left, leftCenter,
    ????????????????????????????????????????? rightCenter, shipWidth_);
    ??????? }
    ??????? else {
    ??????????? throw new IllegalArgumentException(
    ??????????????? "GrVessel::initVesselView-->Invalid view type!");
    ??????? }


    We do not need to repeat this logic of changing view in many other method.
    This is the benefit of State design pattern.
    The 3 state classes here are VesselPlanView.java, VesselSideView.java and VesselStowageView.java

    Please note that in the state classes, if a method is supported by stateA and not supported by stateB.?
    Then, in stateB, the method body will throw an exception (IllegalArgumentException) to indicate that coder call the wrong method in the wrong state.

    Example, in VesselPlanView.java, public boolean addStowage(...).? This method is only meaningful to stowageView.

    public boolean addStowage(IlvManager manager, List transformList, IlvGraphic stowage, String stadBayN,
    ????????????????????????????? boolean isSelect) {
    ??????? throw new IllegalArgumentException(
    ??????????????? "GrVessel::addStowage-->be sure the vessel at stowage view!");
    ??? }


    Hence, in PlanView, the method body will throw exception.

    Just to share with you a better way to code.

    posted @ 2006-12-26 14:46 rednight 閱讀(343) | 評論 (0)編輯 收藏

         摘要: 本文討論模型過濾技術。您可將這一技術用于 Swing 組件集,這樣即可在不改變底層數據的條件下提供模型數據的不同視圖。過濾器可以改變數據元素的外在內容,將數據排除在視圖之外、將外部元素包含進數據集中、或者以不同的順序呈現元素。過濾器既可應用于數據模型,也可應用于狀態模型。您還可以疊用過濾器,以將它們的效果組合起來。  閱讀全文

    posted @ 2006-11-11 16:16 rednight| 編輯 收藏

    有時運行ANT 時會拋出 java.lang.InstantiationException: org.apache.tools.ant.Main 異常
    原因之一是在機器中存在2種不同版本的ANT,我碰到的情況是classpath 中即有weblogic.jar,又有1.6.5的ANT,
    刪除weblogic.jar后運行就正常了

    posted @ 2006-11-09 18:23 rednight 閱讀(1751) | 評論 (1)編輯 收藏

    public class GroupableHeaderExample extends JFrame {

    ? GroupableHeaderExample() {
    ??? super( "Groupable Header Example" );

    ??? DefaultTableModel dm = new DefaultTableModel();
    ??? dm.setDataVector(new Object[][]{
    ????? {"119","foo","bar","ja","ko","zh"},
    ????? {"911","bar","foo","en","fr","pt"}},
    ??? new Object[]{"SNo.","1","2","Native","2","3"});

    ??? JTable table = new JTable( dm ) {
    ????? protected JTableHeader createDefaultTableHeader() {
    ? return new GroupableTableHeader(columnModel);
    ????? }
    ??? };
    ??? TableColumnModel cm = table.getColumnModel();
    ??? ColumnGroup g_name = new ColumnGroup("Name");
    ??? g_name.add(cm.getColumn(1));
    ??? g_name.add(cm.getColumn(2));
    ??? ColumnGroup g_lang = new ColumnGroup("Language");
    ??? g_lang.add(cm.getColumn(3));
    ??? ColumnGroup g_other = new ColumnGroup("Others");
    ??? g_other.add(cm.getColumn(4));
    ??? g_other.add(cm.getColumn(5));
    ??? g_lang.add(g_other);
    ??? GroupableTableHeader header = (GroupableTableHeader)table.getTableHeader();
    ??? header.addColumnGroup(g_name);
    ??? header.addColumnGroup(g_lang);

    ??? TableCellRenderer renderer =? new DefaultTableCellRenderer() {
    ??????? public Component getTableCellRendererComponent(JTable table, Object value,
    ???????????????????????? boolean isSelected, boolean hasFocus, int row, int column) {
    ????????? JTableHeader header = table.getTableHeader();
    ????????? if (header != null) {
    ??????????? setForeground(header.getForeground());
    ??????????? setBackground(header.getBackground());
    ??????????? setFont(header.getFont());
    ????????? }
    ????????? setHorizontalAlignment(JLabel.CENTER);
    ????????? setText((value == null) ? "" : value.toString());
    ????????? setBorder(UIManager.getBorder("TableHeader.cellBorder"));
    ????????? return this;
    ??????? }
    ????? };

    ??? TableColumnModel model = table.getColumnModel();
    ??? for (int i=0;i<model.getColumnCount();i++) {
    ????? model.getColumn(i).setHeaderRenderer(renderer);
    ??? }
    ??? JScrollPane scroll = new JScrollPane( table );
    ??? getContentPane().add( scroll );
    ??? setSize( 400, 120 );
    ? }

    ? public static void main(String[] args) {
    ??? GroupableHeaderExample frame = new GroupableHeaderExample();
    ??? frame.addWindowListener( new WindowAdapter() {
    ????? public void windowClosing( WindowEvent e ) {
    ? System.exit(0);
    ????? }
    ??? });
    ??? frame.setVisible(true);
    ? }
    }

    =============================================
    public void paint(Graphics g, JComponent c) {
    ??? Rectangle clipBounds = g.getClipBounds();
    ??? if (header.getColumnModel() == null) return;
    //??? ((GroupableTableHeader)header).setColumnMargin();
    ??? int column = 0;
    ??? Dimension size = header.getSize();
    ??? Rectangle cellRect? = new Rectangle(0, 0, size.width, size.height);
    ??? Hashtable h = new Hashtable();
    //??? int columnMargin = header.getColumnModel().getColumnMargin();

    ??? Enumeration enumeration = header.getColumnModel().getColumns();
    ??? while (enumeration.hasMoreElements()) {
    ????? cellRect.height = size.height;
    ????? cellRect.y????? = 0;
    ????? TableColumn aColumn = (TableColumn)enumeration.nextElement();
    ????? Enumeration cGroups = ((GroupableTableHeader)header).getColumnGroups(aColumn);
    ????? if (cGroups != null) {
    ??????? int groupHeight = 0;
    ??????? while (cGroups.hasMoreElements()) {
    ????????? ColumnGroup cGroup = (ColumnGroup)cGroups.nextElement();
    ????????? Rectangle groupRect = (Rectangle)h.get(cGroup);
    ????????? if (groupRect == null) {
    ??????????? groupRect = new Rectangle(cellRect);
    ??????????? Dimension d = cGroup.getSize(header.getTable());
    ??????????? groupRect.width? = d.width;
    ??????????? groupRect.height = d.height;
    ??????????? h.put(cGroup, groupRect);
    ????????? }
    ????????? paintCell(g, groupRect, cGroup);
    ????????? groupHeight += groupRect.height;
    ????????? cellRect.height = size.height - groupHeight;
    ????????? cellRect.y????? = groupHeight;
    ??????? }
    ????? }
    ????? cellRect.width = aColumn.getWidth() ;//+ columnMargin;
    ????? if (cellRect.intersects(clipBounds)) {
    ??????? paintCell(g, cellRect, column);
    ????? }
    ????? cellRect.x += cellRect.width;
    ????? column++;
    ??? }
    ? }



    posted @ 2006-11-08 21:05 rednight| 編輯 收藏

    使用 IlvToolTipManager 創建一個多行的 tooltip ?

    1) 首先需要注冊 view (IlvManagerView)I
    lvToolTipManager.registerView(view); ?

    2) 創建需要顯示的信息的數組,即每行的信息為數組中的一個元素:
    new String[] tooltipArray ; ?

    3) 創建 tooltip, 第一個參數是上面創建的數組,第二個參數是顯示位置,必須是 SwingConstants.LEFT , RIGHT , or CENTER String tooltip = IlvToolTipManager.createMultiLineToolTipText(tooltipArray, SwingConstants.LEFT); ?

    4) 設置 tooltip
    IlvGraphic.setToolTipText(tooltip);



    public static String createMultiLineToolTipText(String as[], int i)
    ??? {
    ??????? String s;
    ??????? switch(i)
    ??????? {
    ??????? case 2: // '\002'
    ??????????? s = "left";
    ??????????? break;

    ??????? case 4: // '\004'
    ??????????? s = "right";
    ??????????? break;

    ??????? case 0: // '\0'
    ??????????? s = "center";
    ??????????? break;

    ??????? case 1: // '\001'
    ??????? case 3: // '\003'
    ??????? default:
    ??????????? throw new IllegalArgumentException("Alignment must be LEFT, RIGHT, or CENTER");
    ??????? }
    ??????? Font font = UIManager.getFont("ToolTip.font");
    ??????? StringBuffer stringbuffer = new StringBuffer("<p align=\"");
    ??????? stringbuffer.append(s);
    ??????? stringbuffer.append("\" style=\"font-family:");
    ??????? stringbuffer.append(font.getName());
    ??????? stringbuffer.append(";font-size:");
    ??????? stringbuffer.append(font.getSize());
    ??????? stringbuffer.append("pt\">");
    ??????? String s1 = stringbuffer.toString();
    ??????? StringBuffer stringbuffer1 = new StringBuffer("<html>");
    ??????? for(int j = 0; j < as.length; j++)
    ??????? {
    ??????????? stringbuffer1.append(s1);
    ??????????? stringbuffer1.append(as[j]);
    ??????????? stringbuffer1.append("</p>");
    ??????? }

    ??????? stringbuffer1.append("</html>");
    ??????? return stringbuffer1.toString();
    ??? }

    ?

    posted @ 2006-11-08 09:22 rednight 閱讀(269) | 評論 (0)編輯 收藏

    下面這個異常是因為沒有找到EJB, JNDI NAME 本來是 'ejb/ppp/sss/Resource' ,? 可找的卻是'ejb.ppp.sss/Resource' ,
    后來查到是因為EJB 的REMOTE 接口中的方法在BEAN中沒有定義. 不知道還有沒有其他什么原因可以導致這種情況.

    Caused by: javax.naming.NameNotFoundException: While trying to lookup 'ejb.ppp.sss/Resource' didn't find subcontext 'ppp' Resolved ejb
    ?at weblogic.jndi.internal.BasicNamingNode.newNameNotFoundException(BasicNamingNode.java:924)
    ?at weblogic.jndi.internal.BasicNamingNode.lookupHere(BasicNamingNode.java:225)
    ?at weblogic.jndi.internal.ServerNamingNode.lookupHere(ServerNamingNode.java:154)
    ?at weblogic.jndi.internal.BasicNamingNode.lookup(BasicNamingNode.java:188)
    ?at weblogic.jndi.internal.BasicNamingNode.lookup(BasicNamingNode.java:196)
    ?at weblogic.jndi.internal.RootNamingNode_WLSkel.invoke(Unknown Source)
    ?at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:492)
    ?at weblogic.rmi.cluster.ReplicaAwareServerRef.invoke(ReplicaAwareServerRef.java:108)
    ?at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:435)
    ?at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
    ?at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:147)
    ?at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:430)
    ?at weblogic.rmi.internal.BasicExecuteRequest.execute(BasicExecuteRequest.java:35)
    ?at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)
    ?at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)

    posted @ 2006-11-08 08:51 rednight 閱讀(480) | 評論 (0)編輯 收藏

         摘要: 我們期待自己成為一個優秀的軟件模型設計者,但是,要怎樣做,又從哪里開始呢?

      將下列原則應用到你的軟件工程中,你會獲得立桿見影的成果  閱讀全文

    posted @ 2006-09-24 11:46 rednight 閱讀(110) | 評論 (0)編輯 收藏

    Eclipse插件下載列表
    MyEclipse:J2EE開發插件,支持JSP、EJB、數據庫等操作。
    下載站點:www.myeclipseide.com

    Lomboz:和MyEclipse的同類型插件且免費。
    下載站點:http://forge.objectweb.org/project/showfiles.php?group_id=97

    XMLBuddy:xml文件編輯器
    下載站點:www.xmlbuddy.com

    Fat Jar:項目打包插件,可以將項目支持包和項目本身打成一個包。
    下載站點:http://fjep.sourceforge.net/

    Jinto:國際化插件
    下載站點:http://www.guh-software.de/

    Jasper Assistant:報表插件
    下載站點:http://www.jasperassistant.com/

    Log4E Log4j插件,提供Log4j的快速操作。Log4j專用于為程序輸入調試信息。
    下載站點:http://log4e.jayefem.de/index.php/Main_Page

    VSSplugin: VSS客戶端插件,VSS是一個和CVS齊名的版本管理系統。
    下載站點:http://sourcefore.net/projects/vssplugin

    Implementors: 當追蹤方法代碼時,Eclipse默認是轉到方法的接口類,而接口中是只有方法名稱沒有代碼的。此插件提供了追蹤到方法的實現代碼功能。
    下載頁面:http://eclipse-tools.sourceforge.net/implementors/

    Call Hierarchy: 顯示一個方法的調用層次,可以從中看到它被哪些方法調用了,以及它調用了哪些方法,是代碼追蹤比較實用的工具。
    下載站點:http://eclipse-tools.sourceforge.net/ccall-hierarchy/

    Hebernate Synchronizer: Hibernate插件,提供Hibernate的自動映射等操作。
    下載站點:http://www.binamics.com/hibernatesync/

    Profiler: 性能跟蹤、測量工具,能跟蹤、測試B/S模式開發的程序。
    下載站點:http://sourceforge.net/projects/eclipsecolorer/

    myeclipse
    http://www.myeclipseide.com/ContentExpress-display-ceid-10.html


    WindowBuilder Pro - SWT/Swing Designer
    http://www.swt-designer.com/

    posted @ 2006-09-07 10:01 rednight| 編輯 收藏

    WLS 9.1與MQ v5.3 通過JMS Bridge通信配置

    時間:2006-06-27
    作者:孟和
    瀏覽次數: 1229
    本文關鍵字:WebLogic,?MQ,?JMS,?MQSeries,?JMS Bridge
    文章工具
    推薦給朋友?推薦給朋友
    打印文章?打印文章

      最近參與一個系統的原型開發,原型要求演示WebLogic Server9.1與其他第三方產品的通信支持,包括與IBM MQSeries的雙向交互、與Tuxedo的雙向交互、支持與.NET的通過Web Service交互等。我負責完成與IBM MQSeries的雙向交互這部分,在網上找了不少文章,發現其中基本都是基于WebLogic Server 8.1實現的。因為WebLogic Server 9.1在JMS上有很大的增強,所以我參考以前的文章,自己實現了WebLogic Server 9.1與IBM MQSeries 5.3的雙向交互并且進行了測試。想必很多同行會遇到跟我一樣的問題,特此撰文一片跟大家分享。本文配置在window xp上測試成功。

    概述

      目標是實現WebLogic Server 9.1和IBM MQSeries5.3之間的的雙向交互,包括:

    • WebLogic Server 9.1消息轉發給IBM MQSeries5.3
    • IBM MQSeries 5.3消息轉發給WebLogic Server 9.1

      具體地,將WebLogic Server9.1隊列WLSSendQueue的消息轉發到IBM MQSeries 5.3隊列MQReceiveQueue,同時將IBM MQSeries 5.3隊列MQSendQueue的消息轉發到WebLogic Server 9.1隊列WLSSendQueue。

      WebLogic Server包含一個完整的、有豐富特性的消息服務器。第三方的消息服務器(如IBM MQSeries),只要其提供了JMS API的實現,也可以在其中運行。Messaging Bridge是一種由WebLogic Server提供的J2EE設備,用于轉發兩個消息提供者的消息。你可以使用Messaging Bridge將消息從一個消息提供者的目的地(隊列或者主題)移至另外一個消息提供者的目的地。因此,當WebLogic應用程序需要與第三方消息提供者 (比如IBM MQSeries)進行交互時,Messaging Bridge就可以承擔這個中間角色。我們需要做如下配置:

    • 通過WebLogic控制臺建立兩個WebLogic隊列:發送隊列WLSSendQueue和接收隊列WLSReceiveQueue。
    • 類似地,通過MQ資源管理器建立兩個MQ本地隊列:發送隊列MQSendQueue和接收隊列MQReceiveQueue。
    • 為 了實現消息轉發需要建立兩個Messaging Bridge:WLS2MQBridge 和MQ2WLSBridge 。WLS2MQBridge:將WebLogic發送隊列WLSSendQueue的消息轉發到MQ接收隊列MQReceiveQueue; MQ2WLSBridge:將MQ發送隊列MQSendQueue的消息轉發到WebLogic接收隊列WLSReceiveQueue。
    • 為 了實現事務性消息轉發, WebLogic需要使用XAQueueConnectionFactory,而MQ需要使用MQXAQueueConnectionFactory。這 就確定了WebLogic需要使用支持XA的連接工廠,MQ必須采用綁定的模式,并且WebLogic和MQ必須安裝在同一臺機器上。

    WLS配置

      WebLogic Server 9.1在WebLogic JMS的配置、部署和動態管理方面引入了重要的改進。它對JMS 1.1規范提供官方支持。此外,在系統中添加了人們期待已久的消息排序高級特性。XML API的XML消息處理功能得到了增強。在WebLogic 9.1平臺上使用JMS非常輕松有趣、可靠且迅速。下面是現有新特性中的一些亮點。

    • 自動化的 JMS 故障恢復

        自動化的JMS故障恢復是業內期待已久的特性。JMS利用“Automatic WebLogic Server Migration”特性來提供自動化的JMS故障恢復。在整個WebLogic Server實例進行故障恢復時,JMS也將自動從故障中恢復過來。盡管其他的一些JMS服務器提供商已經利用一些復雜裝置提供了這樣的功能,但 WebLogic 9.1的實現是最直觀而清晰的。

    • 排序單元

        消息排序是大多數消息處理應用程序的一項基本要求。WebLogic Server JMS即使在集群環境中也能確保消息的順序處理。它甚至可以定義多個組來將消息分組,這樣每個組都擁有自己的處理順序(如圖1所示)。

      圖1

    • 存儲轉發 (SAF)

        WebLogic存儲轉發(store and forward, SAF)服務使WebLogic Server能在通過WebLogic Server實例部署的應用程序間可靠地交付信息。SAF的強大功能使得我們可以很容易地將多個消息服務鏈接在一起(如圖2所示)。

      圖2

    • Messaging Bridge具有如下優點:
      • 不需要編碼,純配置,加速你的開發;
      • 靈活的體系結構,容易配置多個Messaging Bridges,并且而且可以動態的啟動和停止單個Messaging Bridge;
      • 采用即取即用的MQ 適配器,實現全面的MQ JMS 支持,能夠設定MQ 主題查詢;
      • 充分利用WebLogic容器進行服務管理,并且集中所有的Bridges資源在一個線程池;
      • 全面的事務處理能力,兩階段事務處理;
      • 全面的JCA 支持;
      • 確保服務質量和連接管理,實實在在的一次性服務;
      • 控制臺監視能力;
      • 集成BEA WebLogic應用與外部消息提供商,以便將新的應用與現有的投資連接起來。

    創建Server域

      創建Server Domain, domain名稱jms_domain

    修改啟動文件

      修改WebLogic的啟動文件startWebLogic.cmd。將IBM MQSeries和IBM MQSeries Java的安裝目錄加到WebLogic path下,同時將MQ JMS Java類包加入到WebLogic classpath下:

    @rem added the following to configure messaging bridge with local MQSeries installation
    set MQ_INSTALL_PATH=D:\installed\MQ
    set MQ_JAVA_INSTALL_PATH=D:\installed\MQ\Java
    set MQ_JAVA_LIB=%MQ_JAVA_INSTALL_PATH%\lib
    set MQ_CLASSPATH=%MQ_JAVA_LIB%\com.ibm.mq.jar
    set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%\com.ibm.mqbind.jar
    set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%\com.ibm.mqjms.jar
    set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%\fscontext.jar
    set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%\jms.jar
    set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%\jndi.jar
    set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%\jta.jar
    set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%\ldap.jar
    set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%\providerutil.jar
    
    set MQ_PATH=%MQ_INSTALL_PATH%\in;%MQ_JAVA_INSTALL_PATH%\in;
           %MQ_JAVA_INSTALL_PATH%\lib
    set PATH=%MQ_PATH%;%PATH%
    set CLASSPATH=%MQ_CLASSPATH%;%WEBLOGIC_CLASSPATH%;
           %POINTBASE_CLASSPATH%;%JAVA_HOME%\jre\lib\rt.jar;
          %WL_HOME%\server\lib\webservices.jar;%CLASSPATH%
    

    配置JMS

      注意WLS91的連接工廠和隊列要到JMS Modules下面設置:

    • 創建文件后備存儲BridgeFileStore
    • 創建JMS服務器BridgeJMSServer,和Paging Store設為" BridgeFileStore" ,Target為adminServer
    • 創建支持XA的連接工廠WLSCFXA,JNDI Name為bridge.wlsCFXA
    • 創建JMS發送隊列WLSSendQueue,JNDI名稱為bridge.wlsSendQueue,Target為BridgeJMSServer
    • 創建JMS接收隊列WLSReceiveQueue,JNDI名稱為bridge.wlsReceiveQueue,Target為BridgeJMSServer

    配置Messaging Bridge Destination

    • JMS Bridge Destination名稱為MQReceiveBridgeDestination
      • Adapter JNDI Name: eis.jms.WLSConnectionFactoryJNDIXA
      • Connection URL為file:/D:/installed/MQ/Queues,
      • Initial Context Factory為com.sun.jndi.fscontext.RefFSContextFactory,
      • Connection Factory JNDI Name為bridge.mqQCFXA,
      • Destination JNDI Name為bridge.mqReceiveQueue
      • Destination Type: Queue
    • JMS Bridge Destination名稱為MQSendBridgeDestination
      • Adapter JNDI Name: eis.jms.WLSConnectionFactoryJNDIXA
      • Connection URL為file:/D:/installed/MQ/Queues,
      • Initial Context Factory為com.sun.jndi.fscontext.RefFSContextFactory,
      • Connection Factory JNDI Name為bridge.mqQCFXA,
      • Destination JNDI Name為bridge.mqSendQueue
      • Destination Type: Queue
    • JMS Bridge Destination名稱為WLSReceiveBridgeDestination
      • Adapter JNDI Name: eis.jms.WLSConnectionFactoryJNDIXA
      • Connection URL為t3://localhost:7001,
      • Initial Context Factory為weblogic.jndi.WLInitialContextFactory,
      • Connection Factory JNDI Name為bridge.wlsCFXA,
      • Destination JNDI Name為bridge.wlsReceiveQueue
      • Destination Type: Queue
      • User Name: weblogic(域配置時指定的)
      • User Password: weblogic(域配置時指定的)
    • JMS Bridge Destination名稱為WLSSendBridgeDestination
      • Adapter JNDI Name: eis.jms.WLSConnectionFactoryJNDIXA
      • Connection URL為t3://localhost:7001,
      • Initial Context Factory為weblogic.jndi.WLInitialContextFactory,
      • Connection Factory JNDI Name為bridge.wlsCFXA,
      • Destination JNDI Name為bridge.wlsSendQueue,
      • Destination Type: Queue
      • User Name: weblogic(域配置時指定的)
      • User Password: weblogic(域配置時指定的)

    配置Messaging Bridge

    • JMS Bridge名稱為MQ2WLSBridge
      • Source Bridge Destination:  MQSendBridgeDestination
      • Target Bridge Destination:  WLSReceiveBridgeDestination
      • Quality Of Service:      Exactly-Once
      • Started:            Yes
    • JMS Bridge名稱為WLS2MQBridge
      • Source Bridge Destination:  WLSSendBridgeDestination
      • Target Bridge Destination:  MQReceiveBridgeDestination
      • Quality Of Service:      Exactly-Once
      • Started:            Yes

    MQ 配置

      IBM MQSeries是IBM的商業通訊中間件(Commercial Messaging Middleware)。IBM MQSeries提供一個具有工業標準,安全,可靠的信息傳輸系統。它的功能是控制和管理一個集成的商業應用,使得組成這個商業應用的多個分支程序(模塊)之間通過傳遞信息完成整個工作流程。IBM MQSeries具有特殊的技術防止信息重復傳送,確保信息一次且僅一次(once-and-only-once)傳遞,保證傳輸的可靠性。本文使用的 MQ版本為IBM MQSeries 5.3。

      IBM MQSeries基本由一個消息傳輸系統和一個應用程序接口組成,其資源是消息和隊列(Messaging and Queuing)。

      隊列管理器(Queue Manager):管理隊列的系統,實現網絡通信,保證消息安全可靠地傳輸到目的地。用于確保隊列之間的信息提供,包括網絡中不同系統上的的遠程隊列之間的信息提供。并保證網絡故障或關閉后的恢復。

      隊列:一個安全的信息存儲區。因為信息存放在隊列中,所以應用程序可以相互獨立的運行,以不同的速度,在不同的時間,在不同的地點。

      本地隊列:對程序而言,本地隊列屬于該程序所連接的隊列管理器。

      遠程隊列:該隊列不屬于該程序所連接的隊列管理器,而只是遠端隊列管理器的隊列在本地的定義。

      傳輸隊列:它是一個本地隊列,保存了指定要發送到遠端的消息。

      死信隊列:它是一個本地隊列,用于存放無法傳遞的消息。

      通道:在兩個隊列管理器之間建立起來的數據傳輸鏈路。

      應用程序接口:應用程序和信息系統之間通過MQSeries API實現的接口。

    Install MQ

    • 安裝過程中選擇自定義安裝模式,并確保安裝JMS所需的Java jar包支持如下圖:

      (缺省安裝未包含)

    Install MQ

    確認MQ服務已啟動。

      可通過MicroSoft windows控制面板中管理工具下的服務控制臺確認。如下圖:

    確認MQ服務已啟動

    從程序菜單啟動MQ 資源管理器

      如果程序提示試用版過期,可以通過修改系統時間搞定.我就是修改到了2004年。

    通過MQ資源管理器創建一個通道

      建立名為BRIDGE.CHANNEL的通道,其他參數缺省設置。

    通過MQ資源管理器創建一個通道

    通過MQ資源管理器創建兩個本地隊列

      建立兩個本地隊名為MQReceiveQueue, MQSendQueue,其他參數缺省設置。

    通過MQ資源管理器創建兩個本地隊列

    更新MQ安裝目錄下與JMS配置相關的文件

      JMSAdmin.config文件位于%MQ_INSTALLL_HOME_PATH%\Java\bin,主要定義JNDI服務的提供商,即JMS Server Factory和URL。%MQ_INSTALLL_HOME_PATH%\Java\bin目錄下新建目錄bridgeconfig,將JMSAdmin.config文件拷貝到bridgeconfig。

      使用Sun的文件JNDI服務Factory,故定義

      ?

    INITIAL_CONTEXT_FACTORY=com.sun.jndi.fscontext.RefFSContextFactory
    PROVIDER_URL=file:/D:/installed/MQ/Queues
    SECURITY_AUTHENTICATION=none
    (例子中,MQ安裝目錄%MQ_INSTALLL_HOME_PATH%為:D:/installed/MQ/)
    JMSAdmin.bat文件也位于%MQ_INSTALLL_HOME_PATH%\Java\bin,此文件用于啟動MQ的JMS命令行管理界面,要設置啟動JMS命令行管理界面所需環境變量。在JMSAdmin.bat中添加如下環境變量:
    set MQ_JAVA_INSTALL_PATH=D:\installed\MQ\Java
    set MQ_JAVA_LIB=%MQ_JAVA_INSTALL_PATH%lib
    set MQ_CLASSPATH=%MQ_JAVA_LIB%com.ibm.mq.jar
    set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%com.ibm.mqbind.jar
    set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%com.ibm.mqjms.jar
    set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%fscontext.jar
    set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%jms.jar
    set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%jta.jar
    set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%ldap.jar
    set MQ_CLASSPATH=%MQ_CLASSPATH%;%MQ_JAVA_LIB%providerutil.jar
    

    進入MQ的JMS命令行管理界面綁定MQ的JMS Factory以及JMS本地隊列

    • 開啟MicroSoft Windows的Dos窗口(cmd.exe)
    • 進入MQ安裝目錄下的java目錄下的bin目錄
    • 運行JMSAdmin.bat并通過-cfg參數指定JMSAdmin.config文件位置

        本次例子中輸入:D:\ installed\MQ\Java\bin>jmsadmin -cfg? .\bridgeconfig\jmsadmin.config

      進入MQ的JMS命令行管理界面綁定MQ的JMS Factory以及JMS本地隊列

    • 如上圖所示界面,生成一個MQXAQueueConnectionFactory對象,Messaging Bridge將使用這個工廠對象建立MQ的XA連接,使用命令DEFINE XAQCF,起名:bridge.mqQCFXA。
    • 生成JMSQueue對象來綁定MQ隊列MQReceiveQueue。
    • 生成JMSQueue對象來綁定MQ隊列MQSendQueue。
    • 使用dis ctx命令,查看目前已有的對象和綁定,可以看到XA連接工廠和隊列都已綁定。

    測試

    MQ發送,WLS接收

    1. MQ發送隊列放入測試消息

      MQ發送隊列放入測試消息

    2. 在WLS控制臺監測消息到達

      在WLS控制臺監測消息到達

    WLS發送,MQ接收

    1. WLS發送隊列放入測試消息

        執行下面的代碼,給WLS發送隊列放入測試消息

        ?

      package com.bea;
      import javax.naming.InitialContext;
      import javax.naming.Context;
      import javax.naming.NamingException;
      import javax.jms.*;
      import java.util.Hashtable;
      /**
       * Created by IntelliJ IDEA.
       * User: pmeng
       * Date: 2006-6-3
       * Time: 14:54:08
       */
      public class SendMessageTest {
          public static void main(String[] args) {       
              try {
                  Hashtable env = new Hashtable();
                  env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
                  env.put(Context.PROVIDER_URL, "t3://localhost:7001");
                  InitialContext ctx = new InitialContext(env);              
                  QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("bridge.wlsCFXA");
                  QueueConnection connection = factory.createQueueConnection();
                  QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
                  Queue queue = (Queue) ctx.lookup("bridge.wlsSendQueue");
                  connection.start();
                  QueueSender queueSender = session.createSender(queue);
                  TextMessage msg = session.createTextMessage();
                  msg.setText("Menghe.");
                  queueSender.send(msg);
              }
              catch (NamingException e) {
                  System.out.println("NamingException:" + e.getMessage());
                  e.printStackTrace();
              }
              catch (JMSException e) {
                  System.out.println("JMSException:" + e.getMessage());
                  e.printStackTrace();
              }
          }
      }
      
    2. MQ資源管理器查看接收到的消息

      MQ資源管理器查看接收到的消息

    參考資料

    1. BEA WebLogic Server 8.1 JMS與 IBM MQSeries 集成方案,周海根,
      http://dev2dev.bea.com.cn/techdoc/20040411784.html
    2. BEA WebLogic 8.1 JMS 與IBM MQ v5.3 通過JMS Message Bridge通信配置,陳仁祥
      http://e-docs.bea.com/wls/docs91/messaging.html

    posted @ 2006-09-03 21:55 rednight 閱讀(349) | 評論 (0)編輯 收藏

    轉自http://www.lrsolution.com/docs/MQvsWLJMS.html


    比較IBM MQSeries和BEA WebLogic JMS Server

    劉睿
    2005年7月

    在面向消息的中間件(MOM)這個領域,IBM MQSeries (又稱WebSphere MQ)一直是當仁不讓的超級大哥,其它還有一些小兄弟,比如SwiftMQ、SonicMQ之類。但近年來隨著J2EE中的JMS規范的建立,完備地支持JMS的服務器如雨后春筍般地出現,比如BEA WebLogic Server的JMS Server就是其中一個佼佼者。

    僅僅就JMS規范來說,MQSeries與WebLogic JMS沒有什么不同之處。但JMS規范僅僅定義了消息服務器的一個開發接口,而且還忽略了許多細節,所以不同之處就在JMS規范之外的這些內容,很多也是非常重要的??偟膩碚f,MQSeries的功能和性能方面明顯占優,而WebLogic JMS的某些JMS配置更加簡單易行。

    在本文中,我盡量試圖從客觀的角度分析兩種產品的差異,如有不妥之處,請讀者不吝賜教。

    1. 產品體系架構不同造成的差異

    WebLogic JMS是一個純Java實現的支持C-S架構的實現JMS規范的服務器產品;而MQSeries是使用本地語言(比如在UNIX和Windows上的C語言)編寫的既支持C-S架構,又支持對等訪問的實現完備MOM(包括JMS規范)的產品。于是就產生出以下的不同點:

    1.1 MQSeries支持真正的異步數據傳輸;而WebLogic JMS不支持。

    異步發送數據到遠端的消息服務器,是MQSeries等完備的MOM的特色。JMS規范規定了一個C-S架構,定義了JMS客戶機與JMS服務器的開發接口,并沒有定義JMS服務器與JMS服務器的規范,而客戶機方面沒有任何隊列,所以只能說是規范了消息的存取,而沒有規范消息數據的傳輸。因為JMS客戶機并不擁有存放數據的隊列,所以所有發送的操作都要由應用程序來控制,JMS服務器本身并不代理傳輸,也不保證數據在遠程隊列間傳輸的可靠性。WebLogic JMS就是這樣的體系。

    這種體系結構有時候是不能直接滿足應用的要求的。首先,為了充分利用資源和提高效率,許多應用需要采用異步消息的機制。其次,許多需要快速返回的應用也必須使用異步傳輸。比如電話自動語音應答(IVR)的程序,某個操作需要把數據傳輸到遠程的服務器上,但是必須立即返回,接受客戶的下一個按鍵。

    MQSeries通過通道與傳輸隊列和遠程隊列來完成這一任務。能充分利用網絡的帶寬,甚至支持斷網續傳,保證數據傳輸的可靠性。當然,雖然應用程序不必作任何工作,但配置方面確實還要多學一些概念。

    1.2 MQSeries支持多種語言的開發;而WebLogic JMS基本上只支持JAVA

    MQSeries支持的語言包括C, C++, COBOL, JAVA, PL/1, REXX, RPG, Visual Basic (使用COM/ActiveX)等。老板本的MQSeries支持JAVA是通過一個叫MA88的SupportPac來實現,雖然經過廣泛的使用和驗證,但給人的感覺是不太方便。好在從5.3版起(目前最新的是6.0版),JAVA支持已經內置在MQSeries中。

    WebLogic JMS一般只支持JAVA開發。但BEA也在dev2dev.bea.com網站上提供了一套免費的C的支持,稱作“JMS C API”。參見http://dev2dev.bea.com/utilitiestools/environment.html?highlight=utilitiestools。但這個工具與老的MA88也是不能相提并論的,因為BEA并不真正支持它,因此也基本沒有什么用戶。參見BEA網站上關于“JMS C API”的警告:

    This is *not* a supported product of BEA. However, if you have questions about this API you can post them to weblogic.developer.interest.jms.

    1.3 純JAVA實現的利與弊

    MQSeries是用本地語言實現的,因此帶來的好處是高性能和高并發的支持能力。MQSeries相對WebLogic JMS等產品的性能優勢是非常明顯的,所以MQSeries非常適于企業級的大數據量和高并發的數據傳輸業務。誰也無法想象一個企業級的數據應用會采用一個純Java實現的數據庫,因為其性能無法滿足要求,對較大的數據傳輸應用也是一樣的,純Java實現的JMS服務器例如WebLogic JMS無法滿足其性能的要求。

    純JAVA實現的JMS服務器也有其好處,就是與其它的J2EE服務完美地集成在一起。所以WebLogic的JMS配置顯得更簡潔。WebSphere+MQSeries也配合得很好,但總是能感覺到是這兩個產品。WebLogic JMS的對象體系完全符合JMS的概念體系。而MQSeries要通過WebSphere Application Server或者一個叫JMSAdmin的工具,借助于目錄服務來完成MQSeries概念體系到JMS概念體系的映射。應該是看到了這件事造成的麻煩,所以IBM在WebSphere v6也提供了一套純JAVA實現的、與MQSeries可以互操作的JMS服務器。另外一點是WebLogic不需要WebSphere以及MQSeries那樣的冗長的CLASSPATH等環境變量的設置,這點對開發人員有吸引力。

    1.4 MQSeries的通信功能更加強大,WebLogic JMS也有自己的一些特色

    JMS對通信功能的要求很少,所以對二者對通信支持能力還是有很大的差別的。總的來說,歷史更悠久的MQSeries占優,但WebLogic JMS也有自己的特色。

    • MQSeries支持支持真正的遠程異步數據傳輸,甚至支持消息的路由,可以“多級跳”;WebLogic JMS不支持。
    • MQSeries支持消息的分組和分段傳輸,對于大消息傳輸和不穩定的網絡非常有意義。WebLogic JMS沒有這方面的功能。
    • 二者都支持SSL、持久性、優先級、超時等功能。除了完備的SSL實現之外,MQSeries的安全體系 遭到了一些批評,使用通道的安全出口程序顯得很麻煩,而使用用戶名稱但無須口令保護的遠程數據通信,如何能令人滿意?但在這一點上WebLogic JMS也很難說就好一些,因為WebLogic JMS僅僅支持C-S的操作,系統本身并不支持遠程的數據傳輸(需要應用實現)。
    • WebLogic JMS支持IP多播會話,能顯著地提高 局域網內廣播通信的性能,但這種方式不保證數據接收的可靠性,只適于某些特定的應用。MQSeries本身不提供此功能,但在Event Broker和Message Broker等MQSeries的升級產品中提供IP多播的支持。

    1.5 MQSeries的管理功能更加強大

    JMS對管理功能的要求很少,在這方面MQSeries也有比較明顯的優勢。

    • JMS對事務處理的支持包括的對XASession和XAConnection實現,這一點對MQSeries和WebLogic JMS是相同的。MQSeries本身還可以作為事務管理器,協調兩階段提交。
    • MQSeries和WebLogic JMS都支持Message Driven Bean作為觸發新的應用的一種方式。WebLogic JMS還支持一種稱作Session Pool的類似的觸發機制。但這類觸發機制過于簡化,也就是每個消息都觸發一個新的線程的應用。MQSeries的觸發機制更豐富,不但包括這種被稱作Every的方式,還包括First和Depth等方式。另外MQSeries還可以觸發各種執行程序或者MQSeries的通道。
    • MQSeries擁有一套完備的日志系統,可以進行獨立的系統備份和恢復,因此適于高規格的數據/消息傳輸的應用。WebLogic JMS沒有這方面的支持。

     

    2. 產品歷史的不同造成的差異

    MQSeries是個歷史悠久的產品,而WebLogic JMS是個新兵,因此會有以下的差異:

    2.1 MQSeries支持更多的系統平臺

    支持30多種系統平臺。當然值得注意的是某些平臺的MQSeries是由合作伙伴實現的。

    WebLogic JMS是個新產品,支持的平臺數與WebLogic Server一樣,只有常用的幾個。有人說所有支持JDK的平臺都能跑WebLogic JMS的客戶機,這是不正確的說法。因為JMS是J2EE規范的一種,J2SE的SDK并不包括JMS的支持,更不要說支持WebLogic的J2EE了。

    2.2 MQSeries支持更多的 通信協議

    MQSeries支持很多通信協議,但目前在實踐中常用的是TCP/IP協議和SNA協議。

    WebLogic JMS僅支持TCP/IP協議。

    有些人對MQSeries的單向通道的概念提出了異議,認為增加了配置的復雜性,僅僅是SNA協議的需要,而不是TCP/IP協議的需要。我個人認為這點也不無一些道理。但是在有防火墻的TCP/IP網絡上,不同的方向還是有差異的。

     

    3. 群集實現的差異

    MQSeries與WebLogic JMS在支持群集時,差異比較大,應該說各有各的特點。

    • MQSeries的群集建立在配置庫和群集通道基礎之上,可以定義“共享隊列”;WebLogic JMS的群集建立在WebLogic群集基礎之上,可以定義“分布式隊列”。
    • MQSeries在寫共享隊列時,如果發現本地有,就只寫本地的隊列(這稱作本地優先);如果本地沒有,就會輪流寫到所有定義了此共享隊列的隊列管理器。MQSeries在讀共享隊列時,只能從本地取。WebLogic JMS在讀寫分布式隊列時,不受本地影響,總是進行輪流或權重選擇。聽起來似乎WebLogic JMS的群集更靈活,其實也不盡然。當取得了JMS的對象QueueSender或QueueReceiver后,WebLogic實際上已經綁定了一個JMS服務器的實例。如果每次寫或讀一個消息,都重新生成QueueSender或QueueReceiver,雖然比較好地支持了負載均衡,但勢必造成很大的性能損失。而MQSeries在輪流寫共享隊列時,沒有這方面的問題。
    • WebLogic JMS的分布式隊列有一個叫做Forward Delay的有意思的屬性,定義了一個時間的長度。系統一旦發現超過這個時間長度,還沒有人讀這個隊列,就把它的消息轉送給群集中有消費者的隊列。有了這個屬性,應用程序就可以只從一個JMS服務器的實例讀消息了。

    posted @ 2006-09-03 21:53 rednight 閱讀(241) | 評論 (0)編輯 收藏

    僅列出標題
    共4頁: 上一頁 1 2 3 4 下一頁 
    主站蜘蛛池模板: 你懂的网址免费国产| 亚洲午夜未满十八勿入网站2| 亚洲中文字幕AV在天堂| 日本无吗免费一二区| 在线观看免费视频网站色| 亚洲嫩草影院在线观看| 亚洲精品无码专区2| 91人人区免费区人人| 国产亚洲精品欧洲在线观看| 亚洲va在线va天堂va不卡下载| 亚洲国产免费综合| 亚洲精品中文字幕乱码| 国产区卡一卡二卡三乱码免费| 久久久久成人精品免费播放动漫| 国产亚洲中文日本不卡二区| 国产精品亚洲综合一区| 国产一卡2卡3卡4卡2021免费观看| 一区二区三区免费在线观看| 国产成人亚洲合集青青草原精品 | 成人午夜免费视频| 亚洲av无码国产精品色在线看不卡| 免费人成黄页在线观看日本| 亚洲AV无码专区国产乱码不卡| 午夜亚洲AV日韩AV无码大全| 日本成人在线免费观看| 2019中文字幕免费电影在线播放| 色爽黄1000部免费软件下载| 国产亚洲中文日本不卡二区| 亚洲AV无码国产精品麻豆天美 | 久久久久亚洲AV片无码| 免费人妻av无码专区| 永久免费在线观看视频| 水蜜桃视频在线观看免费播放高清| 亚洲男人的天堂网站| 亚洲精品国产福利在线观看| 国产亚洲无线码一区二区| 国产大片91精品免费观看男同 | 最刺激黄a大片免费网站| 一级毛片高清免费播放| 亚洲av成人无码网站…| 亚洲已满18点击进入在线观看|