`
qtlkw
  • 浏览: 299837 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

WebSphere MQ Version 7 发布订阅相关配置

阅读更多
转载自: http://www.devx.com/Java/Article/41921/1954

Message-oriented middleware (MOM) decouples applications by allowing them to communicate using one of two messaging models: point-to-point messaging and publish/subscribe messaging. The models differ in fundamental ways, but neither requires applications to know the other’s implementation details.

Point-to-point messaging achieves only partial decoupling of applications, because you still need to know where to put messages. Publish/subscribe provides a higher degree of independence and reduces design complexity in many cases, but it requires more coding and configuration. Traditionally, MOM shops have opted for point-to-point messaging to avoid the more complex requirements of publish/subscribe.

Enter IBM WebSphere MQ (WMQ), Version 7. This latest release of WMQ aims to make coding and configuring publish/subscribe easier and more intuitive. A previous DevX article focused on the point-to-point messaging capabilities of WMQ. This article explains WMQ's publish/subscribe messaging.

Publish/Subscribe Messaging Overview
Publish/subscribe is the messaging-oriented equivalent of the object-oriented observer design pattern. In publish/subscribe messaging, a sender application creates a message containing the information it wants to send and assigns it a topic that denotes the subject of the information. This message is called a publication. WMQ receives the publication, recognizes the topic, and then distributes the publication to interested applications.

Specifically, WMQ publish/subscribe components include:
  Publisher (information producer): This component generates messages (publications) under a certain subject (topic) and sends the publications to a WMQ queue manager. A publisher knows nothing about the recipient(s) of the information.
  Subscriber (information consumer/receiver): This component registers interest in a certain topic(s) with a WMQ queue manager. It also specifies its subscription queue name; that is, the queue where it wants to receive the messages related to this topic. The subscriber knows nothing about the information publishers(s).
  A publications router: This component passes messages from publishers to topic subscribers. Earlier WMQ versions required a broker component on top of a queue manager to enable publish/subscribe. The broker maintained topics and subscriptions, and it routed publications. In WMQ Version 7, IBM changed this approach significantly. The queue manager is now responsible for topics, subscriptions, and routing publications. Also, MQ Explorer for Version 7 allows you to create topics and subscriptions graphically.
Figure 1 shows a basic MQ publish/subscribe setup.


A publish/subscribe system can have many publishers and many subscribers, and often, two or more queue managers communicating with one another. Also, an application can be both a publisher and a subscriber.

A Publish/Subscribe Scenario
Suppose a company sends notifications to its clients via email and Short Message Service (SMS) based on information received from various information providers (say, news and weather services). If the company adds another provider (say, for entertainment), it will have to configure the new provider to write messages to both SMS and email queues. Figure 2 shows the point-to-point implementation for this use case, and Figure 3 shows the publish/subscribe implementation.




Set Up Your Own Publish/Subscribe Use Case
In this section, you will create a publish/subscribe setup resembling part of the use case in Figure 3. You will create a publisher for the news topic and two subscriptions for the email and SMS applications using the following procedure:

   1. Create a queue manager.
   2. Create a news topic.
   3. Create subscription queues.
   4. Create subscriptions.
   5. Create Java Messaging Services (JMS)-administered objects.
   6. Write publisher and subscriber classes.
   7. Run the classes.

This tutorial uses MQ Version 7 on Windows XP. (Download a trial version from the IBM web site.) Installation on Windows is straightforward. Just keep all the default values as you go through the installation wizard, but be sure to perform the installation as a user from the administrators group.

Don't worry if you haven't used WMQ before. You will use the Eclipse-based WebSphere MQ Explorer, an easy GUI for administering WMQ, to perform basic definitions.

Start WebSphere MQ Explorer as follows: Start –> All Programs –> IBM WebSphere MQ –> WebSphere MQ Explorer. If this is the first time you are starting MQ Explorer, a welcome screen will appear. Just close the welcome screen.

Create a Queue Manager
   1. In MQ Explorer's Navigator view, right-click Queue Managers and then select New –> Queue Manager. This starts the "Create Queue Manager" wizard.
   2. On Step 1, enter TestQM as the queue manager name and enter the name of the default Dead Letter Queue which is SYSTEM.DEAD.LETTER.QUEUE, then click Next (see Figure 4).
   3. Click Next on the wizard screens for Steps 2 and 3. At Step 4, make sure "Create listener configured for TCP/IP" is checked and the entered port number is free (see Figure 5), and then click Finish.





Create a News Topic
   1. Under TestQM, right-click Topics and then select New –> Topic to start the "New Topic" wizard.
   2. Type News.Topic as the topic name (see Figure 6). This represents the WMQ administrative object used to manage the topic. Click Next.
   3. On the topic properties page, type News in the "Topic string" field (see Figure 7). This string is used when creating JMS administered objects to refer to the News topic. Click Finish.





Create Subscription Queues
Next, you will set up news publications to be delivered to Subscription queues. Create two queues for the email and SMS applications:

   1. Under TestQM, right-click Queues then select New –> Local Queue to start the "New Local Queue" wizard.
   2. In the name field, type Email.Queue and click Finish.
   3. Repeat the above steps to create another queue called SMS.Queue.

Create Subscriptions
In order to receive a topic's publications, subscribers have to register interest in the topic. They use subscriptions to accomplish this. You can can create subscriptions programmatically or through MQ Explorer. Through the following steps, you will create two subscriptions using MQ Explorer:

   1. Under TestQM, right-click Subscriptions and then select New –> Subscription to start the "New Subscription" wizard.
   2. In the name field, type EmailSubscription and click Next (see Figure8). In the "Change properties" page, press the Select button next to the "Topic name" and then select News.Topic from the displayed topics list. Press OK. On the same page, type Email.Queue in the destination name field (see Figure 9). Click Finish.





  3. Repeat the above steps to create another subscription called SMSSubscription with the topic set to News.Topic  and the destination name set to SMS.Queue.

A Quick Test for Your Publish/Subscribe Setup
Perform the following to verify you have correctly completed the setup for the News topic:

   1. Under TestQM, click Topics.
   2. In the right pane, right click News.Topic and select "Test Publication" to open the test window.
   3. In the message data field, type "publish/subscribe test" (or any other text), click the "Publish message" button, and then click the Close button. This should distribute the message to the subscriber queues Email.Queue and SMS.Queue.
   4. Under TestQM, click Queues.
   5. In the right pane, right click Email.Queue and select "Browse Messages." When the browse messages window opens, search the "Message Data" column for the text you entered. You should also see the same message in SMS.Queue.
   6. Right click Email.Queue and select "Clear Messages." Click the Clear button in the "Clear queue" window. Do the same for SMS.Queue.

Create JMS-Administered Objects
JMS applications require you to wrap vendor-specific objects in JMS-administered objects. To store JMS-administered objects, create a file-based Java Naming and Directory Interface (JNDI) namespace. Start by adding a new initial context:

   1. Right-click JMS-Administered Objects and then select Add Initial Context.
   2. On Screen 1:
                  Select "File System" for "Where is the JNDI located."
                  For the Bindings directory, browse to C:\JNDI-Directory  (This directory has to exist).
                  Keep note of the factory class and provider URL; you will use them in the Java code (see Figure 10).
                  Click Finish.



Next, create a JMS Connection factory and destinations under the Initial Context.

Create a Connection Factory
   1. Right-click Connection Factories and then select New –> Connection Factory. On the first screen, type TestQMConnectionFactory in the name field and click Next (see Figure 11). You will use TestQMConnectionFactory in the JNDI lookup.
   2. Click Next on Step 2, Step 3, and Step 4.
   3. On the last page, select the connection tab (on the left) and then click the Select button to select TestQM as "Base queue manager" (See Figure 12). Click Finish.





Create Destinations
JMS destinations wrap WMQ topics and queues. Create a destination corresponding to the News topic:

   1. Right-click destinations and select New –> Destination to start the "New Destination" wizard.
   2. In the first step, enter NewsTopic in the Name field and change the Type field to Topic (See Figure 13). Click Next.
   3. Click Next on the second screen.
   4. On the last page (Change properties), type News in the Topic field and then click Finish (See Figure 14). This is the topic string you defined when you created the News topic.





Create two destinations corresponding to the subscriber queues:

   1. Right-click destinations and then select New –> Destination to start the new "Destination wizard."
   2. In the first step, type EmailQueue in the Name field and then click Next.
   3. Click Next on the second screen.
   4. On the last page, click the Select button next to the "Queue Manager" field and select TestQM from the list.
   5. Click the Select button next to the Queue field and select Email (See Figure 15). Queue from the list. Click Finish.
   6. Repeat the above steps to create another Destination called SMSQueue for SMS.Queue. Your destinations should look like the ones in Figure 16.





Coding JMS Publishers and Subscribers
After you have defined your topics and subscriptions through the MQ Explorer, writing publisher and subscriber applications is easy. To publish a message, you must write a message to a topic (just as you would with a queue). Subscribers simply read messages from queues.

The downloadable source code for this article uses generic JMS interfaces, which treat queues and topics uniformly as destinations. It provides compiled classes that include a News publisher and two subscribers (corresponding to the Email and SMS applications).

The following are brief explanations of the classes.

JNDIUtil Class
This class includes methods to retrieve objects by name through JNDI lookup (see Listing 1).
Listing 1. JNDIUtil Class
This class includes methods to retrieve objects by name through JNDI lookup.

package devx.articles.pubsub;

//JMS classes
import javax.jms.JMSException;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;

//JNDI classes
import javax.naming.InitialContext;
import javax.naming.Context;
import javax.naming.NamingException;

//Standard Java classes
import java.util.Hashtable;

/**
* 
* A wrapper class for JNDI calls
*
*/
public class JNDIUtil
{
	private Context context;
	
	public JNDIUtil(String icf, String url) throws JMSException, NamingException
	{
		Hashtable environment = new Hashtable();

		environment.put(Context.INITIAL_CONTEXT_FACTORY, icf );	
		environment.put(Context.PROVIDER_URL, url);

     context= new InitialContext( environment );
		
	}
	
	/**
	 * @param ObjName Object Name to be retrieved
	 * @return Retrieved Object
	 * @throws NamingException
	 */
	private Object getObjectByName(String ObjName) throws NamingException
	{
		return context.lookup( ObjName );
	}
	
	/**
	 * @param factoryName Factory Name
	 * @return ConnectionFactory object
	 * @throws NamingException
	 */
	public ConnectionFactory getConnectionFactory(String factoryName) throws NamingException
	{
		return (ConnectionFactory) getObjectByName(factoryName);
	}

	/**
	 * @param destinationName Destination Name
	 * @return ConnectionFactory object
	 * @throws NamingException
	 */
	public Destination getDestination(String destinationName) throws NamingException
	{
		return (Destination) getObjectByName(destinationName);
	}
	
}
You will use methods in this class to retrieve references to the JMS objects you have already defined.

NewsPublisher Class
This class publishes messages to the News topic (see Listing 2).
package devx.articles.pubsub;

//JMS classes
import javax.jms.JMSException;
import javax.jms.ConnectionFactory;
import javax.jms.Connection;
import javax.jms.Session;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.TextMessage;

//JNDI classes
import javax.naming.NamingException;

/**
 * A class to demonstrate how to a publish to a topic.
 */
public class NewsPublisher
{

    public static String icf = "com.sun.jndi.fscontext.RefFSContextFactory";
    public static String url = "file:/C:/JNDI-Directory";
   
	public static void main(String[] vars) throws JMSException, NamingException
	{
	    
	    ConnectionFactory factory = null;
	    Connection connection = null;
	    Session session = null;
	    Destination destination= null; // a destination can be a topic or a queue
	    MessageProducer producer= null; 
	    
	    try
	    {   
      
	    	JNDIUtil jndiUtil= new JNDIUtil(icf,url);
	    	
		    factory= jndiUtil.getConnectionFactory("TestQMConnectionFactory");
		    
		    connection = factory.createConnection();		    
		    connection.start();
		    
		    // Indicate a non-transactional session 
		    boolean transacted = false;
		    session = connection.createSession( transacted, Session.AUTO_ACKNOWLEDGE);		    
 
		    destination = jndiUtil.getDestination("NewsTopic");
		    
		    producer = session.createProducer(destination);
		    
            TextMessage message = session.createTextMessage("No News is Good News!");
            producer.send(message);	
            
            System.out.println("NewsPublisher: Message Publication Completed");
		    
	    }
	    finally
	    {
	    	// Always release resources
	        
	    	if ( producer!= null )
	    	    producer.close();   
            
	    	if ( session!= null )
	    		session.close();

	    	if ( connection!= null )
	    		connection.close();
	        
	    }    
	}			
}

The starting point is a connection factory lookup. You use the factory to create a connection:

factory= jndiUtil.getConnectionFactory("TestQMConnectionFactory");
connection = factory.createConnection();

You use the connection object to create a session:

session = connection.createSession( transacted, Session.AUTO_ACKNOWLEDGE);

To publish messages, retrieve a News destination object, create a MessageProducer, and then send messages:

destination = jndiUtil.getDestination("NewsTopic");
producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("No News is Good News!");
producer.send(message);

EmailSubscriber and SMSSubscriber
These two classes represent the email application and the SMS application (see Listing 3 and Listing 4). Because you already defined subscriptions in MQ Explorer, the two applications simply read messages from the subscriber queues.
Listing 3. EmailSubscriber
This class represents the email application.

package devx.articles.pubsub;

//JMS classes
import javax.jms.JMSException;
import javax.jms.ConnectionFactory;
import javax.jms.Connection;
import javax.jms.Session;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.TextMessage;


//JNDI classes
import javax.naming.NamingException;

/**
 * A class to demonstrate how to retrieve publications from subscription queues.
 */
public class EmailSubscriber
{

    public static String icf = "com.sun.jndi.fscontext.RefFSContextFactory";
    public static String url = "file:/C:/JNDI-Directory";
   
	public static void main(String[] vars) throws JMSException, NamingException
	{
	    
	    ConnectionFactory factory = null;
	    Connection connection = null;
	    Session session = null;
	    Destination destination= null; // a destination can be a topic or a queue
	    MessageConsumer consumer= null; 
	    
	    try
	    {   
      
	    	JNDIUtil jndiUtil= new JNDIUtil(icf,url);
	    	
		    factory= jndiUtil.getConnectionFactory("TestQMConnectionFactory");
		    
		    connection = factory.createConnection();		    
		    connection.start();
		    	
		    // Indicate a non-transactional session 
		    boolean transacted = false;
		    session = connection.createSession( transacted, Session.AUTO_ACKNOWLEDGE);		    

		    destination = jndiUtil.getDestination("EmailQueue");
		    
		    consumer = session.createConsumer(destination);
	        
        	TextMessage iMsg = (TextMessage) consumer.receive(1000);

        	if ( iMsg != null )	        	
	        	System.out.println(  iMsg.getText()  );
	        else
	        	System.out.println(  "No messages in queue "  );
        
            System.out.println("EmailSubscriber: Message Reading Completed");        	
		    
	    }
	    finally
	    {
	    	// Always release resources
	        
	    	if ( consumer!= null )
	    	    consumer.close();   
            
	    	if ( session!= null )
	    		session.close();

	    	if ( connection!= null )
	    		connection.close();
	        
	    }    
	}			
}
Listing 4. SMSSubscriber
This class represents the SMS application.

package devx.articles.pubsub;

//JMS classes
import javax.jms.JMSException;
import javax.jms.ConnectionFactory;
import javax.jms.Connection;
import javax.jms.Session;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.TextMessage;


//JNDI classes
import javax.naming.NamingException;

/**
 * A class to demonstrate how to retrieve publications from subscription queues.
 */
public class SMSSubscriber
{

    public static String icf = "com.sun.jndi.fscontext.RefFSContextFactory";
    public static String url = "file:/C:/JNDI-Directory";
   
	public static void main(String[] vars) throws JMSException, NamingException
	{
	    
	    ConnectionFactory factory = null;
	    Connection connection = null;
	    Session session = null;
	    Destination destination= null; // a destination can be a topic or a queue
	    MessageConsumer consumer= null; 
	    
	    try
	    {   
      
	    	JNDIUtil jndiUtil= new JNDIUtil(icf,url);
	    	
		    factory= jndiUtil.getConnectionFactory("TestQMConnectionFactory");
		    
		    connection = factory.createConnection();		    
		    connection.start();
		    	
		    // Indicate a non-transactional session 
		    boolean transacted = false;
		    session = connection.createSession( transacted, Session.AUTO_ACKNOWLEDGE);		    

		    destination = jndiUtil.getDestination("SMSQueue");
		    
		    consumer = session.createConsumer(destination);
	        
        	TextMessage iMsg = (TextMessage) consumer.receive(1000);
	        
	        if ( iMsg != null )	        	
	        	System.out.println(  iMsg.getText()  );
	        else
	        	System.out.println(  "No messages in queue "  );
		    
            System.out.println("SMSSubscriber: Message Reading Completed");	        
	    }
	    finally
	    {
	    	// Always release resources
	        
	    	if ( consumer!= null )
	    	    consumer.close();   
            
	    	if ( session!= null )
	    		session.close();

	    	if ( connection!= null )
	    		connection.close();
	        
	    }    
	}			
}


The code is similar to the NewsPublisher class, except that it uses a MessageConsumer to retrieve messages from queues:

consumer = session.createConsumer(destination);
TextMessage iMsg = (TextMessage) consumer.receive(1000);

Compiling and Running the Sample Classes
The JAR files required to compile and run the sample classes are automatically added to the CLASSPATH environment variable when you install WMQ. The required JARs are located in C:\Program Files\IBM\WebSphere MQ\Java\lib, including the JARs you need for JMS and JNDI. You just need to add the sample classes from the code download to your CLASSPATH environment variable.

To publish messages, run the NewsPublisher:

java devx.articles.pubsub.NewsPublisher

Run both subscribers after your run the NewsPublisher to retrieve messages. Each class should retrieve its own copy of the messages published by NewsPublisher:

java devx.articles.pubsub.EmailSubscriber
java devx.articles.pubsub.SMSSubscriber

You're done. Your sample classes should compile and run successfully.

So the next time you're designing messaging-based applications, don't be so quick to dismiss publish/subscribe. Remember this article and how quickly you were able to get started with publish/subscribe messaging.

WebSphere Version 6 和 Version 7的不同参考:
http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp?topic=/com.ibm.mq.csqzao.doc/mi29080_.htm
  • 大小: 11.2 KB
  • 大小: 26.4 KB
  • 大小: 26.1 KB
  • 大小: 38.5 KB
  • 大小: 56.1 KB
  • 大小: 33.5 KB
  • 大小: 60.1 KB
  • 大小: 44.6 KB
  • 大小: 41.1 KB
  • 大小: 70.8 KB
  • 大小: 52.3 KB
  • 大小: 44.7 KB
  • 大小: 48.1 KB
  • 大小: 58.5 KB
  • 大小: 30.8 KB
  • 大小: 32.6 KB
分享到:
评论
1 楼 xiaozi7 2012-10-26  
非常感谢,楼主的英语水平不一般那

相关推荐

    Websphere MQ入门教程7

    第二部分 WebSphere MQ系统管理,分为六章,分别介绍安装、配置、管理、控制命令和问题确定;第三部分 WebSphere MQ应用开发,由五章组成,介绍程序设计、编写和例子程序。 本书是WebSphere MQ产品的实用指南,...

    WebSphere MQ自学笔记

    本人自学IBM的WebSphereMQ自学笔记,内有MQ安装文档,建MQ的例子等。 1、 MQ6.0安装 2 1.1 启动MQ v6.0 安装程序 2 1.2 软件需求检查 2 1.3 WebSphere Eclipse Platform V3.0.1软件安装 2 1.4 网络配置检查 3 1.5 ...

    WebSphere MQ配置.rar

    WebSphere MQ配置.rar WebSphere MQ配置.rar WebSphere MQ配置.rar

    Websphere MQ入门教程

    6.2.4 WebSphere MQ对象配置实例 81 6.3通道的维护 83 6.3.1通道的状态 83 6.3.2通道维护命令 84 6.3.3设置MaxChannels和MaxActiveChannels属性 88 6.4配置侦听程序 88 6.4.1 Windows 平台 88 6.4.2 unix 平台 88 ...

    IBM WebSphere MQ 安装包

    IBM WebSphere MQ是IBM业界领先面向消息的中间件产品,也是MQ系列产品的基础和核心,它使不同的应用程序能够以企业级的性能,在广泛的平台上安全而可靠地通讯。

    WebSphere MQ Version 6 and Web Services

    WebSphere MQ Version 6 and Web Services.pdf

    WebSphere MQ 开发培训

    WebSphere MQ 开发培训 IBM软件部 软件部 WebSphere MQ 议程 WebSphere MQ 概览 WebSphere MQ 安装配置 WebSphere MQ 应用开发 WebSphere MQ 参考

    非常全面的WebsphereMQ的PDF学习资料

    Websphere MQ Programming Guide,Websphere MQ Using C++,WebSphere MQ Using Java,WEBSPHERE MQ6.0 JAVA编程,WebSphere MQ基础教程,IBM WEBSPHERE MQ教程,精通WebSphere MQ,WebSphere MQ开发快速入门,IBM ...

    IBM Websphere mq安装

    IBM Websphere mq安装IBM Websphere mq安装

    Websphere MQ JavaJMS 客户端的 SSL 配置.doc

    Websphere MQ JavaJMS 客户端的 SSL 配置.doc

    WebSphereMQ_V7.5.0.2_for_Windows(4-1)

    WebSphere® MQ (也称MQSeries)以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过为重要的消息和事务提供可靠的、一次且仅一次的传递,Websphere MQ 可以处理...

    WebSphere MQ

    WebSphere MQ WebSphere MQWebSphere MQ WebSphere MQ

    WebSphere MQ7.0配置与测试(java 源码,含图)

    WebSphere MQ7.0配置与测试 WebSphere MQ发送接收消息的实现 附java 源码

    WebSphere MQ介绍教程

    IBM WebSphere MQ版本v7的开发者使用简介,有助于初学者了解MQ的知识。

    websphere mq远程通信配置

    websphere mq是一个非常好的中间件。但是帮助说明做得实在有点过分,居然按照上面的一步一步的做就直接报错,永远调试不通。网上一搜,都是一篇文章四处转载,愤怒!!!各位网民还是先自己动手测试下在转载吧。这篇...

    websphere mq常用命令

    websphere mq常用命令 websphere mq常用命令

    IBM WebSphere MQ 技术白皮书.doc

    IBM WebSphere MQ 技术白皮书.doc

    IBM Websphere MQ 教程之备份与恢复

    IBM Websphere MQ 教程之备份与恢复

    WebSphereMQ_V7.5.0.2_for_Windows.part2.rar

    WebSphere® MQ (也称MQSeries)以一致的、可靠的和易于管理的方式来连接应用程序,并为跨部门、企业范围的集成提供了可靠的基础。通过为重要的消息和事务提供可靠的、一次且仅一次的传递,Websphere MQ 可以处理...

Global site tag (gtag.js) - Google Analytics