Friday, September 04, 2009

Email blog testing

A testing

 

 

Allan

 

WebSphere Commerce Acceleator customization

Two scenarios of customizing Accelerator


Create a dynamiclist in Accelerator:

1. Update instance.xml to add entry of new resources.xml

locate \WC\xml\config\wc-server.xml, search
<ToolsGeneralConfig DTDPath="tools/common;tools/devtools;tools/bi;tools/catalog;schema/xml;sar" XMLCacheSize="0" XMLPath="tools;tools/devtools;WEB-INF/xml/tools;WEB-INF" developmentMode="false"

you can udpate developmentMode to true, this allows the xml/properties files being refreshed in run time.

Assume we add codes into "custom" folder, then add new line like this:

<resourceConfig file="custom/resources.xml"/>

2. Create resources.xml in \WC\xml\tools\custom location.

the custom must match #1 "custom". sample resources.xml

---


<!DOCTYPE resourceConfig SYSTEM "../common/Resources.dtd">

<!-- Operational Time Tools specific model extensions -->
<resourceConfig >

<resource nameSpace="custom">

<!-- resource bundle file mappings -->

<resourceBundle name="customRB"
bundle="com.ibm.commerce.tools.sears.properties.customRB" />


<!-- XML file mappings -->

<resourceXML name="customXML"
file="custom/customXMLr.xml" />

</resource>

</resourceConfig>

name space is defined as "custom", then the resource bundle can be referenced as custom.customRB.

3. Create menu

Locate this file: WC\xml\tools\common\CommerceAcceleratorMHS.xml

depends on what type of your store, you may have to find the right xml file.

Run "select store_id,storetype from store where store_id=xxx" to find out what store type is.

In eSite, the store type is MHS.

  • B2C = Consumer direct
  • BBB = Basic B2B direct
  • B2B = B2B direct
  • CHS = Channel hub
  • CPS = Catalog asset store
  • RHS = Consumer direct reseller store
  • BRH = B2B reseller store
  • RPS = Consumer direct reseller storefront asset store
  • BRP = B2B reseller storefront asset store
  • DPS = Distributor asset store
  • DPX = Distributor proxy store
  • SCP = Supplier hub
  • SPS = Supplier asset store
  • SHS = Supplier hosted store
  • HCP = Hosting hub
  • PBS = Store directory
  • MHS = Consumer direct hosted store
  • BMH = B2B hosted store
  • MPS = Consumer direct hosted storefront asset store
  • BMP = B2B hosted storefront asset store.

Open above xml file, follow the existing pattern, create the menu / node accordingly.

Notice "users" define the user access control.

In this example, we create a new sub menu called "process pending order" under "Operation" menu.

search for " <menuitem name="operations" " , and <node name="separator" url=""/>

under this separator, we create a new node, add below codes:

------------

<node name="pendOrder"
url="$webapp_accelerator$NewDynamicListView?ActionXMLFile=custom.customXML&cmd=CustomLandingView"
users="cusRep cusSup opMgr seller"/>


<node name="separator"
url=""/>
----------------

where name="pendOrder", you need register this name in properties: WC\properties\com\ibm\commerce\tools\properties\mccNLS.properties . at the end of file, add:

" pendOrder = process the pending order. "

this will be showing in the Accelerator as node name. Add locale properties as needed.

url , is the URL when you click on this sub menu (node). This URL will open a dynamic list view, which contents are displaying with the result of view: CustomLandingView. we will create this view later.

users is the access control of the list of allowed users

4. resourceXML file (customXML.xml)

in #2, the resource config file define resourceXML, "custom/customXML.xml",

create this file at WC\xml\tools\custom\resourceXML

The resourceXML defines a type of panel, like dynamci list, wizard, dialog, etc. Base on what panel you requried, create related xml files.

<!DOCTYPE action SYSTEM "../common/List.dtd"> will determine the type by the dtd. The dtd files can be found in WC\xml\tools\common folder.

in #3, it defines the url of the button to "NewDynamicListView?ActionXMLFile=custom.customXML", the page will load the dynamic view, then render the page/buttons base on the ActionXMLFile (custom.customXML).

sample:

--------

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE action SYSTEM "../common/List.dtd">

<action resourceBundle="custom.customRB"
formName="csrPendOrderForm">

<parameter listsize="10"
startindex="0"
ActionXMLFile="custom.customXML"
resultssize="0"
/>
<scrollcontrol title="theTitle"
display="false" />

<controlpanel display="true" />

<button>
<menu name="findPendOrders"
action="basefrm.findPendingOrders()"
users="cusRep cusSup opMgr seller siteAdmin" />
<menu name="print"
action="basefrm.print()"
users="cusRep cusSup opMgr seller siteAdmin" />
<menu name="markProcessed"
action="basefrm.markProcessed()"
users="cusRep cusSup opMgr seller siteAdmin" />
</button>

<jsFile arc="/wcs/javascript/tools/common/Util.js" />
<jsFile arc="/wcs/javascript/tools/common/DateUtil.js" />
</action>

------

where resourceBundle="custom.customRB" defines the resourcebundle created in next #4.

ActionXMLFile="custom.customXML" points to the resourcesXML,

scrollControl display="false" actually turnning off the scroll control

<button> section defines all the buttons.

name is the propeties key of button name, properites is the custom.customRB points to.(#4)

action = define the javascript associate with this button, use "basefrm.xxx()" . basefrm is system default. the function will be created inside the jsp files or js files whichever uses this xml as resource xml.

again, users defines the access control.

the jsFile are mandatory.

5. Create properties (customRB)

create customRB.properties (locale properites if needed) in folder WC\properties\com\ibm\commerce\tools\custom\properties\

inside the properties, you need define all the keys that you are going to use for buttons/links, etc

6. Create tools controller command and view

the jsp can be created in

CommerceAccelerator\tools\custom

add into \WEB-INF\struts-config-migrate.xml for the view/URL entries. (CustomLandingView)

insdie the jsp file, which will be shown in the main content of the dynamic list, you need add :

//Mandatory:

<%@include file="../common/common.jsp"%>

<%

CommandContext cmdContextLocale = (CommandContext) request.getAttribute(ECConstants.EC_COMMANDCONTEXT);
Locale jLocale = cmdContextLocale.getLocale();
Integer langId = cmdContextLocale.getLanguageId();
Integer storeId = cmdContextLocale.getStoreId();
String currency = cmdContextLocale.getCurrency();

//use below to load your properties file. Hashtable pendOrderRB = (Hashtable) ResourceDirectory.lookup("custom.customXML", jLocale);
%>

<head>
<SCRIPT SRC="/wcs/javascript/tools/common/dynamiclist.js"></SCRIPT>
<SCRIPT SRC="/wcs/javascript/tools/common/Util.js"></SCRIPT>
<script language="JavaScript">

function onLoad () {

// This will load the frames parent.loadFrames();
}

function findPendingOrders(){
// CustomCommandURL' is the ToolsCommandController returns a redirect URL to show in currect content.

// the returned view must define simliar to this file style to loadFrames,

top.setContent('<%=UIUtil.toJavaScript((String) pendOrderRB.get("report"))%>','/webapp/wcs/tools/servlet/NewDynamicListView?ActionXMLFile=custom.customXML&cmd=CustomCommandURL',false)
}


function print() {

window.focus();
top.print();
}

<body onLoad="onLoad()">

<!--your layout -->

</body>

<script>
// This will render the buttons// Mandatory parent.afterLoads(); </script>

</html>

You can use JSTL tag lib in your jsp files.

Add “list All Address” function under Operation/Customer/Address button

1. Locating the modification place

1.1. Find the resourceXML. Locate CommerceAcceleratorMHS.xml , Operations ->find customer, get URL, find XMLFile=csr.shopperSearchB2C. From this we know the name space is “csr”.

<node name="findCustomers"

url="$webapp_accelerator$DialogView?XMLFile=csr.shopperSearchB2C"

users="cusRep cusSup opMgr seller"/>

1.2. Open WC\xml\tools\csr\resources.xml (notice the namespace csr) . Locate shopperSearchB2C (we get from 2 steps before), find

<resourceXML name="shopperSearchB2C" file="csr/ShopperSearchDialogB2C.xml" />

csr/ShopperSearchDialogB2C.xml is located under wc\xml\tools\

Inside this xml, located the “search” panel. Because we know at Accelerator, you have to click search button to go in the panel that we are going to modify. Check its URL, which is ShopperSearchB2C.

· Open struts-config.xml, locate this link ShopperSearchB2C. path="/tools/csr/ShopperSearchB2C.jsp">

· Open this file under CommerceAccelerator\WebContent\tools\csr

· Inside the file, you will find :

var url = "/webapp/wcs/tools/servlet/NewDynamicListView";

var urlPara = new Object();

urlPara.ActionXMLFile='csr.shopperListB2C';

urlPara.cmd='ShopperListB2C';

· From this we learn: it opens a dynamicList, using resourceXML csr.shopperListB2C, and command to call is ShopperListB2C.

Now, open open the xml base on “csr.shopperListB2C” .

· Now open resources.xml file again, find csr.shopperListB2C.

<resourceXML name="shopperListB2C"

file="csr/ShoppersActionsB2C.xml" />

Open struts-config.xml file again, locate URL “ShopperListB2C”,

find name="ShopperListB2C" path="/tools/csr/ShopperListB2C.jsp">

· Now open resource xml ShoppersActionsB2C.xml at wc\xml\tools\csr, locate button “change”, find its action = “basefrm.changeCustomerInfo()”.

At ShopperListB2C.jsp find the javascript function changeCustomerInfo() definition.

function changeCustomerInfo(id) {

if (id == null && parent.buttons.buttonForm.changeButton.className=='disabled') {

return;

}

if (id == null) {

id = parent.getSelected();

}

debugAlert(id);

// The following url will not contains NLS data

top.setContent(getNotebookTitle(), '/webapp/wcs/tools/servlet/NotebookView?XMLFile=csr.shopperNotebook&shrfnbr='+id+'&locale=<%=cmdContext.getLocale().toString()%>',true);

return;

}

The top.setContent() is where to render the page.

It is opening a notebook, with resourceXML called “csr.shopperNotebook”, not we need use resources.xml file again to locate this resource xml file.

<resourceXML name="shopperNotebook"

file="csr/ShopperGetProperties.xml" /&gt;

2. Modification:

2.1. Now, finally, at this “ShopperGetProperties.xml” we will find the panel definition where we are going to edit.

Between

<panel name="Address"

url="PropertyAddressView"

parameters="shrfnbr,locale"

helpKey="MC.optoolsCSR.shopperGetPropertiesAddressPanel.Help" />

<panel name="Contact"

url="PropertyContactView"

parameters="shrfnbr,locale"

helpKey="MC.optoolsCSR.shopperGetPropertiesContactPanel.Help" />

add

<panel name="listAllAddress"

url="ListAllAddressView"

parameters="shrfnbr,locale"

helpKey=" " />

this will add a button between Address and Contact.

2.2. Add custom properties

Open resource bundle by looking for ShopperActionB2C.xml, resourceBundle=”csr.userNLS”, to open

WC\properties\com\ibm\commerce\tools\csr\properties\userNLS.properties

Add:

listAllAddress = All Addresses

this will display as the button label.

2.3. Create a new view ListAllAddressView by creaeting jsp CommerceAccelerator\WebContent\tools\Sears\ListAllAddressDisplay.jsp

And define in struts-config-ext.xml

<forward className="com.ibm.commerce.struts.ECActionForward" name="ListAllAddressView" path="/tools/Sears/ListAllAddressDisplay.jsp">

<set-property property="resourceClassName" value="com.ibm.commerce.tools.command.ToolsForwardViewCommandImpl"/>

</forward>

<action path="/ListAllAddressView" type="com.ibm.commerce.struts.BaseAction">

<set-property property="https" value="0:1"/>

</action>

Create Access Control for the new view

insert into acaction (acaction_id, action) values ((SELECT MAX(acaction_id) + 1 from acaction), 'ListAllAddressView');

insert into acactactgp (acactgrp_id, acaction_id) values ((select acactgrp_id from acactgrp where groupname='CustomerServiceRepresentativeViews'),(select acaction_id from acaction where action='ListAllAddressView'));

Thursday, January 08, 2009

javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 25

Properties props = new Properties();
props.setProperty("mail.host",smtpHost);
props.setProperty("mail.smtp.host", smtpHost);
Session session = Session.getDefaultInstance(props, null);


The default mail session instance is sharable across the server.

If the session is not initialized, a new session instance will be created with the properties passing in.

However, if an instance does exist, it will be returned. The passing properties will be ignored.


If there are two separate applications running in the same App server, the default session will be shared.

Be careful of your session is initialized by the other application first, and cause your passing properties become useless.

To avoid this, try use:

Session session = Session.getInstance(props, null);


or, another way, to call the smtp server explicitly:

Transport trans = session.getTransport("smtp");
trans.connect(smtpHost,-1,null,null);
trans.sendMessage(msg,msg.getAllRecipients());
trans.close();

Thursday, January 31, 2008

JODE decompiler for Eclipse

Installation

Go to Help -> Software Updates -> Find and Install. Select the “Search for new features to install” option. Press the “New Remote Site…” button and enter “Technoetic” for the name and “http://www.technoetic.com/eclipse/update” for the URL. Press OK, and install the Jode plugin from the subsequent list of features.

Thursday, December 20, 2007

Java Util Logging in WebSphere Application Server

Use Java Util Logging in WebSphere Application Server


1. Create a Logger
Logger.getLogger("LoggerName");

Once this function is called, the logger is initialized.

2. logger name choosen

Generally, use package to generate the logger.
For large application, it is better to create in group or component.

such as com.package.COMMAND, com.package.USER, com.package.INVENTORY, com.package.ORDERS.
3. Level
For logging, use error or warning level.
For tracing, use fine, finner.

4. Handler
Do not need specify the handler explicitly. Leave WAS server to handle it.

5. Initialization
Here is the key point and the beauty of WAS.
At server startup, use Servlet initialization method to initialize all the loggers.
This will allow you to view all the logger components at WAS admin console.
Therefore, you have the full ability to control to turn on /off on specific tracing component.

6. Turn on/off tracing component
For the large application, you can always turn on/off tracing at run time without restarting the servers.
At WAS admin console, you can view the tracing components.
Use Runtime tab to turn it on/off for quick problem determination.

Monday, October 15, 2007

Configure Tomcat - Server.xml

<Context path="/testing" docBase="D:/temp/temp/mypath" reloadable="true"></Context>
<Context path="/test" docBase="E:/workspace/soft/myproject/WebContent" reloadable="true"></Context>

</Host>


</Engine>


</Service>


</Server>

Tuesday, August 14, 2007

Compose an email

Send an email:
Refer to infocenter : "Examples: Outbound messaging system interface".

To compose a jsp file, you need add to VIEWREG table.
Notice that, the deviceId is not -1, it should be the one used for email message. such as -3. Check database for detail.
Also, the interfacename and classname are different as regular viewreg.

Example to insert a new view:
-----------------------------
insert into viewreg (
VIEWNAME, DEVICEFMT_ID, STOREENT_ID, INTERFACENAME, CLASSNAME, PROPERTIES)values(
'OrderErrorNotificationView',-3, 0, 'com.ibm.commerce.messaging.viewcommands.MessagingViewCommand',
'com.ibm.commerce.messaging.viewcommands.MessagingViewCommandImpl', 'docname=OrderErrorNotification.jsp&storeDir=no')

Saturday, May 12, 2007

Tuesday, April 10, 2007

Hashtable to iterator

Hashtable aTable = new Hashtable();
Set set = aTable.entrySet();
Iterator it = set.iterator();
while(it.hasNext()){
java.util.Map.Entry e = (java.util.Map.Entry) it.next();
String key = e.getKey();
String value = e.getValue();
}

Tuesday, March 13, 2007

BigDecimal error:

As API indicates, it is "immutable".
If you do following, it is wrong:

BigDecimal a = new BigDecimal("0");
BigDecimal b = new BigDecimal("1");
a.add(b); // wrong

a will not be changed.

Notice that add() method return BigDecimal object, which value is "this+val",
then this should be:
a = a.add(b);

Wednesday, February 21, 2007

What are inside "Message mappers" in WCS 561?

Snapshot of runtime object contents:

CommandContext
|_ adapter
|_ commandProperties - CommandProperty // Contains all properties
|_ sessionContext - CredentialsSpecifiedProgramAdapterSessionContextImpl
|_ commanProperty - CommandProperty // same as above commandProperties


commandProperties and commandProperty are pointing to same object, which contains:
-commandName
-executionProperties (Contains properties where their attributes are specified as 'FieldInfo=CONTROL'
in template file)
-requestProperties (same as getRequestProperties())


From infocenter, it says:
"Control
The name-value pair will be put into a "messageProperty" which contains control information
for the command, such as USERID or PASSWORD
"
I guess, here should be executionProperties instead of messageProperty

=================================================================
Quote from infocenter:
FieldInfo
Indicate the TypedProperty into which the name value pair should be placed. Data is the default.
If you want to put the name value pair into more than one TypedProperty, you must specify more
than one of the values listed below, separated by a comma:

Data
The name-value pair will be put into the a commandProperty object which contains arguments
for the command.
Control
The name-value pair will be put into a messageProperty which contains control information
for the command, such as USERID or PASSWORD
Command
The name-value pair is used to determine which command should be called. The generated
name-value pairs are used in the CommandMapping element of the TemplateDocument element.

Friday, February 16, 2007

XML over HTTP at WCS

XML over HTTP at WCS

WebSphere Commerce can receive inbound XML messages over HTTP.
From info center, it says:
---
The following steps illustrate the overall flow of an XML over HTTP request:

1. An external system sends an XML message to WebSphere Commerce over HTTP for example, http://host_name/webapp/wcs/stores/servlet/.
2. The request is mapped to the Program Adapter.
3. The Program Adapter passes the XML request to the appropriate message mapper.
4. The message mapper converts the XML request into a CommandProperty object and passes it back to the Program Adapter.
5. The Program Adapter prepares the command for execution and passes it to the WebController for execution.
6. The Program Adapter generates the proper XML response and returns the XML response to the external system that made the request.
---

So, how to create the request?

1. Use Java stand alone class to use socket function.
Here is my focus,if you want to send request through SSL channel, then you can initialize the socket with port 8000.
You have to establish the connection by creating the socket with port 80 first,
then, specify the port name following the HOST at header:

Example for header:

POST /webapp/wcs/tools/servlet HTTP/1.1
Host: hostname:8000
Content-Type: text/xml
Content-Length: 507

<?xml version="1.0" encoding="UTF-8"?>CONTENT...




2. Ajax solution
Seems fancy, but ...
Because Ajax does not support cross domain request,
it loses the point to use it. Why do we need a internal request (XMLHttpRequest)?

However, it seems the performance is better than socket.

Monday, February 12, 2007

The project was not built due to "Problems encountered while deleting resources."

Delete all the .class files of the project and refresh, to do a clean build .

Monday, January 29, 2007

JSTL date format

if I have a time in String format, and would like to output by using JSTL;
then this is what to do:

First, parse String to Date type:

<fmt:parseDate value="${someDateString}" pattern="yyyy-MM-dd HH:mm:SS" var="expireDate"></fmt:parseDate>

Second, output it with fmt:formatDate:
<fmt:formatDate value="${expireDate}" pattern="yyyy-MM-dd" />

The specified formatting pattern must use the pattern syntax specified by java.text.SimpleDateFormat.

Examples



The following examples show how date and time patterns are interpreted in
the U.S. locale. The given date and time are 2001-07-04 12:08:56 local time
in the U.S. Pacific Time time zone.












Date and Time Pattern
Result
"yyyy.MM.dd G 'at' HH:mm:ss z"

2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"
Wed, Jul 4, '01
"h:mm a"
12:08 PM

"hh 'o''clock' a, zzzz"
12 o'clock PM, Pacific Daylight Time
"K:mm a, z"
0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"
02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"
Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ"

010704120856-0700

Thursday, December 07, 2006

Scheduler job

To create a scheduler job under site level, just associate this job with "RunAlways",
example of association:
|SCHCMD_ID | CHKCMD_ID | CHKCMD.DISPLAYNAME | PATHINFO |
|-1 | -1 | RunAlways | ReturnCreditAndCloseScan |
|-2 | 12 | CheckReleaseToFulfillment | ReleaseToFulfillment |
|-3 | 13 | CheckRAReallocate | RAReallocate |
|-4 | 14 | CheckReleaseExpiredAllocations | ReleaseExpiredAllocations |
|-5 | 15 | CheckProcessBackorders | ProcessBackorders |
|-6 | -1 | RunAlways | BalancePayment |
|-7 | -1 | RunAlways | PayCleanup |
|-8 | -1 | RunAlways | PaymentSummaryGenerate |
|-9 | -1 | RunAlways | SendEmailActivity |
|-10 | -1 | RunAlways | CheckForBouncedEmail |
|-11 | -1 | RunAlways | RetryBouncedEmail |
|-12 | -1 | RunAlways | NotifyOnOrderProcessFailure |


Those not associate with -1, are store level jobs. There are checking commands to filter the jobs.

example to add a new scheduler at site level,

"
INSERT INTO SCHCMD (SCHCMD_ID,STOREENT_ID,PATHINFO) VALUES( (select min (schcmd_id)-1 from schcmd),0,'URL_COMMAND');

INSERT INTO CHKARRANG(CHKCMD_ID,SCHCMD_ID) VALUES(-1,(SELECT SCHCMD_ID FROM SCHCMD WHERE PATHINFO='URL_COMMAND'));
"

Sunday, November 12, 2006

Access control

How to create a new set of access control:
1. Create a new role. At orgadminconsole page, create a new role. The role name can be any string.
2. Create a new user, or choose existing user, to set this role. Then this user will have this role's access right.
3. Create a new access group if it doesnot exist.
Use default user access group policy xml file to create a new one. Do a query to find out the access group Id first, to ensure there is no conflict with current group.

At orgadminconsole, set this access group with the created role above.

4. Create a new access control policy xml file. The default access control xml can be a good template.
5. Load policies.
6. At orgadminconsole, subscribe the new policy for this organization or parent org.
7. At adminconsole, refresh registry to active the changes.

Adding payment methods in WC

Adding the payment method through POLICY table:
Add new policy for the new payment method in POLICY,
add new DoPaymentPolicyCmd,
ProcessOrder will invoke DoPaymentCmd,
DoPaymentCmd will invoke DoPaymentPolicyCmd,
for differnt policy, different impl will be invoked (by registering cmd class at POLICYCMD table).

you can implement your own policy cmd,customized code in DoPaymentPolicyCmd.
for each payment method, you can create a policycmd impl for it.

Need modify this to detail later.

Saturday, November 04, 2006

RSS feed

First thought building RSS is the complicated work.
After a little work on it, I found that it is pretty simple and cool.

1. All about XML
RSS feed is a XML file. Anyone can simply write a XML file in RSS standard, it will become a feed.

2. Choose a RSS version.
There are many different version. Still need time to merge different standards.
Anyway, RSS 2.0 is a simple one and easy to understand.

3. Create a RSS feed
Use any tool to generate a xml file like:

<rss version="2.0">

    <channel>
        <title>Allan's Blogger</title>
        <link>http://allanxu.blogspot.com
        <description>Allan's blogger feed </description>
        <language>en-ca</language>
        <image>
            <title>Logo</title>  
            <url>http://my.com/logo.gif</url>
            <link>http://allanxu.blogspot.com</link>
        </image>

        <item>
             <title>Hello world</title>  
            <link>http://allanxu.blogspot.com</link>
            <description> Hello ! </description>
        </item>

    </channel>
</rss>

If you need value pairs inside the URL link, use escape characters. like & to replace "&". Otherwise, most feed reader wont parse it properly.

4. Publish
Deploy your page on your server. Well, yes, we need a server.
Record the link.

5. Test
Download a few RSS readers, to add your RSS feed link.
Or use IE/Firefox to open it.
Note: Firefox 2.0 has the function to render the RSS.
IE/Firefox 1.x only display the xml content.
To solve this problem, we can define a xsl to translate it. Or just open any other RSS feed, and copy their xsl link, if there is any.

Thursday, November 02, 2006

Caching tips

Caching

1. Installing cachemonitor:

For cluster env, create one virtual host with more ports depends on how many app servers you have.
For each app server, at web container transport chains, define a new chain to associate the given port.
Then, each port monitor each app server.

Install dynache monitor .ear file from InstallableApp folder, accept default settings.
Map modules to application servers: Select both cluster and web server.

Re-generate plugin-cfg.xml file, and propagate it.
Restart the web server.

http(s)://<hostname>:<portN>/cachemonitor

2. cachespec.xml
For caching jsp, if there is no any Id to put in cache-in section,
use :

<class>servlet</class>
<name>com.ibm.commerce.server.RequestServlet.class</name>
<property name="save-attributes">false</property>
<property name="store-cookies">false</property>
<cache-id>
<component id="" type="pathinfo">
<required>true</required>
<value>/MY_VIEW_COMMAND</value>
</component>

Frist testing

I thought I might need a place to store my development tips, experience ...
Now, here it is.