Best practices for Foreign Servers

What is Foreign Servers?

Foreign JMS servers can be used as a stand-alone component, similar to messaging bridges. These components  target application servers or clusters directly instead of an intermediary component like a JMS server.

Bridges vs Foreign Server


The JMS messaging bridge does introduce with an extra hop; messages are put into a local destination and then forwarded to the final destination. This is useful when the remote destination is not on highly available JEE container. The bridge will take the messages even when remote destination is not available and then forward them with build-in retry logic when the remote destination becomes available.

If the remote destination is highly available (WebLogic JMS or IBM MQ Series), foreign JMS server is preferable since it directly access the final destination without an extra hop. Mostly preferable for incoming queues on WebLogic 11g and later releases.

Best practices for Foreign Servers


Our best practices were centered around the standard of creating a single JMS Module per cluster (or app server if it wasn't clustered) and then creating both the Foreign server and the weblogic JMS queues/connection factories within the same module.
Also, having good naming conventions for your sub-deployments and JMS Modules

How does Weblogic Foreign Server works with external messaging system?


Configuring Foreign server on JMS Module

Foreign Server feature makes it possible to easily map to remote instances of WebLogic Server in another cluster or domain. so that they appear in the local JNDI tree as a local JMS object. Once the Foreign Provider is configured within Weblogic, for all practical JMS implementations within the code - it can be called as if it was on local JNDI lookup. Weblogic will make the remote calls transparent to your code. This allows you to change your destination via configuration on the Weblogic console or thru WLST.

Working in WLST, We need to connect to the Admin Server because this configuration changes can be done in online mode.
?
1
2
3
4
5
6
7
8
##################################
# FOREIGN JMS MODULE CONFIGURATION
##################################
fsjms_mod_name1 = aFSmod
  
fr_server1 = ForeignServer1
cnfurl1 = file : / path / mq / bindings
initialContextFactory1 = com.sun.jndi.fscontext.RefFSContextFactory



Create JMS Module for Foreign Servers
 With the WebLogic 11g and later releases, Oracle has tried to merge both the internal and foreign JMS under a universal umbrella. However, the target options were kept different. To provide flexibility with the JMS portion, sub-deployments were introduced. Oracle seems to have been extended sub-deployments to Foreign Servers for the sake of consistency, making things quite complicated/messy.
WebLogic Foreign Server - IBM MQ 

Create JMS Foreign Server
This we can configure with the help of three arguments -There must be single JMS Module name per cluster, Multiple definitions of your connection factory will skew the JMS load-balancing.
  1. Connectiony Factory URL
  2. Foreign Server name
  3. Initial Context

Foreign Server MBean
JMS Foreign server is parent MBean with Foreign Connection Factory and Foreign Destination as childs.
Foreign Server MBean tree

The foreign JMS provider can be targeted to a WebLogic Server or a WebLogic Cluster.
Create JMS Foreign Destination
Create JMS Foreign Connection Factory

JMS Foreign Server Destination can be configured with the following details

  • Destination Name
  • Local JNDI
  • RemoteJNDI

The destination properties can be given as follows:

?
1
2
3
4
5
6
###############################################
# FOREIGN JMS DESTINATION CONFIGURATION
###############################################
destname1 = ForeignDestination1
dest_ljndi1 = mq / incoming / response
dest_rjndi1 = MQSRC_TO_WL_JMS1

Similarly Foreign Connection Factory can be defined with the MQ connection factory details
?
1
2
3
4
5
6
###############################################
# FORIEGN JMS CONNECTION FACTORY CONFIGURATION
###############################################
fconf_name1 = ForeignConnectionFactory1
fconf_ljndi1 = MqConnectionFactory
fconf_rjndi1 = REMOTE_JNDI1

create_ForeignServer.py

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
from java.io import File
from java.io import FileOutputStream
from java import io
from java.lang import Exception
from java.lang import Throwable
import os.path
  
import sys
  
def getJMSModulePath(jms_module_name):
         jms_module_path = "/JMSSystemResources/" + jms_module_name + "/JMSResource/" + jms_module_name
         return jms_module_path
  
def createFSJMSModule(jms_module_name,target_name):
         cd( '/' )
         module = create(jms_module_name, "JMSSystemResource" )
         cluster = getMBean( "Clusters/" + cluster_target_name)
         module.addTarget(cluster)
  
def createJMSFS(jms_module_name,cnurl,jms_fs_name,ini_fac):
         jms_module_path = getJMSModulePath(jms_module_name)
         cd(jms_module_path)
         cmo.createForeignServer(jms_fs_name)
         cd(jms_module_path + '/ForeignServers/' + jms_fs_name)
         cmo.setInitialContextFactory(ini_fac)
         cmo.setConnectionURL(cnurl)
         cmo.setDefaultTargetingEnabled( bool ( "true" ))
         cmo.unSet( 'JNDIPropertiesCredentialEncrypted' )
  
def getFSpath(jms_module_name,jms_fs_name):
         jms_module_path = getJMSModulePath(jms_module_name)
         jms_fs_path = jms_module_path + '/ForeignServers/' + jms_fs_name
         return jms_fs_path
  
def createFSdest(jms_module_name,jms_fs_name,jms_dest_name,ljndi,rjndi):
         cd( '/' )
         jms_fs_path = getFSpath(jms_module_name,jms_fs_name)
         cd(jms_fs_path)
         print jms_fs_path
         cmo.createForeignDestination(jms_dest_name)
         jms_fs_path = jms_fs_path + '/ForeignDestinations/' + jms_dest_name
         print jms_fs_path
         cd(jms_fs_path)
         cmo.setLocalJNDIName(ljndi)
         cmo.setRemoteJNDIName(rjndi)
  
def createFSconf(jms_module_name,jms_fs_name,jms_fconf_name,cljndi,crjndi):
         jms_fs_path = getFSpath(jms_module_name,jms_fs_name)
         cd(jms_fs_path)
         cmo.createForeignConnectionFactory(jms_fconf_name)
         cd(jms_fs_path + '/ForeignConnectionFactories/' + jms_fconf_name)
         cmo.setLocalJNDIName(cljndi)
         cmo.setRemoteJNDIName(crjndi)
############## MAIN SCRIPT starts  ##########
envproperty = ""
if ( len (sys.argv) > 1 ):
         envproperty = sys.argv[ 1 ]
else :
     print "Environment Property file not specified"
     sys.exit( 2 )
propInputStream = FileInputStream(envproperty)
configProps = Properties()
configProps.load(propInputStream)
  
adminUser = configProps.get( "adminUser" )
adminPassword = configProps.get( "adminPassword" )
adminURL = configProps.get( "adminURL" )
  
connect(adminUser,adminPassword,adminURL)
  
edit()
startEdit()
  
##############################################
#FOREIGN JMS SERVER CONFIGURATION
##############################################
total_dest = configProps.get( "total_dest" )
total_fconf = configProps.get( "total_fconf" )
 
cluster_target_name = configProps.get( "clusterName" )
  
trg = configProps.get( "ForeignTargetServer" )
fs_mod_name = configProps.get( "fsjms_mod_name" )
createFSJMSModule(fs_mod_name,trg)
  
n = int (tot_fs)
for i in range ( 1 ,n + 1 ):
         fr_server = configProps.get( "fr_server" + str (i))
         cnfurl = configProps.get( "cnfurl" + str (i))
         ini_context = configProps.get( "initialContextFactory" + str (i))
         createJMSFS(fs_mod_name,cnfurl,fr_server,ini_context)
  
         d_name = configProps.get( "destname" + str (i))
         d_ljndi = configProps.get( "dest_ljndi" + str (i))
         d_rjndi = configProps.get( "dest_rjndi" + str (i))
         print d_ljndi, ' == ' , d_rjndi, b
         createFSdest(fs_mod_name,fr_server,d_name,d_ljndi,d_rjndi)
  
         fr_server = configProps.get( "fr_server" + str (i))
         j_conf = configProps.get( "fconf_name" + str (i))
         cn_ljndi = configProps.get( "fconf_ljndi" + str (i))
         cn_rjndi = configProps.get( "fconf_rjndi" + str (i))
         createFSconf(fs_mod_name,fr_server,j_conf,cn_ljndi,cn_rjndi)
  
# ####   MAIN SCRIPT END ########################################
save()
activate(block = "true" )
disconnect()
This script is generic you can add as many foreign server as you wish. You can better use it for receive the message with foreign servers that are having source at remote location.It could be connect to WebLogic JMS or it can connect to third party messaging servers such as MQ series or ActiveMQ etc.You can execute the script as follows:
$ java weblogic.WLST Foreign_jms.py ForeignJms.properties
内容概要:《2024年中国城市低空经济发展指数报告》由36氪研究院发布,指出低空经济作为新质生产力的代表,已成为中国经济新的增长点。报告从发展环境、资金投入、创新能力、基础支撑和发展成效五个维度构建了综合指数评价体系,评估了全国重点城市的低空经济发展状况。北京和深圳在总指数中名列前茅,分别以91.26和84.53的得分领先,展现出强大的资金投入、创新能力和基础支撑。低空经济主要涉及无人机、eVTOL(电动垂直起降飞行器)和直升机等产品,广泛应用于农业、物流、交通、应急救援等领域。政策支持、市场需求和技术进步共同推动了低空经济的快速发展,预计到2026年市场规模将突破万亿元。 适用人群:对低空经济发展感兴趣的政策制定者、投资者、企业和研究人员。 使用场景及目标:①了解低空经济的定义、分类和发展驱动力;②掌握低空经济的主要应用场景和市场规模预测;③评估各城市在低空经济发展中的表现和潜力;④为政策制定、投资决策和企业发展提供参考依据。 其他说明:报告强调了政策监管、产业生态建设和区域融合错位的重要性,提出了加强法律法规建设、人才储备和基础设施建设等建议。低空经济正加速向网络化、智能化、规模化和集聚化方向发展,各地应找准自身比较优势,实现差异化发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值