WebSphere Portal: обновить / удалить войну - PullRequest
0 голосов
/ 11 июля 2011

Мне нужно обновить портлет в WebSphere Portal 6.0.Я пытался использовать xmlaccess.bat.Вот мой DeployPortlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<request
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="PortalConfig_1.4.xsd"
type="update"
create-oids="true">

<portal action="locate">

    <!-- The uid must match uid attribute of portlet-app in portlet.xml. -->
    <web-app action="update" active="true" uid="com.firstlinesoftware.oo.portlet.TestPortlet
       <url>file:///$server_root$/installableApps/TestPortlet.war</url>
       <!-- The uid must match uid attribute of concrete-portlet-app in portlet.xml. -->
       <portlet-app action="update" active="true" uid="TestPortlet">
          <!-- The name attribute must match content of portlet-name subtag  of concrete-portlet in portlet.xml. -->
          <portlet action="update" active="true" objectid="theIbmPortletApiPortlet" name="TestPortlet"/>
        </portlet-app>
    </web-app>

    <!-- Parent element under which the new page is inserted -->
    <content-node action="locate" objectid="parentPage" uniquename="ibm.portal.rational.portlets"/>

    <!-- The new page. 
         The contentparentref attribute must match the objectid of the parent. 
         Change the uniquename attribute to create another page. -->
    <content-node action="update" uniquename="ibm.portal.TestPortletPage"  ordinal="last" content-parentref="parentPage" active="true" allportletsallowed="false" create-type="explicit" type="page">
        <supported-markup markup="html" update="set"/>
        <localedata locale="en"><title>TestPortletPage</title></localedata>

        <component action="update" ordinal="100" type="container" orientation="H">
            <component action="update" ordinal="100" type="control">
                <!-- The portletref must match the objectid attribute of the portlet -->
                <portletinstance action="update" portletref="theIbmPortletApiPortlet"/>
            </component>
        </component>
    </content-node>

</portal>

Когда я впервые использую этот скрипт, все в порядке.Но когда я пытаюсь обновить портлет с помощью этого сценария (везде action="update"), возникает исключение: DuplicateAppException.

Затем я попытался удалить этот портлет с помощью сценария:

<?xml version="1.0" encoding="UTF-8"?>
<request
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="PortalConfig_1.4.xsd"
type="update"
create-oids="true">

<!-- sample for uninstalling a web module -->
<portal action="locate">

    <!-- uid must match uid attribute of portlet-app in portlet.xml -->
   <web-app action="delete" active="true" uid="TestPortlet">
   </web-app>

</portal>
</request>

, но произошло предупреждение: не удалось удалить портлет (такого веб-модуля нет), возможно, это былоудалено ранее.На самом деле этот файл войны развернут (проверил это с помощью консоли администрирования)

Кто-нибудь может мне помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2012

Давайте начнем с конца: причина, по которой ваш action=delete не работает, заключается в том, что вы ссылаетесь на webapp с неверным идентификатором uid. Во время установки вы назначаете ему uid com.firstlinesoftware.oo.portlet.TestPortlet, а во время удаления вы ссылаетесь на TestPortlet. Это не сработает.

Я запрограммировал автоматизированную систему, которая повторно развертывает приложения с портлетами, и она использовалась годами без проблем, поэтому что-то должно быть не так в вашем файле XMLAccess. Давайте работать через это. Можете ли вы начать с полного удаления дочернего элемента portlet-app из элемента web-app? есть ли причина, по которой вам это нужно?

0 голосов
/ 25 июля 2011

Обычно я не делаю это с помощью xmlaccess (не могу сказать, как). Я повторно развертываю приложение с портлетами (war или ear в зависимости от того, как вы его упаковываете), как и любое приложение в WAS. Либо через консоль администратора, либо с помощью wsadmin. Это не должно быть проблемой для вас, потому что регистрация портлетов ведется через повторные развертывания. Вот пример jython-скрипта для развертывания приложения с помощью wsadmin. Работает как автономно, так и кластеризованно (подключается к первичному узлу).

import sys
import time

def wsadminToList(inStr):
        outList=[]
        if (len(inStr)>0 and inStr[0]=='[' and inStr[-1]==']'):
                tmpList = inStr[1:-1].split() #splits space-separated lists,
        else:
                tmpList = inStr.split("\n")   #splits for Windows or Linux
        for item in tmpList:
                item = item.rstrip();         #removes any Windows "\r"
                if (len(item)>0):
                        outList.append(item)
        return outList
#endDef

def installPortalApp(earFileName, appName, cellName, clusterName, installOptions):
  #--------------------------------------------------------------
  # set up globals
  #--------------------------------------------------------------
  global AdminApp
  global AdminControl
  global AdminConfig
  global Help

  installOptions.append('-appname')
  installOptions.append(appName)

  # Should we install on a cluster?
  if len(clusterName) != 0: 
    appServer = 'WebSphere:cell=' + cellName + ',cluster=' + clusterName

    mapModuleOptions = [[ '.*', '.*', appServer ]] 

    # Append additional options
    installOptions.append('-cluster')
    installOptions.append(clusterName)
    AdminApp.install(earFileName, installOptions)
    AdminConfig.save( )

    count = 0

    # This is probably not necessary 
    while not AdminApp.isAppReady(appName) and count < 10:
      count = count + 1
      print 'Waiting for app to be ready ' + count + ' of 10'
      time.sleep(10)
    #endWhile

    clusterId = AdminConfig.getid('/ServerCluster:' + clusterName + '/' )
    print 'clusterId' + clusterId
    clusterMembers = wsadminToList(AdminConfig.list('ClusterMember', clusterId))

    for member in clusterMembers:
      print 'startApplication on member ' + str(member)
      currentServer = AdminConfig.showAttribute(member, 'memberName')
      print 'currentServer ' + currentServer
      currentNodeName = AdminConfig.showAttribute(member, 'nodeName')
      print 'currentNodeName ' + currentNodeName
      query = 'cell=' + cellName + ',node=' + currentNodeName + ',type=ApplicationManager,process=' + currentServer + ',*'
      print 'query ' + query
      appMgr = AdminControl.queryNames(query )
      print appMgr

      Sync1 = AdminControl.completeObjectName('type=NodeSync,node=' + currentNodeName + ',*')
      print 'Sync1 ' + Sync1
      AdminControl.invoke(Sync1, 'sync')
      print 'Node synchronized. Waiting a short while for binary expansion to finish'
      time.sleep(5)
      print 'Starting application'

      AdminControl.invoke(appMgr, "startApplication", appName )
    #endFor
  else:
    appMgr = AdminControl.queryNames("type=ApplicationManager,*" )
    AdminApp.install(earFileName, installOptions)
    AdminConfig.save( )
    AdminControl.invoke(appMgr, "startApplication", appName )
  #endIf   
#endDef

#if (len(sys.argv) != 4 and len(sys.argv) != 5):
#  print len(sys.argv)
#  print "install_application_ear.py: this script requires the following parameters: ear file name, application name, cell name, install options and cluster name (optional)" 
#  sys.exit(1)
#endIf

earFileName = sys.argv[0]
print 'earFileName' + earFileName
appName =  sys.argv[1]
cellName =  sys.argv[2]
installOptions =  eval(sys.argv[3])

clusterName = ""
if len(sys.argv) == 5:
  clusterName =  sys.argv[4]

installPortalApp(earFileName, appName, cellName, clusterName, installOptions)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...