Java JMS客户端 - 绑定到特定的本地端口

时间:2015-08-25 13:05:13

标签: java jms weblogic

我有一个简单的JMS客户端java代码,它连接到weblogic应用程序服务器并将消息发送到定义的jms队列。

对于JMS客户端与服务器建立的每个连接,在具有JMS队列的Weblogic应用程序服务器与运行JMS客户端代码的计算机之间存在基础TCP连接。

根据我的有限知识,我认为连接中的本地端口是随机选择的。如果这是错误的,请纠正我。

在我们的生产服务器中,由于一些严格的客户策略,我们被要求将本地端口限制为固定端口范围而不是任何随机端口。是否可以通过在JMS客户端代码中指定任何连接工厂属性来执行相同操作。

E.g. 
192.19.81.223 -> m/c where Weblogic is installed
7001 -> Weblogic Server admin port, where the JMS Server is targeted
192.19.105.54 -> m/c where the JMS Client code is running
61372 -> Random port being selected in the m/c where JMS Client is run.

$home > netstat -an|grep 7001
tcp        0      0 ::ffff:192.19.81.223:7001   :::*                             LISTEN
tcp        0      0 ::ffff:192.19.81.223:7001   ::ffff:192.19.105.54:61372     ESTABLISHED

每次运行客户端代码时,随机端口都会从61372变为59874,56987等... 我无法修复此端口号。到一定值或一系列值。

如果可以的话,请告诉我。

示例JMS客户端代码:

import java.io.File;
import java.io.IOException;
import java.util.Hashtable;

import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.naming.directory.InitialDirContext;

import org.apache.commons.io.FileUtils;

public class JmsSender
{
    private static InitialContext ctx = null;
    private static ConnectionFactory connFactory = null;

    public static void main(String[] args) throws Exception
    {
    initializeContext();
    createConnectionFactory();
    sendToQueue();
    }


    private static void sendToQueue() {
    QueueSession queueSession = null;
    try
    {
        Queue queue = getQueue();
        queueSession = getQueueSession();
        MessageProducer producer = queueSession.createSender(queue);
        createMessagesAndSend(queueSession, producer);
    }
    catch (Exception e){
        e.printStackTrace();
    }
    finally
    {
        try {
        if(queueSession != null)
            queueSession.close();
        } catch (JMSException e) {
        e.printStackTrace();
        }
    }
    }

    private static void createMessagesAndSend(Session session, MessageProducer producer) throws IOException, JMSException {
    String buffer = FileUtils.readFileToString(new File("D:\\Testdata\\SAMPLE.txt"));
    TextMessage message = session.createTextMessage(buffer);
    producer.send(message);
    }


    private static QueueSession getQueueSession() throws NamingException, JMSException {
    QueueConnection queueConn = ((QueueConnectionFactory)connFactory).createQueueConnection();
    QueueSession queueSession = queueConn.createQueueSession(false, Session.DUPS_OK_ACKNOWLEDGE);
    return queueSession;
    }

    private static void createConnectionFactory() throws NamingException {
    connFactory = (ConnectionFactory) ctx.lookup("jms/ConnectionFactory");
    }

    private static void initializeContext() throws NamingException {
    ctx = new InitialDirContext(getProperties());
    }

    private static Hashtable<String,String> getProperties() {
    Hashtable<String,String> environment = new Hashtable<String,String>();
    environment.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
    environment.put(Context.PROVIDER_URL, "t3://192.19.81.223:7001");
    environment.put(Context.REFERRAL, "throw");
    return environment;
    }

    private static Queue getQueue() throws NamingException {
    return (Queue) ctx.lookup("QueueIncoming");
    }
}

1 个答案:

答案 0 :(得分:4)

  

我认为连接中的本地端口是随机选择的。如果这是错误的,请纠正我。

你是对的。

  

在我们的生产服务器中,由于一些严格的客户策略,我们被要求将本地端口限制为固定端口范围而不是任何随机端口。

您的客户被误导或不明智或服务不良。这样的防火墙规则没有任何好处,在大多数情况下,它在应用程序中无法实现。

  

是否可以通过在JMS客户端代码中指定任何连接工厂属性来执行相同操作。

不是我知道的。您需要向客户介绍出站防火墙规则。它们没有任何有用的安全性或其他目的。如果他认为否则问他什么,以及如何。